python线性规划(linear programming)与分配问题(assignment problem)

版权声明:本文为博主ouening原创文章,未经博主允许不得恶意复制转载,需要注明出处,尊重知识成果!技术交流请联系[email protected]! https://blog.csdn.net/ouening/article/details/83422785

软件库:scipy.optimize
相关函数:
1.scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simplex', callback=None, options=None)

2.scipy.optimize.linear_sum_assignment(cost_matrix)

第一点线性规划问题,考虑下面优化问题:

Minimize: f = -1*x[0] + 4*x[1]

Subject to: -3*x[0] + 1*x[1] <= 6
1*x[0] + 2*x[1] <= 4
x[1] >= -3
where: -inf <= x[0] <= inf

求解代码如下:

c = [-1, 4]
A = [[-3, 1], [1, 2]]
b = [6, 4]
x0_bounds = (None, None)
x1_bounds = (-3, None)
from scipy.optimize import linprog
res = linprog(c, A_ub=A, b_ub=b, bounds=(x0_bounds, x1_bounds),
              options={"disp": True})

print(res)

第二点问题,分配问题,帮助文档给出的参考文献是http://csclab.murraystate.edu/bob.pilgrim/445/munkres.html,大体意思如下:假设有3个工人(workers)a,b,c,d,有三项任务(job)p,q,r,s,每个工人干每一项活的成本都不同(可以理解为不同工人的技术能力不同,薪资待遇也不同),那么便可构造一个代价矩阵(cost matrix)C
在这里插入图片描述
(注:图片来源于http://csclab.murraystate.edu/~bob.pilgrim/445/munkres.html)
下面使用linear_sum_assignment求解最佳任务分配问题:

import numpy as np
from scipy.optimize import linear_sum_assignment

# 代价矩阵
cost = np.array([[4, 1, 3], [2, 0, 5], [3, 2, 2]])

r, c = linear_sum_assignment(cost) # 得到最佳分配下的行列索引值
print(cost[r,c])

print("最小成本:",cost[r, c].sum())

结果:

[[4 1 3]
 [2 0 5]
 [3 2 2]]
[1 2 2]
最小成本: 5

当工人数大于任务数的时候,也会计算出最佳分配结果:

import numpy as np
from scipy.optimize import linear_sum_assignment

# 代价矩阵
cost = np.array([[4, 1, 3], [2, 0, 5], [3, 6, 5], [3, 5, 3]])
print(cost)
r, c = linear_sum_assignment(cost) # 得到最佳分配下的行列索引值
print(cost[r,c])

print("最小成本:",cost[r, c].sum())

结果如下:

[[4 1 3]
 [2 0 5]
 [3 6 5]
 [3 5 3]]
[1 2 3]
最小成本: 6

当任务数大于工人数时,如果要求任务数都要完成,那么有些工人可能就要完成多个任务,这种情况下如果任然使用该方法求解是不行的,因为该方法总是返回某一工人对应某一任务最佳分配的结果,需要另找其他方法实现。

参考链接:
[1]https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linear_sum_assignment.html#scipy.optimize.linear_sum_assignment
[2]http://csclab.murraystate.edu/~bob.pilgrim/445/munkres.html

猜你喜欢

转载自blog.csdn.net/ouening/article/details/83422785