Я плохо знаком с целой проблемой коммивояжера, а также stackoverflow таким образом сообщают мне, говорю ли я что-то, что не совершенно правильно.
Введение:
Я пытаюсь кодировать profit/time-optimized алгоритм нескольких-торговли для игры, которая включает несколько городов (узлы) в нескольких странах (области), где:
Параметры вопроса:
Там уже существует база данных в памяти (python:sqlite), который содержит отрасли на основе их исходного города и их целевого города, городской промежуток кратчайшего пути как массив и сумма и ограничивающий фактор с его доходностью % совокупного капитала (или в случае, который ни один из факторов не ограничивает, затем просто метод, который дает самую высокую доходность совокупного капитала).
Оптимизация
Во-первых, я понимаю, что, потому что у меня есть предел на время, которое требуется, и я знаю, сколько времени каждый транзитный участок берет (включая-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. Я делюсь, %return по количеству транзитных участков в торговле затем берут инверсию и добавляют + 1 (это означало бы вес 1,01 для 100%-го маршрута возврата). В случае, где возврат составляет 0%, добавляю я... 2?
Это должно затем возвратить самый прибыльный маршрут...
Главным образом,
Как я добавляю способность следовать несколькими маршрутами, когда я перенес деньги или располагаю с интервалами и сохраняю маршрут, находящий сквозной тракт дискретный к единственным торговым путям? Из-за природы товаров, продаваемых по нескольким ценам и количествам в городе, было бы большое наложение маршрутов.
Как я штрафую инициирование новый торговый путь?
График является поиском, даже полезным в этой ситуации?
На ноте стороны,
Я думаю, вы определили что-то, что вписывается в класс проблем, называемых проблемами инвентаризации - маршрутизации. Я предполагаю, что, поскольку у вас есть и товары, и монеты, путешественник одновременно покупает и продает по выбранному маршруту. Давайте сначала предположим, что ВСЕ детерминировано - все количество товаров, пользующихся спросом, имеющееся предложение, цены покупки и продажи и т. Д. Известны заранее. Стохастическая версия усложняется (очевидно).
Одной из целей было бы максимизировать прибыль с ограничением на кошелек и товары. Если путешественнику нужно вернуться домой, это похоже на экскурсию, если нет, то на тропу. Поскольку вы не требовали, чтобы путешественник посещал КАЖДЫЙ узел, это НЕ ТАП. Это хорошо - проблемы кратчайшего пути, как правило, решать намного проще, чем TSP.
Из-за боковых ограничений и ограниченного выбора следующих шагов на каждом узле - я бы рассмотрел возможность использования динамического программирования при первой попытке метода решения. Это поможет вам перечислить, что вы покупаете и продаете на каждом этапе, а количество этапов ограничено. Кроме того, поскольку вы накладываете ограничение по времени на решение, это ограничивает пространство состояний выбора.
Для тех, кто предложил алгоритм Джикстры - возможно, вы правы - соглашения о маркировке должны включать время, монеты, товары и соответствующую прибыль. Возможно, предположения Джикстры могут не сработать для этого с дополнительным усложнением прибыли. Еще не продумал.
Вот ссылка на аналогичную проблему в капитальном бюджетировании.
Удачи!
Если это игра, в которой вы играете против людей, я бы предположил, что общий размер пространства данных на самом деле весьма ограничен. В таком случае я бы предпочел отказаться от этой причудливой обрезки, поскольку сомневаюсь, что оно того стоит.
А как насчет простого поиска в ширину?
Составьте список всех городов, отметьте их как непосещаемые
Возьмите начальный город, отметьте время в пути как ноль
for each city:
if not finished and travel time <> infinity then
attempt to visit all neighbors, only record the time if city is unvisited
mark the city finished
repeat until all cities have been visited
O (): внешний цикл выполняет города * максимальное время прыжков. Внутренний цикл выполняется один раз для каждого города. Выделение памяти не требуется.
Теперь для каждого города посмотрите, что здесь можно купить и что там продать. При расчете нормы прибыли от сделки помните, что рост носит экспоненциальный, а не линейный характер. Двойная прибыль от сделки, которая занимает вдвое больше времени, составляет НЕ хорошая сделка! Посмотрите, как рассчитать внутреннюю норму прибыли.
Если в текущем городе нет торговли, не беспокойтесь о полном анализе, просто посмотрите на соседей и проведите анализ вместо них, добавляя единицу ко времени для каждого хода.
Если у вас есть свободные циклы ЦП (и вполне возможно, что все, что предназначено для игры человеком, будет иметь довольно мало места для данных), вы можете запустить анализ для каждого города, добавив время, необходимое для того, чтобы добраться до города. город.
Редактировать: Судя по вашему комментарию, у вас много доступной мощности процессора, поскольку игра не работает на вашем процессоре. Я придерживаюсь своего решения: проверьте все. Я сильно подозреваю, что получение информации о маршруте и торговле займет больше времени, чем расчет оптимального решения.