我正在制作一个功能,其中列出了驾驶员和乘客的位置,并向驾驶员返回乘客分配列表,以最大限度地分配给驾驶员的乘客数量,但受以下限制:
乘客只能在一辆车上
分配给每辆车的乘客数量不能超过车内指定的座位数
每位司机接载所有乘客的行程距离不能超过任意常数
我遇到的问题是添加第一个约束。我一直在关注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之外,我只是不确定我的代码是如何区分足以导致错误的。
答案 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)
进行约束时,它会抛出一个错误,因为它不知道这个变量(我假设你的例子只有两个驱动程序)。