问题分析
分配任务,使得总费用最少。
代码(数据)
import numpy as np
# 工人
r = ('甲', '乙', '丙', '丁')
# 工作
c = ('A', 'B', 'C', 'D')
# 工人 \ 工作 费用
x = [
(15, 18, 21, 14),
(19, 23, 22, 18),
(26, 17, 16, 19),
(19, 21, 23, 17)
]
def main():
global r, c, x
datas = dict()
for i in r:
for j in c:
datas[i, j] = x[r.index(i)][c.index(j)]
# 工人
datam = dict()
for i in range(len(r)):
datam[i] = r[i]
# 工作
dataw = dict()
for j in range(len(c)):
dataw[j] = c[j]
np.save('a_datas.npy', datas)
np.save('a_datam.npy', datam)
np.save('a_dataw.npy', dataw)
a = np.load('a_datas.npy')
b = np.load('a_datam.npy')
c = np.load('a_dataw.npy')
print("工人 \ 工作 时间\n", a)
print()
print("工人\n", b)
print()
print("工作\n", c)
if __name__ == "__main__":
main()
代码(模型)
from pymprog import *
import numpy as np
begin('assigntment')
datas = np.load('a_datas.npy').tolist() # 工人 -> 工作 时间
datam = np.load('a_datam.npy').tolist() # 工人
dataw = np.load('a_dataw.npy').tolist() # 工作
x = var('x', datas.keys(), bool) # 分配决策,0/1
minimize(sum(datas[i, j] * x[i, j] for i, j in datas.keys()), 'Time')
for i in datam.values(): # 每个人只做一个工作
sum(x[i, j] for j in dataw.values()) == 1
for j in dataw.values(): # 每个工作仅且由一个人做
sum(x[i, j] for i in datam.values()) == 1
def report():
print("\n任务分配决策(最优之一)")
for i, j in datas.keys():
if x[i, j].primal > 0.5:
print("工人:%s -> 工作:%s 费用:%d" % (i, j, datas[i, j]))
print("\n总费用:%g" % vobj())
solve()
report()
end()
结果
任务分配决策(最优之一)
工人:甲 -> 工作:B 费用:18
工人:乙 -> 工作:A 费用:19
工人:丙 -> 工作:C 费用:16
工人:丁 -> 工作:D 费用:17
总费用:70