【问题标题】:KeyError when adding a constraint in python-constraint在 python-constraint 中添加约束时出现 KeyError
【发布时间】:2011-02-13 16:31:06
【问题描述】:

我正在制作一个函数,该函数接收司机和乘客及其位置的列表,并返回乘客分配给司机的列表,以最大限度地增加分配给司机的乘客数量,但受以下限制:

  1. 一名乘客只能乘坐一辆车

  2. 分配给每节车厢的乘客人数不能超过指定的车厢座位数

  3. 每个司机接载所有乘客的行程距离不能超过某个任意常数

我遇到的问题是添加第一个约束。我一直在关注http://uswaretech.com/blog/2009/03/constraint-programming-in-python/ 的教程,并且我使用了与他们解决幻方问题类似的风格:将乘客分配给汽车存储为元组(驾驶员,乘客),这些元组存储在一个列表。驾驶员和乘客的实际详细信息存储在包含他们的 ID、纬度和经度以及每个驾驶员车内有多少座位的类中。这是我用来构建问题的代码,从文件中提取了测试数据:

self.problem = Problem()
drivers = range(len(self.drivers))
passengers = range(len(self.passengers))
p = [(driver, passenger) for driver in drivers for passenger in passengers]
driver_set = [zip([e1]*len(passengers), passengers) for e1 in drivers]
passenger_set = [zip([e1]*len(drivers), drivers) for e1 in passengers]
self.problem.addVariables(p, [0,1])
for passenger in passenger_set:
    self.problem.addConstraint(MaxSumConstraint(1), passenger)
print self.problem.getSolutions()

以交互方式运行后,我发现我可以在添加约束之前运行 getSolutions(),但是在运行整个过程时出现以下错误:

Traceback (most recent call last):
  File "allocation.py", line 84, in <module>
    obj1.buildProblem("testdata.txt")
  File "allocation.py", line 81, in buildProblem
    self.problem.getSolutions()
  File "/Users/wadben/Documents/Dev/Python/sp-allocation/constraint.py", line 233, in getSolutions
    domains, constraints, vconstraints = self._getArgs()
  File "/Users/wadben/Documents/Dev/Python/sp-allocation/constraint.py", line 275, in _getArgs
    vconstraints[variable].append((constraint, variables))
KeyError: (2, 0)

似乎在 getSolutions() 方法的某个时候它会尝试查找 (2,0),即使第一个元组的最大值是 1(我的数据集中只有 2 个驱动程序)。我运行了教程中的代码,它运行良好,我只是不确定我的代码有什么不同会导致错误,除了我使用 MaxSumConstraint 而不是 ExactSumConstraint。

【问题讨论】:

    标签: python constraint-programming


    【解决方案1】:

    您的变量格式为(driver, passenger):

    p = [(driver, passenger) for driver in drivers for passenger in passengers]
    self.problem.addVariables(p, [0,1])
    

    但是,您提供给addConstraint() 的变量具有(passenger, driver) 的形式:

    passenger_set = [zip([e1]*len(drivers), drivers) for e1 in passengers]
    for passenger in passenger_set:
        self.problem.addConstraint(MaxSumConstraint(1), passenger)
    

    因此,当求解器尝试按变量对约束进行分组,并遇到变量(2, 0) 的约束时,它会抛出一个错误,因为它不知道这个变量(我假设您的示例只有两个驱动程序)。

    【讨论】:

      猜你喜欢
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多