传送旅行者,随着时间的推移最佳利润问题

时间:2010-02-13 05:24:54

标签: python algorithm routing heuristics traveling-salesman

我是整个旅行商问题以及stackoverflow的新手,所以如果我说的话不太正确,请告诉我。

说明:

我正在尝试为涉及多个国家(地区)内的多个城市(节点)的游戏编写利润/时间优化的多重交易算法,其中:

  • 在两个相连的城市之间旅行所需的物理时间总是相同的;
  • 城市没有线性连接(你可以同时在一些城市之间传送);
  • 有些国家(地区)拥有传送路线,可通过其他国家提供最短路径。
  • 旅行者(或交易员)对他的钱包,货物的重量以及在某一贸易路线中可交易的数量有限制。贸易路线可以跨越多个城市。

问题参数:

内存中已经存在一个数据库(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. 图搜索在这种情况下是否有用?

  4. 在旁注,

    1. 我应该(或不应该)对图表进行哪些修剪/优化?
    2. 我的加权方法是否正确?我觉得它会给我不成​​比例的重量。我应该使用实际回报而不是百分比回报吗?
    3. 如果我在python中编码,python-graph等库是否适合我的需求?或者它会为我节省很多开销(据我所知,图搜索算法可能是计算密集型的)来编写专门的函数吗?
    4. 我最好使用A *搜索吗?
    5. 我是否应该预先计算交易数据库中的最短路径点并进行最大化优化,还是应该将其全部留给图搜索?
    6. 你能注意到我可以改进的任何事情吗?

2 个答案:

答案 0 :(得分:2)

如果这是一个与人类对战的游戏,我会假设数据空间的总大小实际上非常有限。如果是这样的话,我会倾向于抛弃所有花哨的修剪,因为我怀疑这是值得的。

相反,如何进行简单的广度优先搜索?

建立所有城市的列表,将其标记为未访问

选择您的起始城市,将旅行时间标记为零

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():外部循环执行城市*最大跳数次数。内部循环每个城市执行一次。不需要内存分配。

现在,对于每个城市,看看你可以在这里买什么并在那里卖。在计算交易收益率时,请记住增长是指数增长,而不是线性增长。交易需要两倍的利润的两倍是一个好交易!查看如何计算内部收益率。

如果当前城市没有交易,请不要打扰全面分析,只需查看邻居并对其进行分析,为每次移动添加一个时间。

如果你有备用的CPU周期(而你很好,那么任何人类玩的东西都会有相当小的数据空间)你可以在每个城市运行分析,增加到达的时间。城市。

编辑:根据您的评论,由于游戏未在您的CPU上运行,因此您可以获得大量的CPU功率。我支持我的解决方案:检查一切。我强烈怀疑获得路线和交易信息需要的时间比计算最佳解决方案要长。

答案 1 :(得分:1)

我认为你已经定义了适合一类称为库存问题的问题。我假设既然你有货物和硬币,旅行者就会沿着选择的路线买卖。让我们首先假设一切都是确定性的 - 所有需求商品,供应商品,购买和销售价格等都是事先知道的。随机版本变得更加困难(显然)。

一个目标是通过限制钱包和货物来最大化利润。如果旅行者必须回家,它看起来像旅游,如果没有,它看起来像一条路。由于您没有要求旅行者访问每个节点,因此它不是TSP。这很好 - 最短的路径问题通常比TSP更容易解决。

由于侧面限制和每个节点下一步的选择有限 - 我考虑使用动态编程首次尝试解决方案技术。它将帮助您列举您在每个阶段购买和销售的产品,并且阶段数量有限。此外,由于您对决策设置了时间限制,因此限制了选择的状态空间。

对于那些建议使用Djikstra算法的人 - 你可能是对的 - 标签惯例需要包括时间,硬币,商品和相应的利润。可能是由于利润增加的复杂性,Djikstra的假设可能不适用于此。还没想过。

这是资本预算中类似问题的link

祝你好运!