Я разрабатываю градостроительную игру и столкнулся с проблемой.
Представьте себе игровую механику Caesar III Sierra: у вас много городских районов с одним рынком в каждом. На расстоянии есть несколько зернохранилищ, связанных ориентированным взвешенным графом. Отличие: люди (здесь автомобили) — единицы, образующие пробки (здесь идет график весов).
Примечание: в серии игр Ceasar люди собирали еду и складывали ее в несколько больших зернохранилищ, тогда как многие рынки (небольшие магазины) брали еду из зернохранилищ и доставляли ее горожанам.
Задача: сообщить каждому району, откуда они должны получать еду, при этом занимая минимум времени и сводя к минимуму заторы на дорогах города.
Пример карты
Предположим, что желтым районам нужно 7, 7 и 4 яблока соответственно. В голубоватых амбарах соответственно 7 и 11 яблок.
Предположим, что веса ребер пропорциональны их длине. Тогда решение должно быть похоже на серые цифры, указанные по краям. Например, первый район получает 4 яблока из 1-го и 3 яблока из 2-го амбара, а последний район получает 4 яблока только из 2-го амбара.
Здесь сначала максимально заняты вертикальные дороги, а затем оставшиеся рабочие отправляются на диагональные пути.
Вопрос
Какой практичный и очень быстрый алгоритм я должен использовать? Я просматривал некоторые статьи (Игры с перегрузками: оптимизация в условиях конкуренции и т. д.), описывающие игры с перегрузками, но не мог понять общей картины.