Я хотел бы предложить следующий подход - для нахождения кратчайших путей в графе с помощью map-reduce.
Давайте начнем с крошечного примера, что приведет к интуиции относительно дальнейшей реализации алгоритма.
Представьте, что информация о графике хранится в виде списков смежности (с полезной нагрузкой, представляющей пути между соответствующими узлами). Например:
A -> [ {B, "A-B"}, {C, "A-C"}, {D, "A-D"} ]
Из приведенного примера - мы можем «вывести» информацию о следующих соединениях в графике:
1) Прямые соединения
A -> B
(путь: "A-B"
) A -> C
(путь: "A-C"
) A -> D
(путь: "A-D"
]) 2) Транзитивные соединения через узел A
B -> C
(путь: "B-A-C"
) (где path("B -> C") == reverse(path("A -> B")) + path("A -> C")
) C -> B
(путь: "C-A-B"
) C -> D
(путь: "C-A-D"
) D -> C
(путь: "D-A-C"
) D -> B
(путь: "D-A-B"
) B -> D
(путь: "B-A-D"
) Другими словами: мы просто «отображает» одну запись списка смежности - нескольким парам доступных друг другу узлов (для всех сгенерированных пар - существует путь).
Каждая пара узлов фактически представляет собой соединение: Source -> Target
.
Итак, теперь мы можем объединить все пары, которые имеют один и тот же исходный узел:
Source -> [{Target 1, "Path-to-Target-1"}, {Target 2, "Path-to-target-2"}, ...]
Собственно, после комбинации - каждый источник будет связанный со списком целевых узлов: список может содержать дублированные целевые узлы ( дублированные целевые узлы, просто соответствуют различным возможным путям).
Итак, нам просто нужно удалить дубликаты из списка целевых узлов (чтобы сохранить только те целевые узлы, которые соответствуют самым коротким путям).
Два абзаца сверху - фактически описывает этап уменьшения. Результат шага уменьшения - это то же самое, что и вход для шага карты.
Итак, наконец - просто повторите эти шаги уменьшения карты до сходимости.
Вы можете использовать ListView и создавать любую структуру с использованием карт UiKit или материального дизайна.
Виджет ListView используется для отображения данных от поставщика данных. Каждая модель данных создается с использованием указанного файла представления. Поскольку он предоставляет такие функции, как разбиение на страницы, сортировка и фильтрация из коробки, удобно отображать информацию конечному пользователю и создавать данные, управляющие пользовательским интерфейсом.
Типичное использование выглядит следующим образом :
use yii\widgets\ListView; use yii\data\ActiveDataProvider; echo ListView::widget([ 'dataProvider' => $dataProvider, 'itemView' => '_ui-card', 'viewParams' => [ 'fullView' => true, 'context' => 'main-page', ], ]);
Файл представления
_ui-card
может содержать следующую базовую карту html:<?php use yii\helpers\Html; use yii\helpers\HtmlPurifier; ?> <div class="uk-card"> <div class="uk-card-header"> <h3 class="uk-card-title"><?= Html::encode ( $model->title ) ?></h3> </div> <div class="uk-card-body"><img src="<?= Html::encode ( $model->image ) ?>"><?= Html::encode ( $model->link ) ?></div> <div class="uk-card-footer"></div> </div>
Таким образом вы можете показать каждый проект как отдельную карту, используя файл вида , Надеюсь, это поможет
$layout
для их настройки, см. здесь yiiframework.com/doc/api/2.0/… – Muhammad Omer Aslam 14 July 2018 в 13:04