#教学任务指派问题
import numpy as np
from scipy.optimize import linear_sum_assignment
#这个函数是用来求效率问题,也就是极小化问题
def printf(row_ind,col_ind,goodAt):#输出
print("最优解:")
for i in range(len(row_ind)):
print("x_{}{}=1".format(row_ind[i]+1,col_ind[i]+1),end='; ')
print("\n 最优解对应的系数为:")
for i in range(len(row_ind)):
print("c_{}{}={}".format(row_ind[i]+1,col_ind[i]+1,goodAt[row_ind,col_ind][i]),end='; ')
print()
#教师与课程一样多
#各个教师对各个课的擅长程度矩阵
def mainSection(goodAt):#极大转极小
print("初始矩阵:\n", goodAt)
weakAt=20-goodAt
row_ind,col_ind=linear_sum_assignment(weakAt)
#print(row_ind)#开销矩阵对应的行索引
#print(col_ind)#对应行索引的最优指派的列索引
#print(goodAt[row_ind,col_ind])#提取每个行索引的最优指派列索引所在的元素,形成数组
print("最优值:",goodAt[row_ind,col_ind].sum())#数组求和
printf(row_ind,col_ind,goodAt)
def mainSection1(goodAt):#极小
print("初始矩阵:\n", goodAt)
row_ind,col_ind=linear_sum_assignment(goodAt)
#print(row_ind)#开销矩阵对应的行索引
#print(col_ind)#对应行索引的最优指派的列索引
#print(goodAt[row_ind,col_ind])#提取每个行索引的最优指派列索引所在的元素,形成数组
print("最优值:",goodAt[row_ind,col_ind].sum())#数组求和
printf(row_ind,col_ind,goodAt)
print("\n")
def test1():
goodAt =np.array([[18,5,7,16],[10,16,6,5],[11,6,4,7],[13,12,9,11]])
mainSection(goodAt)
def test2():
#人多事少
print("非平衡的指派问题,虚设两项收益为0的任务,化为平衡指派问题")
goodAt =np.array([[-3,-5,-4,-5,0,0],
[-6,-7,-6,-8,0,0],
[-8,-9,-8,-10,0,0],
[-10,-10,-9,-11,0,0],
[-12,-11,-10,-12,0,0],
[-13,-12,-11,-13,0,0]])
mainSection1(goodAt)
def test3():
#人多事少
print("人数与工作不等的指派问题")
goodAt =np.array([[4,8,7,15,0],[12,9,2,14,0],[6,9,12,8,0],[11,7,17,6,0],[6,9,12,10,0]])
mainSection1(goodAt)
def test4():
#一人多用
print("一个人可以做几项工作的指派问题,A1可以做3项工作")
goodAt =np.array([[2,5,9,1,3],[6,7,4,2,8],[9,2,3,8,7],[2,5,9,1,3],[2,5,9,1,3]])
mainSection1(goodAt)
def test5():
#一项工作一定不能由某人做
print("一项工作一定不能由某人做")
goodAt =np.array([[2,5,9,1000,3],[6,7,4,2,8],[9,2,1000,8,7],[1,6,4,9,2],[8,7,2,5,4]])
mainSection1(goodAt)
def test6():
#一项工作一定不能由某人做
print("一项工作一定不能由某人做")
goodAt =np.array([[12,8,9,7,9],[8,9,6,5,6],[7,10,12,14,9],[15,7,6,8,10],[6,10,8,10,9]])
mainSection1(goodAt)
def test6():
#一项工作一定不能由某人做
print("一项工作一定不能由某人做")
goodAt =np.array([[-8,-7,-6,-5,-7,-6],[-8,-7,-6,-5,-7,-6],[-9,-10,-8,-8,5,-4],[-9,-10,-8,-8,5,-4],[-7,-6,-9,-6,-9,-9],[-7,-6,-9,-6,-9,-9]])
mainSection1(goodAt)
test2()
test3()
test4()
test5()
test6()
运筹学实验_指派问题
最新推荐文章于 2024-04-25 14:31:41 发布