在python-constraint中添加约束时的KeyError

时间:2011-02-13 16:31:07

标签: python constraint-programming

我正在制作一个功能,其中列出了驾驶员和乘客的位置,并向驾驶员返回乘客分配列表,以最大限度地分配给驾驶员的乘客数量,但受以下限制:

  1. 乘客只能在一辆车上

  2. 分配给每辆车的乘客数量不能超过车内指定的座位数

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

  4. 我遇到的问题是添加第一个约束。我一直在关注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之外,我只是不确定我的代码是如何区分足以导致错误的。

1 个答案:

答案 0 :(得分:4)

您的变量的格式为(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)进行约束时,它会抛出一个错误,因为它不知道这个变量(我假设你的例子只有两个驱动程序)。