![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| xber9 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 21.1.2007 Репутация: нет Всего: нет |
народ привет
не знаю насколько вопрос подходит теме (если что перенесет) и так есть граф описывающий метрополитен Москвы и функция которая ищет минимальный путь от а до б
я понимаю что эта функция ищет минимальное расстояние в зависимости от количества пройденных точек но мне нужно чтобы она искала ни минимальный путь, а путь с минимумом пересадок с ветки на ветку я вижу это так, что сначала мне надо получить все возможные пути из А в Б а потом их проверять на наличие пересадок как проверять я себе тоже представляю (сделать массив с пересадками и проверять соответствия ) но как заставить мою функцию вернуть все возможные пути я не знаю помогите изменить функцию чтобы она возвращала все возможные пути от А в Б заранее спасибо |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
если опишешь, как в настоящий момент находишь минимальный путь(название алгоритма, или словесное описание), перенесу в раздел "Алгоритмы"
|
|||
|
||||
| xber9 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 21.1.2007 Репутация: нет Всего: нет |
Алгоритмы можно вкратце описать так: для вершины, которую мы еще не посетили, нужно отыскать все еще не посещенные смежные вершины и повторить поиск для них
то есть поиск в глубину |
|||
|
||||
| skyboy |
|
||||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
тебе надо кастомизировать алгоритм добавлением весов.
то есть, вместо
использовать
а path_length для станции на той же ветке добавляет +1, а для станции другой ветки(пересадка) — скажем, +3. |
||||
|
|||||
| xber9 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 21.1.2007 Репутация: нет Всего: нет |
||||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
||||
|
||||
| xber9 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 21.1.2007 Репутация: нет Всего: нет |
||||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 1 Всего: 260 |
во-первых, тебе нужно решить, какой вес будет у пересадки. то есть, начиная с какого количества "проехать лишние N станция без пересадок" предпочтительнее, чем совершить одну пересадку и не ехать эти самые N станций. во-вторых, count($newpath) — это простейший алгоритм рассчета "длины пути" — каждая станция считается за единицу. чем больше станций — тем больше сумма — тем больше длина. я ж предлагаю вместо count использовать самописную функцию, которая для заданного списка станций будет увеличивать значение длины пути на 1 для каждой станции, кроме пересадочных. А для станций пересадки — увеличивать сразу на N. |
|||
|
||||
| xber9 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 21.1.2007 Репутация: нет Всего: нет |
то есть мне надо сделать массив в котором будут все id станций с которых можно сделать пересадку "самописная" функция принимает в себя массив точек и для каждой из них проверяет принадлежит ли она массиву пересадок если принадлежит то возвращаемое значение увеличивается на какое то большое число если нет то увеличивается на 1 я правельно понимаю или что то не так |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
у тебя списки смежности. все реализуемо. Добавлено через 1 минуту и 18 секунд если задача требует, можно и по-другому приготовить, не правда ли? хотя в данном случае и так пойдет Добавлено через 5 минут и 23 секунды поглядел, вижу что не прав. но все равно реализуемо. требуемая для dfs и bfs информационная операция на графе всего лишь одна - для данного узла получить список узлов, в которые ведут исходящие ребра. |
|||
|
||||
| xber9 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 21.1.2007 Репутация: нет Всего: нет |
||||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
изучать калькулятор времени нет, поэтому будем считать в столбик. xber9, не решишь эту задачу поиском в глубину. поглядел еще раз, опять вижу списки смежности. вчера мозг устал. так вот, переделывать в матрицу необходимости нет. |
|||
|
||||
| xber9 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 21.1.2007 Репутация: нет Всего: нет |
смотрел вчера на вики реализацию на псевдокоде но моих мозгов не хватает чтобы понять как это померкнуть на php и использовать свои списки (нашел 1 реализацию на javasctript которую можно на php перекинуть но там матрица так что я в тупике увы Это сообщение отредактировал(а) xber9 - 2.11.2012, 14:35 |
|||
|
||||
| xber9 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 21.1.2007 Репутация: нет Всего: нет |
вот та самая функция переведенная на пхп
а как ее для моих данных адаптировать?
Это сообщение отредактировал(а) xber9 - 2.11.2012, 15:47 |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: нет Всего: 137 |
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Для профи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |