我正在使用python-constraint库来解决CSP,以便为机场中的每个航班预留舱位。
我需要将托架: ('A1', 'A2', 'B1', 'B2', 'C1')
分配给航班: ('MI428', 'UL867', 'QR664', 'TK730', 'UL303')
变量集的位置。
将值分配给第二组时几乎没有约束。这是我的代码
from constraint import *
problem = Problem()
flight_names = ['MI428', 'UL867', 'QR664', 'TK730', 'UL303']
bays_list = ['A1', 'A2', 'B1', 'B2', 'C1']
problem.addVariables(flight_names, bays_list)
bay_compat = {'MI428':['A1', 'A2', 'B1'], 'UL867':['B1', 'B2'], 'QR664':['A2', 'B1', 'B2'] , 'TK730':['C1', 'A1'], 'UL303':['B2', 'C1']}
for flight in flight_names:
problem.addConstraint(lambda fl: fl in bay_compat[flight], [flight])
solutions = problem.getSolutions()
print (solutions)
上面的代码工作正常。我要添加的另一个约束是,每个航班都与特定时间段相关联,称为到达和离开时间之间的时间段。
为此,我创建了另一个列表,如下所示:
time_constraints = {'MI428':(1,3) , 'UL867':(2,7), 'QR664':(3,9), 'TK730':(15,16), 'UL303':(16,17)}
注意:例如,此处(1,3)表示上午1:00至凌晨3.00
我需要分配托架,以便同时没有两个航班获得相同的托架。
所以我问如何在python-constraint中使用addConstraint()
方法添加约束?
答案 0 :(得分:0)
首先,您必须添加定义航班起飞时间的变量:
flight_names = ['MI428', 'UL867', 'QR664', 'TK730', 'UL303']
flight_times = ['T-' + name for name in flight_names]
bays_list = ['A1', 'A2', 'B1', 'B2', 'C1']
times = range(20) # or how many times you have
problem.addVariables(flight_names, bays_list)
problem.addVariables(flight_times, times)
然后,您必须施加约束,即必须在time_constraints
之后的一定时间分配每个航班:
time_constraints = {'T-MI428':(1,3) , 'T-UL867':(2,7), 'T-QR664':(3,9), 'T-TK730':(15,16), 'T-UL303':(16,17)}
for flight_time in flight_times:
start, end = time_constraints[flight_time]
problem.addConstraint(lambda fl: fl in range(start, end+1), [flight_time])
现在,您必须添加“您不能同时在同一舱位有两个航班”约束。为此,您需要生成每对可能的航班:
for flight_one, time_one in zip(flight_names, flight_times):
for flight_two, time_two in zip(flight_names, flight_times):
if flight_one == flight_two:
continue
problem.addConstraint(
lambda fl_one, t_one, fl_two, t_two: fl_one != fl_two or t_one != t_two,
[flight_one, time_one, flight_two, time_two]
)
如果任一使用的托架不同或使用的时间不同,则满足约束条件。
我无法测试上面的代码,但这应该为您提供一个良好的起点。