2011-02-13 125 views
1

我正在製作一個函數,該函數將司機和乘客的列表與他們的位置相關聯,並將乘客分配列表返回給司機,以最大化分配給司機的乘客數量,受到以下限制:在python-constraint中添加約束條件時產生KeyError

  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。

回答

4

你的變量具有形式(driver, passenger):你給addConstraint()

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

的變量,然而,有形式(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)有約束,它會拋出一個錯誤,因爲它不知道這個變量(我假設你的例子只有兩個驅動程序)。