我正处于考虑参观印度每个商业机场的疯狂旅行的早期阶段。一项小小的研究表明,国家航空公司 - 印度航空公司有一张名为Silver Pass的特殊机票,允许在国内网络上无限制地旅行15天。我想用它作为我的首选武器!
See this for a map of all the airports served by Air India
我在Excel中可以获得以下信息:
根据这些信息,我如何计算出使用Silver Pass机票在15天内可以达到的最大机场数?在线查看显示这是一个旅行推销员问题或图形遍历问题。我们建议你解决这个问题。
我自己的一些背景 - 我刚刚开始学习Python,并希望找到一种方法来解决这个问题。鉴于此,我应该关注哪些基于python的算法/库将帮助我构建解决此问题的方法?
答案 0 :(得分:5)
您的问题与Hamiltonian Path problem和Traveling Salesman Problem密切相关,NP-Hard。
给出汉密尔顿路径问题的实例 - 建立一个飞行数据:
(*)应计算飞行时间和出发时间[对所有人来说都是共同的],这样只有当您每次访问每个终端时,您才能访问所有终端。它可以在多项式时间内轻松完成。假设我们有一个固定时间为k
小时的机票,我们构建航班表,使每个航班完全k/(n-1)
小时,每隔k/(n-1)
小时也有一个航班< sup> 1 [记住所有航班都在同一时间]。
很容易看出,当且仅当图表具有哈密尔顿路径时,您可以使用该票证访问机场,因为如果我们在路径中访问某个机场两次,我们至少需要{{1} }航班和总时间至少为n
,我们没有达到时间限制。 [其他方式类似]。
因此你的问题[一般情况]是NP-Hard,而没有已知的多项式解决方案。
1:我们假设没有时间在航班之间通过,只需减少航班长度到两次航班“跳”所需的时间即可轻松解决。
答案 1 :(得分:1)
将您的问题表示为图表绝对是最佳选择。由于持续时间,航班数量和机场数量相对有限,并且由于您(大概)对近似解决方案感到满意,因此通过强力攻击应该是实用的,并且可能是您的最佳选择。这大致是我要做的事情:
根据航班的数量,您可以详尽地执行此程序。当然,解决方案的数量随着航班的数量呈指数增长,因此这将很快变得不切实际。这是评分功能变得有用的地方 - 它优先考虑更有可能产生有用答案的解决方案。您可以根据需要运行该过程,并在产生您满意的解决方案时停止。
评分功能的属性将对解决方案的好坏产生重大影响。如果您的首要任务是探索独特的地方,那么您希望对未访问的机场投入大量资金,并且由于您希望尽可能多地探索,因此您需要优先考虑短的转移时间。我对起点的建议是,对于你已经与从那里飞往其他地方的时间成比例的某个地方的惩罚。这样,它仍将作为中途停留进行探索,但尽可能避免。另请注意,您的评分功能需要上下文,即当前候选路径访问过的机场集。
您还可以使用评分功能来应用其他约束。假设您不想在夜间旅行(合理的假设);你可以惩罚涉及夜间飞行的边缘得分。