我是新来的整个旅行推销员问题以及计算器,所以让我知道如果我说的东西并不是完全正确的。

介绍:

我在代码利润/间优化的多算法贸易的游戏,其中涉及多个城市(节点)内的多个国家(区域),其中:

  • 物理时间需要旅行之间连接的两个城市总是相同的;
  • 城市不是直线连接(你可以瞬移之间的一些城市在同一时间);
  • 一些国家(区域)已经传送路线,这使最短路径可以通过其他国家。
  • 旅行者(或贸易商)有一个限制在他的硬币的-钱包,重量为其货物,且可交易的数量在一定的贸易路线。贸易路线可能跨越多个城市。

问题参数:

目前已经存在数据库中存储器(蟒蛇:源码)持有交易基于其来源的城市和他们的目的地城市,最短路径城市间为一系列和金额,并限制因素与其%的回归在总的资本(或在的情况下,没有一个因素是限制性的,那么只要的方法,让最高回报的总资本)。

  • 我试图找到最佳的利润的某些预设的区块的时间(即30分钟)
  • 该法的越境进入一个新的城市实际上是同时
  • 它通常需要相同的定义的量的时间旅行整个城市的地图(即2分钟)
  • 该法案的发起第一或者任何新的贸易,需要同时作为交叉的一个城市地图(即2分钟)
  • 我的出发点可能会实际上没有一个有效的贸易(我会旅行到一个最近的好评的一个)

伪解决方案为止

优化

第一,我知道因为我有一个限制所需的时间,我知道过了多久每一跳需要(包括-1intiating贸易),我可以限制该图的所有交易的跳下或等于 max_hops=int(max_time/route_time) -1.我切的贸易数据库,不属于这一时间限制,修剪城市,具有最短长度大于 max_hops.

我另一个进入交易的数据库,其中包括最短路径之间的我的前的城市和起城市的所有现有的贸易都不是我的当前城市,并得到它们的回报率为0%。我会限制这些要在那里数的城市跳是少于 max_hops, 和我想也算是否现在的城市的启动城市再加上进行交易的最短路径-跳会excede max_hops 并删除那些exceded这种限制。

然后我把剩下的交易没有 (current_city->starting_city) 和增加的贸易路线带回的0%之间的所有目的地和起城市哪来的跳不excede max_hops

然后我做最后一次修剪的所有城市,不是在交易的数据库作为一个城市开始,目的地城市,或者一部分的最短路径城市阵列。

图搜索 我留下一个(多)较小的图的交易可行的时限内(即30分钟).

因为所有的节点相连接邻,连接是通过默认所有加权1.我分%的回报超过跳数在贸易然后采取的反和加+1(这将意味着一个重的1.01 100%的返回途径)。在情况下的返回是0%,我加...2?

它应该然后返回最有利可图的路线...


问题:

大多数时候,

  1. 我怎么添加的能力采取多条路时我已经离开了金钱或空间,并保持路线,找到通过路径上的离散单的贸易路线?由于货物的性质正在出售多的价格和数量在城市之内,将有很多重叠的路线。

  2. 我怎么惩罚发起一个新的贸易路线?

  3. 是图搜索的甚至是有益的,在这种情况呢?

在一个侧面说明,

  1. 什么样的梅干/优化图表,我应该(或者我应该不)做什么呢?
  2. 是我的加权方法是否正确?我有一种感觉它会给我不相称的权重。我应该使用的实际回报,而不是百分比回报?
  3. 如果我编码在蟒是图书馆等 蟒蛇图 适合我的需求?或将会节省我很多的开销(我的理解是,图搜索算法可以计算密集)编写的一个专门功能?
  4. 我最好利用*索?
  5. 我应该预先计算最短路径点在贸易数据库和杏优化或者我应该离开所有的图搜索?
  6. 你能通知任何事情我可以改善?
有帮助吗?

解决方案

我认为你定义的东西,适合成一类的问题称为库存变路线的问题。我假设因为你有货物和硬币、旅行人员是两个买卖沿着所选择的途径。让我们先假设,一切都是确定的-所有的数量的货物的需求、供应、购买和出售价格,等等都是在事先得知。随机的版本变得更加困难(显然).

一个目标可望实现利润最大化的一个制约因素的钱包和货物。如果旅行者已返回家园它看起来像一个旅游,如果没有,它看起来像一个路径。因为你还没有所需旅行者访问每一个节点,它不是一个茶匙。这是很好的-最短路径问题是一般更易于运输服务提供商来解决。

因为边限制和选择有限的下一个步骤,在每个节点-我会考虑使用动态规划的第一次尝试解决方法的技术。它会帮助你列举什么你买和出售在每个阶段和有限数量的阶段。还因为你把一个时间约束的决定,这限制了国家空间的选择。

那些建议Djikstra的算法-你可以右的标签公约的需要包括时间、硬币、商品和相应的利润。这可能是假设的Djikstra是不可以工作为这与增加的复杂性的利润。还没想过呢。

这里有一个 链接 一个类似的问题在资本预算。

祝你好运!

其他提示

如果这是一个游戏你在哪里播放对人类我会假设的总体大小的空间数据实际上是相当有限。如果是这样,我将倾向于把所有的幻想修剪成为我怀疑它是值得的。

相反,如何关于一个简单的宽度优先搜索?

建立一个列表中的所有城市的标记他们未访问

把你开始的城市,标记的旅行时间为零

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。我坚持我的解决方案:检查一切。我强烈怀疑,它将需要更长的时间获取的路线和交易的信息比它将计算最优化的解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top