鉴于城市列表和每个城市之间的飞行成本,我试图找到访问所有这些城市的最便宜的行程。我目前正在使用MATLAB solution找到最便宜的路线,但我现在想修改算法以允许以下内容:
目前,我无视航班日期问题,并假设可以从任何城市前往任何其他城市。
有没有人有任何想法如何解决这个问题?我的第一个想法是使用像GA或ACO这样的进化优化方法来解决第2点,并根据行程中是否包含返程/往返航班来评估目标函数时调整边权重,但也许其他人有更好的主意。
(注意:我使用的是MATLAB,但我并不是专门寻找编码解决方案,更多的是关于可以使用哪种算法的高级想法。)
编辑 - 在考虑了这个之后,允许“重复节点”似乎过于松散了约束。我们可以进一步约束问题,以便尽管可以重复访问节点,但每个有向边只能访问一次。忽略任何不止一次包含同一航班的行程似乎是合理的。
答案 0 :(得分:5)
我自己没有测试过;但是,我read实施Simulated Annealing来解决TSP(或其变体)可以产生出色的结果。这里的关键点是模拟退火非常易于实现并且需要最少的调整,而近似算法可能需要更长的时间来实现,并且可能更容易出错。 Skiena还有page致力于特定的TSP求解器。
答案 1 :(得分:0)
如果您希望算法产生的解决方案的成本在最佳值的3/2之内,那么您需要Christofides算法。 ACO和GA没有保证成本。
答案 2 :(得分:0)
首先,问题集中的近似城市数量是多少? (最多100个?超过100个?) 我对GA(不是ACO)有相当多的经验,就像墓志铭所说,它有一点赌博方面。对于某些输入,它可能会停留在一个非常低效的解决方案。因此,我过去所做的是使用GA作为第一选项,将答案与某些下限进行比较,如果这似乎是“偏离”,则运行第二种(通常效率较低)算法。 / p>
当然,我使用了很多非标准的术语,所以让我们确保我们同意他们在这种背景下会是什么:
答案 3 :(得分:0)
解决TSP是一个NP难问题,因为它消除了子圈的约束,如果你删除其中任何一个(对于你的枢纽城市),你只是让问题更容易。
但请注意:TSP与关联问题有相似之处,意味着您可以获得无效的行程:
城市:纽约,波士顿,达拉斯,多伦多
路径:
波士顿 - 纽约 纽约 - 波士顿
达拉斯 - 多伦多 多伦多 - 达拉斯
这显然是错误的,因为我们没有穿过所有城市。
子循环消除约束仅用于此目的。包括“枢纽城市”听起来像你需要增加重点,并在通量问题和tsp问题之间进行混合。听起来很难但第一次尝试可能是:消除相对于枢纽城市的子循环限制(并留下所有其他城市)。然后,您可以将为中心城市获得的子循环链接在一起。
祝你好运答案 4 :(得分:0)
如果您将问题限制为往返(即销售员只能购买往返机票),那么它可以用无向图表示,问题归结为找到minimum spanning tree,可以有效地完成。
在一般情况下,我不知道使用高效算法的聪明方法; GA或类似的可能是一个很好的方式。
答案 5 :(得分:0)
您想要一个接近最优的解决方案,还是想要最佳解决方案?
对于最佳解决方案,仍然有很好的蛮力。由于要求1涉及重复节点,您必须确保搜索广度优先,而不是首先搜索。否则你最终会陷入无限循环。您可以慢慢删除超过当前最小值的所有路由,直到所有路由都耗尽并找到最小路由。