pymprog库应用(二)任务分配

问题分析

分配任务,使得总费用最少。

代码(数据)

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

猜你喜欢

转载自blog.csdn.net/weixin_40775077/article/details/84547863