Телепортирование Путешественника, Оптимальная Прибыль со временем проблема

Я плохо знаком с целой проблемой коммивояжера, а также stackoverflow таким образом сообщают мне, говорю ли я что-то, что не совершенно правильно.

Введение:

Я пытаюсь кодировать profit/time-optimized алгоритм нескольких-торговли для игры, которая включает несколько городов (узлы) в нескольких странах (области), где:

  • Физическое время, которое требуется для перемещения между двумя связанными городами, всегда является тем же;
  • Города линейно не соединены (можно телепортировать между некоторыми городами в то же время);
  • Некоторые страны (области) имеют, телепортируют маршруты, которые делают кратчайший путь доступным через другие страны.
  • У путешественника (или торговец) есть предел на его кошелек монеты, вес его товаров и количество, tradeable на определенном торговом пути. Торговый путь может охватить несколько городов.

Параметры вопроса:

Там уже существует база данных в памяти (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. Я делюсь, %return по количеству транзитных участков в торговле затем берут инверсию и добавляют + 1 (это означало бы вес 1,01 для 100%-го маршрута возврата). В случае, где возврат составляет 0%, добавляю я... 2?

Это должно затем возвратить самый прибыльный маршрут...


Вопрос:

Главным образом,

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

  2. Как я штрафую инициирование новый торговый путь?

  3. График является поиском, даже полезным в этой ситуации?

На ноте стороны,

  1. Какие виды чернослива/оптимизации к графику должны я (или должен я не), сделайте?
  2. Мой метод взвешивания корректен? У меня есть чувство, что это даст мне непропорциональные веса. Я должен использовать фактический возврат вместо возврата процента?
  3. Если я кодирую в Python, библиотеки, такие как график Python, подходящий для моих потребностей? Или это сохранило бы меня много издержек (как я понимаю, алгоритмы поиска графика могут быть в вычислительном отношении интенсивными) записать специализированную функцию?
  4. Я лучше всего от использования* поиск?
  5. Я должен предварительно вычислять точки кратчайшего пути в торговой базе данных и maxing оптимизации, или я должен оставить все это поиску графика?
  6. Можно ли заметить что-нибудь, что я мог улучшить?

7
задан Sleepingrock 13 February 2010 в 05:24
поделиться

2 ответа

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

Одной из целей было бы максимизировать прибыль с ограничением на кошелек и товары. Если путешественнику нужно вернуться домой, это похоже на экскурсию, если нет, то на тропу. Поскольку вы не требовали, чтобы путешественник посещал КАЖДЫЙ узел, это НЕ ТАП. Это хорошо - проблемы кратчайшего пути, как правило, решать намного проще, чем TSP.

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

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

Вот ссылка на аналогичную проблему в капитальном бюджетировании.

Удачи!

1
ответ дан 7 December 2019 в 16:42
поделиться

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

А как насчет простого поиска в ширину?

Составьте список всех городов, отметьте их как непосещаемые

Возьмите начальный город, отметьте время в пути как ноль

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 (): внешний цикл выполняет города * максимальное время прыжков. Внутренний цикл выполняется один раз для каждого города. Выделение памяти не требуется.

Теперь для каждого города посмотрите, что здесь можно купить и что там продать. При расчете нормы прибыли от сделки помните, что рост носит экспоненциальный, а не линейный характер. Двойная прибыль от сделки, которая занимает вдвое больше времени, составляет НЕ хорошая сделка! Посмотрите, как рассчитать внутреннюю норму прибыли.

Если в текущем городе нет торговли, не беспокойтесь о полном анализе, просто посмотрите на соседей и проведите анализ вместо них, добавляя единицу ко времени для каждого хода.

Если у вас есть свободные циклы ЦП (и вполне возможно, что все, что предназначено для игры человеком, будет иметь довольно мало места для данных), вы можете запустить анализ для каждого города, добавив время, необходимое для того, чтобы добраться до города. город.

Редактировать: Судя по вашему комментарию, у вас много доступной мощности процессора, поскольку игра не работает на вашем процессоре. Я придерживаюсь своего решения: проверьте все. Я сильно подозреваю, что получение информации о маршруте и торговле займет больше времени, чем расчет оптимального решения.

2
ответ дан 7 December 2019 в 16:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: