分配问题来自Google OR Tools
其他框架可以解决这个问题,甚至使用Excel Solver。但ILOG CPLEX无法解决这个问题。
这是我在jupyter笔记本中的代码:
import cplex
import docplex.mp
from docplex.mp.model import Model
import numpy as np
assignment_model = Model(name='Assignemnt_Problem', log_output=True)
costs = np.array([[90,80,75,70],
[35,85,55,65],
[125,95,90,95],
[45,110,95,115],
[50,100,90,100]])
x = assignment_model.binary_var_matrix(costs.shape[0], costs.shape[1], name="a")
assignment_model.add_constraints((sum(x[i,j] for i in range (costs.shape[0])) <=1
for j in range (costs.shape[1])), names ="workers")
assignment_model.add_constraints((sum(x[i,j] for j in range (costs.shape[1])) ==1
for i in range (costs.shape[0])), names ="tasks")
obj_fn = sum(x[i,j]*costs[i,j] for i in range (costs.shape[0]) for j in range(costs.shape[1]))
assignment_model.set_objective('min', obj_fn)
assignment_model.print_information()
assignment_model.solve()
print('Optimization is done. Objective Function Value: %.2f' % assignment_model.objective_value)
错误";DOcplexException:模型<分配_问题>没有成功解决";
感谢
确实如此。如果添加行
print("status = ",assignment_model.solve_details.status)
解决后,你会看到
status = integer infeasible
这就是为什么打印解决方案不工作
现在,如果您更改
costs = np.array([[90,80,75,70],
[35,85,55,65],
[125,95,90,95],
[45,110,95,115],
[50,100,90,100]])
进入
costs = np.array([[90,80,75,70],
[35,85,55,65],
[125,95,90,95],
[45,110,95,115],
[50,100,90,100]])
costs=costs.transpose()
那么你就会得到一个解决方案。
(狄利克雷抽屉原理(
import cplex
import docplex.mp
from docplex.mp.model import Model
import numpy as np
assignment_model = Model(name='Assignemnt_Problem', log_output=True)
costs = np.array([[90,80,75,70],
[35,85,55,65],
[125,95,90,95],
[45,110,95,115],
[50,100,90,100]])
costs=costs.transpose()
x = assignment_model.binary_var_matrix(costs.shape[0], costs.shape[1], name="a")
assignment_model.add_constraints((sum(x[i,j] for i in range (costs.shape[0])) <=1
for j in range (costs.shape[1])), names ="workers")
assignment_model.add_constraints((sum(x[i,j] for j in range (costs.shape[1])) ==1
for i in range (costs.shape[0])), names ="tasks")
obj_fn = sum(x[i,j]*costs[i,j] for i in range (costs.shape[0]) for j in range(costs.shape[1]))
assignment_model.set_objective('min', obj_fn)
assignment_model.print_information()
assignment_model.solve()
print('Optimization is done. Objective Function Value: %.2f' % assignment_model.objective_value)
for i in range(costs.shape[0]):
for j in range(costs.shape[1]):
if (x[i,j].solution_value>=0.9):
print('Worker ',i,' assigned to task ',j)
给出
Optimization is done. Objective Function Value: 265.00
Worker 0 assigned to task 3
Worker 1 assigned to task 2
Worker 2 assigned to task 1
Worker 3 assigned to task 0