代码之家  ›  专栏  ›  技术社区  ›  Vajira Prabuddhaka

python约束添加动态约束

  •  1
  • Vajira Prabuddhaka  · 技术社区  · 6 年前

    我在用 python-constraint 我需要分配的地方 ('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)}
    

    我需要舱位分配,这样就不会有两个航班同时到达同一个舱位。 所以我在问如何使用 addConstraint() 中的方法 python约束

    1 回复  |  直到 6 年前
        1
  •  0
  •   Giacomo Alzetta    6 年前

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

    满足约束条件 任何一个 使用的时间不同。


    我无法测试上面的代码,但是这应该给你一个很好的起点。

    推荐文章