簡體   English   中英

python-constraint添加動態約束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM