Algorithm 高效编写航线路由算法

Algorithm 高效编写航线路由算法,algorithm,Algorithm,鉴于: 航班数据库(出发城市、到达城市、出发时间、到达时间) 问题: 如果出发时间不重要,在两个城市之间登记服务的最有效算法是什么?考虑到我们希望最小化停留时间(但仍然高于标称最小值,即20分钟),并尽量减少停留次数(如果有一条不停的路线,这是微不足道的,但如果不是,找到一条在两条连接上的连接路线等等,以合理的停留时间,不那么琐碎)。 如果可能的话,我不想专门将任何机场标记为枢纽机场,以便开放点对点航线网络的可能性 应该有一个选项来指定所需的(近似的)出发时间。如果它有自己的算法与第一个算

鉴于:

  • 航班数据库(出发城市、到达城市、出发时间、到达时间)
问题:

  • 如果出发时间不重要,在两个城市之间登记服务的最有效算法是什么?考虑到我们希望最小化停留时间(但仍然高于标称最小值,即20分钟),并尽量减少停留次数(如果有一条不停的路线,这是微不足道的,但如果不是,找到一条在两条连接上的连接路线等等,以合理的停留时间,不那么琐碎)。
  • 如果可能的话,我不想专门将任何机场标记为枢纽机场,以便开放点对点航线网络的可能性
  • 应该有一个选项来指定所需的(近似的)出发时间。如果它有自己的算法与第一个算法分开,这是可以的

这个项目的代码语言还没有被选择(可能是一种.NET语言,因为快速表单会派上用场),所以伪代码算法是首选。如果添加的信息可能有所帮助,我将密切关注后续问题。

在底部,您将把您的城市网络视为一棵树,出发城市作为根,每个出发航班都是指向一个孩子的指针。您将在树中执行递归深度优先搜索,以查找到目标的所有路径,但同时检查循环并中止导致循环的任何路径

当你找到可行的路径时,你可以将找到的最短路径保持为奇异解;或者,如果您想在此基础上进行选择,请保留一个较大的路径子集,并根据出发时间周围的一些标准进行分层


根据数据库和节点的具体情况,您还可以加入其他规则来缩短路径搜索,例如,如果您碰巧知道出发点和目的地相距1000英里,而您追踪到的路径已经飞行了3000英里,但您仍然不在,请不要管它,继续进行下一个路径搜索。

或,权重是对长时间等待和多次停靠的某种惩罚。

分解响应后,我尝试一种基于手动标记“连接”机场的算法。这样就省去了对数百个可能无法连接到任何地方的机场的浏览(你最后一次从纽约通过锡达拉皮兹连接到东京是什么时候?)。这涵盖了最多2次中途停留,在2次中途停留后,我将使用特殊情况算法,一个完整的树搜索,或者标记路线“未服务”(许多真正的航空公司都会这样做,但对于游戏来说,这应该是玩家可以自定义的)

目前的模式是这样的:

找到不停

  • 有从始发机场到目的地机场的直达路线吗?太好了!返回直达名单(请求算法可以决定如何处理)
没有直达的连接

  • 汇集从始发机场到“连接”机场(所有枢纽和重点城市)的所有航班
  • 汇集从这些“连接”机场(所有枢纽和重点城市)抵达目的地机场的所有航班
  • 创建所有可能的路径(源连接目标)
  • 将此列表修剪为所有“可能”路径(消除不连续的连接,消除所有在20分钟内停机的路径)
  • 按总旅行时间(航班时间+停留时间)对该列表进行排序
没有一站式连接

  • 汇集从始发机场到“连接”机场(所有枢纽和重点城市)的所有航班
  • 汇集所有从任何“连接”机场(所有枢纽和重点城市)抵达目的地机场的航班
  • 汇集始发机场飞往的“连接”机场和飞往目的地的“连接”机场之间的所有航班。(枢纽到枢纽)
  • 创建所有可能的路径(源连接目标)
  • 将此列表修剪为所有“可能”路径(消除不连续的连接,消除所有在20分钟内停机的路径)
  • 按总行程时间对该列表进行排序

@Ben Hughes,正是我所想的…:-我在空闲时间写的一个游戏的DIts。算法速度很重要,因为它可能会连续被击中数千次。而且,如果有一个库可以,那就很好了:)这听起来不错(作为奖励,很容易修改以添加一些奖励功能,如仅限一站、有限站等),尽管我希望能够对网络中的每个乘客进行单独建模(可能模拟到数百万),所以看起来我现在也需要找到估算算法-是的,我已经制作了一个很棒的圆映射器函数,为每个城市对以恒定时间创建距离,并使用为航班提供服务的飞机来编制估算的飞行时间,因此“合理”飞行路径是我忘记添加到OP中的一项要求。但是,正如你所说,你的算法可以很容易地涵盖这一点。我还没有为任何大规模问题实现这一点,但我认为选择合理的修剪启发式方法将对性能产生巨大影响。综上所述,我认为我必须让步,并标记“中心和焦点”机场。如果我这样做,我可以实现非常好的1-connection和2-connection航线运行时间,这将覆盖枢纽辐射模型中95%以上的所有案例,以及国内枢纽辐射航线网络中100%的案例。然后当我运行“蛮力”时对于边缘情况的算法,命中率应该是可以接受的。最小生成树解决方案能比这更好吗?