有效编写航空公司路由算法

时间:2009-06-24 16:20:24

标签: algorithm

假设:

  • 航班数据库(出发城市,到达城市,出发时间,到达时间)。

问题:

  • 如果出发时间不重要,两个城市之间列出服务的最有效算法是什么?考虑到我们希望最小化停留时间(但仍然高于标称最小值,即20分钟),并最小化中途停留次数(如果有不间断路线,这是微不足道的,但如果没有,则找到一个连接路线超过两个连接等等,合理的中途停留时间,不那么琐碎)。
  • 如果可能的话,我不想特别将任何机场标记为集线器,以便留下点对点路由网络的可能性。
  • 应该有一个选项来指定所需的(近似的)出发时间。如果它有自己独立的算法,那就没关系。

尚未选择此项目的代码语言(可能是.NET语言,因为快速表单会派上用场),因此首选伪代码算法。如果添加的信息可能有帮助,我会留意后续问题。

3 个答案:

答案 0 :(得分:4)

DijkstraA*,权重是长时间等待和多次停留的一种惩罚。

答案 1 :(得分:3)

在基地,您将以树为单位查看您的城市网络,以离开的城市为根,每个离开的航班都是指向孩子的指针。您将在树中执行递归深度优先搜索以查找到目标的所有路径,但是在您前进时检查一个循环并中止导致循环的任何路径。

当你找到可行的路径时,你可以保持最短但找到的单一解决方案;或保留更大的路径子集,如果您想在此基础上选择,则按出发时间的某些标准进行分层。

根据数据库和节点的具体情况,您还可以引入其他规则来缩短路径搜索时间,例如,如果您碰巧知道出发地和目的地相距1000英里,并且您的路径到目前为止已经跟踪了你飞行了3000英里而你仍然不在那里,拧紧它,继续搜索下一条路径。

答案 2 :(得分:0)

在分解响应后,我正在尝试一种算法,该算法基于手动标记“连接”机场的机场。这可以节省数百个无法连接到任何地方的机场(当您最后一次通过Cedar Rapids从纽约连接到东京时?)。这将涵盖多达2次中途停留,在2次停留之后我将使用特殊情况算法,完整的树搜索,或标记“未服务”的路线(很多真正的航空公司都会这样做,但对于游戏来说这应该是玩家可定制的反正。

目前的模式是这样的:

寻找不间断!

  • 是否有从原始机场到目的地机场的直达路线?优秀!返回不间断列表(请求算法可以决定如何处理它)。

没有不间断连接?

  • 汇集从原始机场到“连接”机场(所有枢纽和重点城市)的所有航班。
  • 从这些“连接”机场(所有枢纽和重点城市)组装到达目的地机场的所有航班。
  • 创建所有可能的路径(Origin-Connection-Destination)
  • 将此列表修剪为所有“可能”路径(消除不连续的连接,消除所有路径,在20分钟内停留)。
  • 按总旅行时间(航班时间+停留时间)对此列表进行排序。

没有一站式连接?

  • 汇集从原始机场到“连接”机场(所有枢纽和重点城市)的所有航班。
  • 从任何“连接”机场(所有枢纽和重点城市)组装到达目的地机场的所有航班。
  • 在起飞机场飞往“连接”机场和“连接”飞往目的地的机场之间组装所有航班。 (集线器到集线器)
  • 创建所有可能的路径(Origin-Connection-Connection-Destination)
  • 将此列表修剪为所有“可能”路径(消除不连续的连接,消除所有路径,在20分钟内停留)。
  • 按总旅行时间对此列表进行排序。