Python-constraint: setting a constraint based on function exit

I am creating a system that takes data on drivers, potential passengers and their locations, and also tries to optimize the number of passengers who can get up with a driver with some restrictions. I am using the python constraint module, and solution variables are represented like this:

p = [(passenger, driver) for driver in drivers for passenger in passengers]
driver_set = [zip(passengers, [e1]*len(drivers)) for e1 in drivers]
passenger_set = [zip([e1]*len(passengers), drivers) for e1 in passengers]
self.problem.addVariables(p, [0,1])

So, when I print the value of p and driver_set and passenger_set, I get the following output (given the test data that I provided):

[(0, 0), (1, 0), (2, 0), (0, 1), (1, 1), (2, 1)] # p
[[(0, 0), (0, 1)], [(1, 0), (1, 1)], [(2, 0), (2, 1)]] # passenger_set
[[(0, 0), (1, 0)], [(0, 1), (1, 1)]] # driver_set

So, there are 3 passengers and 2 drivers: a variable (2.0) will mean that passenger 2 is in car 0 and so on. I added the following restrictions to make sure that no passenger enters more than one car and that the driver cannot have more people than seats:

for passenger in passenger_set:
        self.problem.addConstraint(MaxSumConstraint(1), passenger)
for driver in driver_set:
        realdriver = self.getDriverByOpId(driver[0][1])
        self.problem.addConstraint(MaxSumConstraint(realdriver.numSeats), driver)

- . , , , , . , ( , driver_set), , . , :

for driver in driver_set:
        self.problem.addConstraint(MaxSumConstraint(MAX_DISTANCE), [self.getRouteDistance(self.getShortestRoute(driver))])

:

KeyError: 1.8725031790578293

, python: . ?

- , , , . , , , , . ( , getRouteDistance ()), :

for driver in driver_set:
    self.problem.addConstraint(lambda d: self.getRouteDistance(d) <= float(MAX_DISTANCE), driver)

(, , , .getSolutions(), ):

File "allocation.py", line 130, in buildProblem
for solution in self.problem.getSolutions():
File "/Users/wadben/Documents/Dev/Python/sp-allocation/constraint.py", line 236, in getSolutions
return self._solver.getSolutions(domains, constraints, vconstraints)
File "/Users/wadben/Documents/Dev/Python/sp-allocation/constraint.py", line 529, in getSolutions
return list(self.getSolutionIter(domains, constraints, vconstraints))
File "/Users/wadben/Documents/Dev/Python/sp-allocation/constraint.py", line 506, in getSolutionIter
pushdomains):
File "/Users/wadben/Documents/Dev/Python/sp-allocation/constraint.py", line 939, in __call__
self.forwardCheck(variables, domains, assignments)))
File "/Users/wadben/Documents/Dev/Python/sp-allocation/constraint.py", line 891, in forwardCheck
if not self(variables, domains, assignments):
File "/Users/wadben/Documents/Dev/Python/sp-allocation/constraint.py", line 940, in __call__
return self._func(*parms)
TypeError: <lambda>() takes exactly 1 argument (3 given)

- - ? , .

+3
1

- Python () . :

name = lambda arguments: expression

def name(arguments):
    return expression

, (, ).

, , . , ( , 1 , - 0) .

, ( ), , , . Python . , ( driver_variables), :

problem.addConstraint(FunctionConstraint(lambda *values: ...), driver_variables)

, driver_variables. , :

  • (0 1) driver_variables;
  • , 1 ( , ) - , ;
  • ( get_route_distance ) (maximum_distance).

zip (1) ( ), (2) (3). , :

lambda *values: get_route_distance([variable for variable, value in zip(driver_variables, values) if value == 1]) <= maximum_distance

, , def.

driver_set . driver_set :

[[(0, 0), (1, 0), (2, 0)], [(0, 1), (1, 1), (2, 1)]]

, len (drivers) 2, zip (, [e1] * len ()) . - zip (, [e1] * len ()) driver_set ( _). , .

(drivers_variables drivers_variables), :

passengers_variables = [[(passenger, driver) for driver in drivers] for passenger in passengers]
drivers_variables = [[(passenger, driver) for passenger in passengers] for driver in drivers]
+3

Source: https://habr.com/ru/post/1792266/


All Articles