pymprog库应用(四)值班问题

代码(数据)

import numpy as np

# 星期 \ 轮班
datas = [
	(1, 0, 0, 1, 1, 1, 1),
	(1, 1, 0, 0, 1, 1, 1),
	(1, 1, 1, 0, 0, 1, 1),
	(1, 1, 1, 1, 0, 0, 1),
	(1, 1, 1, 1, 1, 0, 0),
	(0, 1, 1, 1, 1, 1, 0),
	(0, 0, 1, 1, 1, 1, 1)
]

# 需求人数
datam = (
	20, 16, 13, 16, 19, 14, 12
)

# 星期
dataw = {
	0: '星期一', 1: '星期二', 2: '星期三',
	3: '星期四', 4: '星期五', 5: '星期六', 6: '星期日'
}

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("\n需求人数\n", b)
print("\n星期\n", c)

代码(模型)

from pymprog import *
import numpy as np

begin('ondutyt')

datas = np.load('a_datas.npy').tolist()  # 值班安排
datam = np.load('a_datam.npy').tolist()  # 需求人数
dataw = np.load('a_dataw.npy').tolist()  # 星期
x = var('x',len(datas),kind=int)          # 值班人数,决策变量

minimize(sum(x[i] for i in range(len(x))), '最少人数')  # 目标函数
for i in range(len(x)):                                  # 值班人数 >= 需求人数
	sum(datas[i][j]*x[j] for j in range(len(x))) >= datam[i]

def report():
    print("人员安排")
    for i in range(len(x)):
        if x[i].primal > 0.5:
            print(dataw[i]," :",int(x[i].primal)) 
    print('最少人数:',int(vobj()))

solve()
report()

end()

求解

人员安排
星期一 : 8
星期二 : 2
星期四 : 6
星期五 : 3
星期六 : 3
最少人数: 22

猜你喜欢

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