Алгоритм поиска лучших маршрутов раздачи еды в игре

Я разрабатываю градостроительную игру и столкнулся с проблемой.

Представьте себе игровую механику Caesar III Sierra: у вас много городских районов с одним рынком в каждом. На расстоянии есть несколько зернохранилищ, связанных ориентированным взвешенным графом. Отличие: люди (здесь автомобили) — единицы, образующие пробки (здесь идет график весов).

Примечание: в серии игр Ceasar люди собирали еду и складывали ее в несколько больших зернохранилищ, тогда как многие рынки (небольшие магазины) брали еду из зернохранилищ и доставляли ее горожанам.

Задача: сообщить каждому району, откуда они должны получать еду, при этом занимая минимум времени и сводя к минимуму заторы на дорогах города.

Пример карты

Пример графической диаграммы

Предположим, что желтым районам нужно 7, 7 и 4 яблока соответственно. В голубоватых амбарах соответственно 7 и 11 яблок.

Предположим, что веса ребер пропорциональны их длине. Тогда решение должно быть похоже на серые цифры, указанные по краям. Например, первый район получает 4 яблока из 1-го и 3 яблока из 2-го амбара, а последний район получает 4 яблока только из 2-го амбара.

Здесь сначала максимально заняты вертикальные дороги, а затем оставшиеся рабочие отправляются на диагональные пути.

Вопрос

Какой практичный и очень быстрый алгоритм я должен использовать? Я просматривал некоторые статьи (Игры с перегрузками: оптимизация в условиях конкуренции и т. д.), описывающие игры с перегрузками, но не мог понять общей картины.


person TautrimasPajarskas    schedule 10.05.2010    source источник
comment
Если интересная работа по добыче еды с минимальным трафиком решается ИИ, значит ли это, что роль игрока заключается только в расширении дорог?   -  person Amy B    schedule 10.05.2010
comment
Игра представляет собой смесь жанров Transport Tycoon и городского строительства. Дело в том, что горожане живут своей собственной жизнью, здесь буквально тысячи автомобилей, и ваша задача — решить головоломку по расширению дорог, строительству альтернативных шоссе и т. д. Я чувствую, что это может быть весело с первых прототипов.   -  person TautrimasPajarskas    schedule 10.05.2010
comment
Это, безусловно, выглядит так, как будто это может быть весело, и, вероятно, это будет решено раньше (в частности, я думаю о серии SimCity). Удачи.   -  person Matthieu M.    schedule 11.05.2010
comment
@Матье М., спасибо! На самом деле, я пытаюсь максимально уйти от SimCity и Cities XL, только взяв от них самое лучшее. Посмотрим, удастся ли мне придумать новый взгляд на управление городской жизнью.   -  person TautrimasPajarskas    schedule 11.05.2010


Ответы (6)


Вы хотите изучить проблему Max-flow. Похоже, в данном случае это двудольный граф, что должно упростить визуализацию.

person Larry    schedule 10.05.2010

Это проблема максимального потока с несколькими источниками, которая может легко преобразовать в простую задачу о максимальном потоке, создав суперисточник и суперприемник, как описано в ссылке. Существует много эффективных решений проблем максимального потока.

person mathmike    schedule 10.05.2010

Одна вещь, которую вы могли бы сделать, чтобы решить проблему добавочного обновления, обсуждаемую в другом ответе, и которая также может быть дешевле для компьютера, — это забыть о глобально оптимальном решении. Пусть каждый житель поучаствует в чем-то вроде оптимизации муравьиной колонии.

Подумайте о том, чтобы не допустить, чтобы люди в правом нижнем желтом узле в вашем примере вытеснили тех, кто находится в крайнем правом желтом узле, позволив людям в крайнем правом желтом узле повышать «цену» покупая ресурсы из правого синего узла, что побудило бы некоторых из тех, кто из нижнего правого желтого узла, пройти чуть более длинный путь к левому синему узлу.

person Doug McClean    schedule 10.05.2010
comment
+1 это ближе к модели людей, открывающих дороги, и легко добавлять причуды (моделирование привлекательности новых дорог, например, путем добавления феромонов), и, конечно же, адаптация в реальном времени, позволяющая непрерывно развиваться, тоже великолепна. - person Matthieu M.; 11.05.2010

Я согласен с Ларри и Матмайком, кажется, что эта проблема является специализацией сетевого потока.

С другой стороны, проблема может стать проще, если ваш окончательный алгоритм найдет остовное дерево для каждого рынка к его ресурсам (амбарам), жадно потребляет эти ресурсы, сначала основываясь на кратчайшем пути, а затем переходит к следующей стопке ресурсов.

Это может помочь подумать об этом с точки зрения использования дороги в первую очередь с максимальной пропускной способностью (максимизация эффективности дороги), а не пытаться свести к минимуму заторы.

В этом корень проблемы — в общем, в задачах с графами легче найти близкие к оптимальным решения, а с точки зрения разработки игр близкое к оптимальному, вероятно, достаточно хорошо.

Изменить: хотелось бы также отметить, что ссылка mathmike на Википедию также говорит о проблеме максимального потока с пропускной способностью вершин где каждую из ваших амбаров можно рассматривать как вершины с конечной вместимостью.

person reshen    schedule 10.05.2010
comment
Очень-очень хорошая идея о Vertex Capacities. Спасибо. Я просто хотел спросить, как жадное поведение поможет общему трафику? Если каждый район посылает толпы рабочих за едой из одного общего соседнего амбара, то он моментально опустеет, а оставшиеся толпы будут бродить вокруг, вместо того, чтобы брать еду где-то еще. А если я перенаправлю все массы в оставшийся амбар, бардака будет еще больше. - person TautrimasPajarskas; 11.05.2010
comment
Я не верю, что жадное поведение поможет общему трафику. Я пытался понять, что довольно простой алгоритм для реализации будет следующим: 1. Произвольно выбрать район 2. Пусть этот район рассчитает свое остовное дерево с ближайшими зернохранилищами, в которых еще есть еда (вместимость), и дорогами, на которых все еще есть еда (вместимость). вместимость осталась 3. Жадно потреблять из следующего ближайшего зернохранилища 4. Перейти к следующему зернохранилищу, если осталось недостаточно еды 5. Перейти к шагу 1 для другого района Вы попытаетесь решить каждый район последовательно. Предостережение в том, что это решение может быть очень неэффективным. - person reshen; 11.05.2010
comment
Да, теперь я понял. Я думаю, что здесь наиболее подходящими являются алгоритмы потока с минимальной стоимостью, потому что дороги имеют не только пропускную способность, но и длину. - person TautrimasPajarskas; 11.05.2010

Что-то, что вы должны отметить, это то, что ваша игра непрерывна. Если у вас есть решение X в момент времени t и происходят небольшие изменения (например, игрок строит другую дорогу или в одном из городов увеличивается население), решение, которое дают вам алгоритмы максимального потока, может кардинально измениться< /strong>, но вы, вероятно, захотите, чтобы решение в момент t+1 было похоже на X. Совершенно другое решение на каждом временном шаге нереально (1 новая дорога строится в южном конце карты, и все маршруты автоматически пересчитывается).

Я бы использовал какой-нибудь алгоритм для расчета начального решения (или когда происходит серьезное изменение, например, землетрясение разрушает 25% дорог), но большую часть времени только обновлять его постепенно: то есть определить некоторую форму действительного преобразования решения (например, 1 город пытается получить 1 единицу еды из другого зернохранилища, чем сейчас) — вы пробуете обновление (симулируете ожидаемую перегрузку) и сохраняете обновленное решение, если оно лучше, чем существующее решение. Выполняйте этот шаг N раз после каждого хода игры или через некоторую единицу времени.

Он одновременно эффективен в вычислительном отношении (не нужно запускать полный Max Flow каждую секунду) и обеспечивает более реалистичные и плавные изменения в поведении.

person Ofri Raviv    schedule 10.05.2010
comment
Гуд думает. Однако именно так работает алгоритм максимального потока: он постепенно улучшает имеющееся решение до тех пор, пока не сможет его улучшить. - person Neil G; 11.05.2010
comment
@ Нил Джи, разве не много алгоритмов максимального потока? Наверняка некоторые из них так не работают, иначе все они могли бы застрять на локальных максимумах. - person tloflin; 11.05.2010
comment
@tloflin: неправда. Ни один из алгоритмов максимального потока, которые работают путем постепенного улучшения решения, не застревают на каком-либо локальном максимуме. - person IVlad; 11.05.2010
comment
Пока приказы рабочим не меняются до тех пор, пока они не вернутся домой, не имеет значения, что в одну минуту район посылает рабочих собирать еду в амбаре 1, а в другую минуту — в амбаре 2. Большая проблема заключается в том, что система очень инерционное значение, если вы только что отправили толпу в точку А, а точка Б внезапно стала доступной с совершенно новым блестящим шоссе, то толпе требуется время, чтобы вернуться. Может быть, я что-нибудь придумаю. - person TautrimasPajarskas; 11.05.2010

Возможно, было бы интереснее иметь динамику, которая моделирует поведение, приводящее к хорошему разумному решению, а не поиск идеального решения, управляющего поведением. Предположим, вы планируете каждую поездку индивидуально. Если вы водитель и вам нужно добраться из точки А в точку Б, как вы туда доберетесь? Вы можете рассмотреть несколько вещей:

  1. Я знаю о типичных дорожных условиях в этот час и постараюсь найти пути в обход дорог, которые обычно загружены. Вы можете смоделировать это как усредненное значение трафика в разное время, поскольку автомобилисты не обязательно имеют точную информацию о текущем трафике, но могут учиться и определять тенденции с течением времени.

  2. Я не люблю длинные, запутанные маршруты с большим количеством поворотов. Планируя поездку, вы можете наказать тех, у кого много преимуществ.

  3. Если в вашу модель включены ограничения скорости и светофоры, я бы хотел избежать длинных участков с низкими ограничениями скорости и/или большим количеством светофоров. Я бы предпочел автострады или шоссе для дальних поездок, даже если на них больше трафика.

Может быть и другая интересная динамика, которая развивается при рассмотрении проблемы с точки зрения поведения, а не чистой оптимизации. В реальной жизни трафик редко сводится к оптимальным решениям, поэтому большая часть проблем в транспортной инженерии связана со стимулами, штрафами и схемами, которые поощряют лучшее решение из естественной динамики, проявляющейся в решениях водителей.

person Dan Bryant    schedule 11.05.2010
comment
Каждый водитель уже знает чуть ли не лучший путь к месту назначения даже с учетом пробок, поворотов и скоростей. Это просто. Проблема здесь в том, чтобы знать, где взять еду, но все равно спасибо за идеи! - person TautrimasPajarskas; 11.05.2010
comment
Хотя может случиться так, что дороги изменились с тех пор, как человек в последний раз ездил, поэтому он не знает новых лучших путей. Возможно, вы могли бы смоделировать это так, что с течением времени все больший процент водителей получает точную информацию для этой итерации дорог, в то время как остальные по-прежнему знают только лучшие пути для предыдущих итераций. - person JPvdMerwe; 31.05.2010