调度分配
我正在开发一个航班调度应用程序(免责声明:这是一个大学项目,请不要代码回答)。 在回答之前请阅读这个问题w /注意的一部分,因为它有很多特点:(
首先,一些术语问题:
你有飞机和航班,你必须配对。 为了简单起见,我们假定一旦前一次使用该飞机的飞机降落时,一架飞机就是免费的。
航班被视为任务:
飞机可以看作是任务(或航班,用我们的术语)使用的资源。
航班具有所需的特定类型的飞机。 例如,飞行200需要B型飞机。飞机显然是一种且仅有一种特定类型,例如,Plane Airforce One是C型飞机。
“项目”是航空公司在给定时间段内所有航班的集合。
所需的功能是:
为上述项目寻找最短可能的持续时间
任务(飞行)的最早和最新的可能开始
关键任务在提供数据的基础上完成前面任务的标识符。
自动配对航班和飞机,以便搭乘所有搭乘飞机的航班。 (注:航班的持续时间是固定的)
通过项目计划获得甘特图,其中所有航班都尽早开始,以图形方式显示所有以前提及的数据(依赖关系,时间信息等)
所以问题是:我在世界上如何实现这一目标? 尤其:
如果你还可以推荐一些算法让我们查找,那就太好了。
这里有一些建议。
原则上可以有一个图形,其中每个节点都是一个航班,并且如果B依赖于A,则从A航班到B航班有一个边缘,即B在A着陆之前无法起飞。 您可以使用此依赖关系图来计算项目的最短可能持续时间---当您将路径上所有航班的持续时间一起添加时,查找具有最长持续时间的图形路径。 这是您项目的“关键路径”。
但是,您需要与飞机配对的事实使其变得更加困难,尤其是, 因为我猜想假设飞机不允许没有乘客飞行,即一架飞机必须从它最后一次降落的同一个城市起飞。
如果您的飞机数量过多,使用组合优化算法(如模拟退火)很容易将其分配给航班。 如果计划非常紧张,即你没有多余的飞机,这可能是一个难题。
要设置您的航班的实际起飞时间,例如可以将允许的时间表制定为线性规划问题,或者作为半定/二次规划问题。
这里有一些参考:
首先绘制一个领域模型(类图),并在您的脑海中明确分离:
PlaneType
, Plane
, Flight
, FlightBeforeFlightConstraint
,... PlaneToFlightAssignment
将所有这些实例封装在该Project
类(=解决方案)中。 然后在这样的解决方案上定义一个评分函数(AKA适应度函数)。 例如,如果有2个PlaneToFlightAssignments
与FlightBeforeFlightConstraint
(=航班依赖性)不FlightBeforeFlightConstraint
,则降低分数。
然后,只需通过更改PlaneToFlightAssignment
实例即可找到具有最佳分数的解决方案。 有几种算法可以用来找到最佳解决方案。 如果你的数据集真的很小(比如10架),你可能会使用暴力。