Python-ограничение добавить динамическое ограничение - PullRequest
0 голосов
/ 17 октября 2018

Я использую библиотеку 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 утра

Мне нужен отсекзадание так, чтобы одновременно два рейса не попадали в один и тот же залив.Поэтому я спрашиваю, как я могу добавить это ограничение, используя метод addConstraint() в python-constraint ??

1 Ответ

0 голосов
/ 17 октября 2018

Сначала вы должны добавить переменные, которые определяют время отправления рейсов:

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]
        )

Ограничение будет выполнено, если или используемый залив отличается или используемое времяотличается.


Я не могу проверить приведенный выше код, однако это должно дать вам хорошую отправную точку.

...