运筹学实验_指派问题

#教学任务指派问题

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()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值