我对整个旅行推销员问题以及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?
然后它应该返回最有利可图的路线......
问题:
大多,
当我有多余的钱或空间时,如何增加走多条路线的能力,并通过离散的路径寻找单条贸易路线的路线?由于商品在城市内以多种价格和数量销售的性质,会有很多重叠的路线。
我如何惩罚启动新的贸易路线?
在这种情况下,图形搜索甚至有用吗?
在旁注中,
- 我应该(或不应该)对图表进行哪些类型的修剪/优化?
- 我的加权方法正确吗?我有一种感觉,它会给我不成比例的重量。我应该使用实际回报而不是百分比回报吗?
- 如果我在 python 中编码,那么python-graph之类的库是否适合我的需求?或者它会为我节省很多开销(据我所知,图形搜索算法可能是计算密集型的)来编写一个专门的函数?
- 我最好使用 A* 搜索吗?
- 我应该预先计算交易数据库中的最短路径点并最大化优化,还是应该将其全部留给图形搜索?
- 你能注意到我可以改进的地方吗?