Я новичок во всей проблеме с коммивояжером, а также с переполнением стека, поэтому дайте мне знать, если я скажу что-то не совсем правильное.
Введение
Я пытаюсь закодировать оптимизированный для прибыли / времени алгоритм множественной торговли для игры, в которой участвуют несколько городов (узлов) в нескольких странах (областях), где:
- Физическое время, необходимое для путешествия между двумя связанными городами, всегда одинаково;
- Города не связаны линейно (вы можете телепортироваться между несколькими городами одновременно);
- В некоторых странах (районах) есть маршруты телепортации, благодаря которым кратчайший путь доступен через другие страны.
- У путешественника (или торговца) есть ограничение на его кошелек для монет, вес его товаров и количество, которое можно обменять на определенном торговом маршруте. Торговый маршрут может охватывать несколько городов.
Параметры вопроса:
В памяти уже существует база данных (python: sqlite), которая хранит сделки на основе их исходного города и города назначения, городов с кратчайшим путем между ними в виде массива и количества, а также ограничивающего фактора с его% возвратом к итогу капитал (или в том случае, если ни один из факторов не является ограничивающим, тогда просто метод, который дает наибольшую отдачу от общего капитала).
- Я пытаюсь найти оптимальную прибыль для определенного заданного отрезка времени (т. Е. 30 минут)
- Акт пересечения в новый город фактически является одновременным
- Путешествие по карте города обычно занимает одинаковое количество времени (то есть 2 минуты)
- Действие по инициированию первой или любой новой сделки занимает то же самое время, что и пересечение одной карты города (т.е. 2 минуты)
- Моя отправная точка может не иметь действительной сделки (мне нужно перейти к первой / ближайшей / лучшей)
Пока псевдо-решение
Оптимизация
Во-первых, я понимаю, что, поскольку у меня есть ограничение по времени, которое требуется, и я знаю, сколько времени занимает каждый прыжок (включая -1 для инициирования сделки), я могу ограничить график всеми сделками, прыжки которых находятся ниже или равно max_hops=int(max_time/route_time) -1
. Я вырезал элементы торговой базы данных, которые не попадают в этот срок, обрезая города с длиной кратчайшего пути, превышающей max_hops
.
Я делаю еще одну запись в базе данных сделок, которая включает кратчайшие пути между моим текущим городом и начальными городами всех существующих сделок, которые не являются моим текущим городом, и даю им возврат в 0%. Я бы ограничил их тем, где количество городских прыжков меньше max_hops
, и я бы также рассчитал, будет ли текущий город с начальным городом плюс тот, который торгует по кратчайшему пути, превышать max_hops
и уберу те, которые превысили этот ограничение.
Затем я беру оставшиеся сделки, которые не (current_city->starting_city)
, и добавляю торговые маршруты с возвратом 0% между всеми городами назначения и отправления, где прыжки не превышают max_hops
Затем я делаю один последний обрез для всех городов, которые не включены в базу данных сделок как начальный город, город назначения или часть массивов городов с кратчайшим путем.
Поиск по графику
У меня остался (намного) меньший график сделок, осуществимых в течение срока (то есть 30 минут).
Поскольку все подключенные узлы являются смежными, по умолчанию все соединения имеют взвешенный вес 1. Я делю% возврата на количество прыжков в сделке, затем беру инверсию и добавляю +1 (это будет означать вес 1,01 для 100% обратного маршрута). В случае, если возврат составляет 0%, я добавляю ... 2?
Затем следует вернуть наиболее прибыльный маршрут ...
Вопрос:
Главным образом,
Как мне добавить возможность использовать несколько маршрутов, когда у меня осталось больше денег или пространства, и продолжать поиск маршрутов по отдельным маршрутам? Из-за характера товаров, продаваемых по нескольким ценам и количествам в пределах города, будет много перекрывающихся маршрутов.
Как штрафовать за запуск нового торгового маршрута?
Полезен ли поиск по графику в этой ситуации?
На боковой ноте
- Какие виды черносливов / оптимизаций на графике я должен (или не должен) делать?
- Мой метод взвешивания правильный? Я чувствую, что это даст мне непропорциональный вес. Должен ли я использовать фактический доход вместо процентного дохода?
- Если я пишу код на python, подходят ли мне такие библиотеки, как python-graph ? Или это сэкономило бы мне много времени (как я понимаю, алгоритмы поиска графа могут требовать больших вычислительных ресурсов) для написания специализированной функции?
- Мне лучше использовать поиск A *? 1104 *
- Должен ли я предварительно рассчитывать точки кратчайшего пути в торговой базе данных и максимизировать оптимизации, или я должен оставить все это для поиска по графику?
- Можете ли вы заметить что-нибудь, что я мог бы улучшить?