无法使用ILOG CPLEX优化器解决分配问题



分配问题来自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

最新更新