旅行推销员,包括穿梭城市

Traveling salesman including traveling through cities

传统上,旅行商问题适用于城市与城市之间的距离。如果与城市之间的旅行成本相比,您可以忽略通过城市的旅行成本,那么这非常有效。那么问题来了,在一个城市的出行成本不容忽视的情况下,如何找到最短路线呢?

更好地解释问题的最简单方法是采用贪婪算法,例如最近邻从 A 开始,然后去 B,然后有 2 个选项,一个去 C 花费 5 成本,一个去 D 花费6成本。一开始C看起来比较便宜,但是穿过city去B需要3 cost,穿过city去D只需要1 cost,所以最后走D会是比较便宜的选择。

之前我创建了一张包含每个城市之间的旅行费用的地图,但是正如您在示例中看到的那样,穿过一个城市对真实的旅行费用有很大影响。

关于如何解决此类问题的任何帮助?

编辑:可以在起点选择首选边(不穿越城市)。 当推销员进入城市时到达目的地(不穿越城市)。 往返两个城市的费用相同。

如果我们假设起始节点和结束节点也存在城市成本,那么您需要将该成本添加到您希望包含在道路中的顶点。如果一个顶点的成本为 n,其目标的成本为 m,并且代理必须穿过城市,则成本为 n + m。如果起点和终点节点包含在内城交通成本中,那么你需要将你的总旅行成本初始化为起始城市的成本,你可以在每次遍历一个顶点时加上目标城市的成本。如果不是,那么你将成本初始化为 0,如果你不在最后一步,只会添加城市旅行成本。

如果智能体必须恰好访问所有城市一次,则可以从算法中忽略城市成本,因为它将是一个常数,可以计算并添加到最佳顶点道路成本中。

我的想法是用大小为 n = |Neighbors(C)| ​​的集团替换每个城市节点 C。将 C 的每个邻居连接到团中的一个节点。

团内的边代表 "transit" 通过 C,并且它们具有相关联的相应运输成本。然后,您必须修改旅行推销员 "goal" 以访问每个城市派系的至少一个节点(而不是访问每个派系)- 或者一旦访问一个就将所有城市派系节点标记为已访问。