我正在製作一個函數,該函數將司機和乘客的列表與他們的位置相關聯,並將乘客分配列表返回給司機,以最大化分配給司機的乘客數量,受到以下限制:在python-constraint中添加約束條件時產生KeyError
乘客只能在一臺車
分配給每個車內乘客的數量不能超過在汽車座椅的指定數量
每個司機拿起所有的乘客旅途的距離不能超過一些任意常數
我有是與添加第一個約束的問題。我一直沿着教程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。