[英]python-constraint add dynamic constraint
我正在使用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()
方法添加該約束 ?
首先,您必須添加定義航班起飛時間的變量:
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]
)
如果使用的托架不同或使用的時間不同,則滿足約束條件。
我無法測試上面的代碼,但這應該為您提供一個良好的起點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.