指派授课问题

现有A、B、C、D四门课程,需由甲、乙、丙、丁四人讲授,并且规定:

每人只讲且必须讲1门课;每门课必须且只需1人讲。

四人分别讲每门课的费用示于表中:

费用

A

B

C

D

2

10

9

7

15

4

14

8

13

14

16

11

4

15

13

9

带包python代码:

from scipy.optimize import linear_sum_assignment
import numpy as np#cost =np.array([[4,1,3],[2,0,5],[3,2,2]])
cost =np.array([
[2,10,9,7],
[15,4,14,8],
[13,14,16,11],
[4,15,13,9]])
row_ind,col_ind=linear_sum_assignment(cost)
print(row_ind)#开销矩阵对应的行索引
print(col_ind)#对应行索引的最优指派的列索引
print(cost[row_ind,col_ind])#提取每个行索引的最优指派列索引所在的元素,形成数组
print(cost[row_ind,col_ind].sum())#数组求和#输出指派矩阵
p = np.zeros((4,4))
p[row_ind,col_ind]=1
print(p)

暴力python代码:

# -*- coding: utf-8 -*-
import numpy as np
import copyc=[2,10,9,7,
15,4,14,8,
13,14,16,11,
4,15,13    ,9
]c = np.array(c)
c = c.reshape((4,4))all_p=[]class obj:def _init_(self):self.p=[]self.cost=0for i in range(4):for j in range(4):if j==i:continue   for u in range(4):if u==i or u==j :continuefor v in range(4):if v==i or v==j or v==u:continuep = np.zeros((4,4))p[0,i]=p[1,j]=p[2,u]=p[3,v]=1 ans = obj()ans.p = copy.deepcopy(p)ans.cost = sum(sum(c*ans.p))all_p.append(ans)all_p.sort(key=lambda ans: ans.cost, reverse=False)
print(all_p[0].p)
print(all_p[0].cost)        

我写的matlab:

clear
C=[2    10    9    7
15    4    14    8
13    14    16    11
4    15    13    9];A = perms(1:4);%perm显示1,2,3,4四个数的全排列
L = length(A)
best=999
best_mat=[]
for i=1:La = zeros(4,4);b = A(i,:);%遍历全排列中的每一种  c = 1:4;a(sub2ind(size(a), b, c))=1;%a矩阵指定的位置赋值为1s = sum(sum(a.*C));%求出费用和if best>s %挑出最大的best_mat=a;best=s;end
end
best_mat
best

  

老师的matlab代码1:

clear
n=4;
A=perms(1:n);
G=size(A);  %24 4   size(A,1) 24   size(A,2) 24
n0=G(1);   %24
B=[2,10,9,7;15,4,14,8;13,14,16,11;4,15,13,9];
for n1=1:n0%C为第n1中排列情况下,费用的4个取值C(1)=B(1,A(n1,1));C(2)=B(2,A(n1,2));C(3)=B(3,A(n1,3));C(4)=B(4,A(n1,4));%D{n1}表示第n1种情况下的4个取值D{n1}=[C(1),C(2),C(3),C(4)];s(n1)=sum(D{n1});
end
%找到最小的,返回a为行左边,b为纵坐标,a=1,b=9
[a,b]=find(s==min(s));
K=A(b,:)

根据老师的代码改进我的代码:

clear
C=[2   10  9   7
15  4   14  8
13  14  16  11
4   15  13  9];A = perms(1:4);%perm显示1,2,3,4四个数的全排列
L = length(A)
for i=1:La = zeros(4,4);b = A(i,:);%遍历全排列中的每一种  c = 1:4;a(sub2ind(size(a), b, c))=1;%a矩阵指定的位置赋值为1D{i}=a;S(i)=sum(sum(a.*C));%求出费用和
end
[a,b]=find(S==min(S))
D{b}
S(b)

  

老师的matlab代码2:随机生成,不是很好,看运气

clear
A=[2 15 13 4];B=[10 4 14 15];C=[9 14 16 13];D=[7 8 11 9];
Y=zeros(1,1000);s=64;x=zeros(1,4);
for i= 1:1000X=randperm(4);Y(i)=A(X(1))+B(X(2))+C(X(3))+D(X(4));if Y(i)<ss=Y(i);x=X;end
end
s,x

网上常见的matlab代码:

%适用于任意n阶系数矩阵
clear all;
C=[2   10  9   7,
15  4   14  8,
13  14  16  11,
4   15  13  9,
];%效率矩阵C
n=size(C,1);%计算C的行列数n
C=C(:);%计算目标函数系数,将矩阵C按列排成一个列向量即可。
A=[];B=[];%没有不等式约束
Ae=zeros(2*n,n^2);%计算等约束的系数矩阵a
for i=1:nfor j=(i-1)*n+1:n*iAe(i,j)=1;endfor k=i:n:n^2Ae(n+i,k)=1;end
end
Be=ones(2*n,1);%等式约束右端项b
Xm=zeros(n^2,1);%决策变量下界Xm
XM=ones(n^2,1);%决策变量上界XM
[x,z]=linprog(C,A,B,Ae,Be,Xm,XM);%使用linprog求解
x=reshape(x,n,n);%将列向量x按列排成一个n阶方阵
disp('最优解矩阵为:');%输出指派方案和最优值
Assignment=round(x)%使用round进行四舍五入取整
disp('最优解为:');
z

线性规划matlab代码:

%线性规划
c=[2,10,9,7,15,4,14,8,13,14,16,11,4,15,13,9];
Aeq=[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0;0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0;0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0;0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1;1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0;0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0;0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0;0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1];
beq=[1,1,1,1,1,1,1,1];
lb=zeros(16,1);
ub=ones(16,1);
[x,fval] = linprog(c,[],[],Aeq,beq,lb,ub)

  

转载于:https://www.cnblogs.com/caiyishuai/p/11175920.html

数学建模python matlab 编程(指派问题)相关推荐

  1. 数学建模python matlab 编程(椭圆声学原理画图证明,解析几何)

    证明,在椭圆形的音乐厅内,从一个椭圆的一个焦点发出声音,则另一个焦点听到的声音是最大的. 分析:证明,从椭圆的一个焦点任意发射的直线经过反射后,并经过另一个焦点.            画图,过一个焦 ...

  2. 数学建模python matlab 编程(喷泉模拟)

    在无风情况下的喷泉模拟 我的python代码 import numpy as np import random import matplotlib matplotlib.rcParams['font. ...

  3. 线性正切制导 matlab编程实现,数学建模之MATLAB编程

    EverydayOneCat ✖️N 「Sushi shop!」 知识点 1.下载 链接:https://pan.baidu.com/s/1DbfysOOwIoSvt8HQUw0jhw 提取码:75m ...

  4. 数学建模之MATLAB编程

    EverydayOneCat

  5. 数学建模python实现基础编程练习1

    数学建模python实现编程练习1 习题来自<python数学实验与建模> 1.利用sympy库进行画单叶双曲面 用pyplot画的不是很理想,就用sympy画了,利用plot3D函数 f ...

  6. 数学建模matlab和python_参加数学建模用 MATLAB,还是 Python?

    你应该学习吉他还是钢琴?你应该学习足球还是篮球?你应该学习化学还是物理学?这些问题的答案取决于你的兴趣点在哪里,方向选择是什么,而后再说选什么 :让我们借助比较通俗的方式切入,来讨论Matlab和Py ...

  7. 数学建模python实现基础编程练习4

    数学建模python实现基础编程练习4 1.使用networkx实现最短路和最短距离 import networkx as nx list1 = [(1,2,7),(1,3,3),(1,4,12),( ...

  8. 数学建模用matlab还是python_参加数学建模用 MATLAB,还是 Python?

    ) X Q# ~ v# e' N2 [, @0 K9 B4 C" g 参加数学建模用 MATLAB,还是 Python?作者:薛定谔的猫4 V4 q6 W" }8 m6 J9 H# ...

  9. 卓金武——从数学建模到MATLAB

    卓金武--从数学建模到MATLAB 2013-9-4 09:48| 发布者: ilovematlab| 查看: 9647| 评论: 40 摘要: 人物简介--卓金武(Steven),MathWorks ...

  10. 清风:数学建模算法、编程和写作培训

    清风:数学建模算法.编程和写作培训 一.评价模型 1.1 层次分析法 1.2 代码详解 1.3 模型拓展 1.4 课后作业 二.插值与拟合模型 三.相关性模型 四.回归模型 五.图论模型 六.分类问题 ...

最新文章

  1. C#语言与面向对象技术(3)
  2. mysql常用linux命令大全_Linux-MySQL常用命令(示例代码)
  3. 数组元素倒置-Java
  4. Boost:是否支持sse2指令的测试程序
  5. css 一行显示_CSS笔记1
  6. console类详细解释
  7. 数据库缓冲池_块缓冲| 数据库管理系统
  8. 通过bginfo小工具让用户自己查看用户名与IP地址信息
  9. h5物体拖动_html5实现拖拽效果
  10. 管理感悟:方案能力与解决问题能力
  11. [转]关于管理的经典故事(员工激励)
  12. paraview参考手册6:远程并行可视化
  13. 【开发心得】微信网页应用授权登录
  14. 透镜成像、眼球成像、小孔成像原理
  15. python中怎么用format居中_python中format函数
  16. 学临床专业和计算机哪个好,大学里“炙手可热”的专业,未来10年也不会被淘汰,发展前景更好...
  17. win10右键一直转圈_【雷粉百科】windows10鼠标点击右键出现卡顿或者转圈
  18. 银行利率bp是什么意思,利率bp怎么换算
  19. Tensorflow 自然语言处理
  20. 6500字详解数据中台,一份完整的数据中台手册!

热门文章

  1. java deadlock oracle_【DEADLOCK】Oracle“死锁”模拟
  2. 服务器 python cant open file_如何删除分析*。gcda:无法打开python virtualenv builder出错?...
  3. 最后1天!阿里云双11拼团入官方热荐团直享最低折扣!还有机会瓜分百万现金!...
  4. centos6.9下设置nginx服务开机自动启动
  5. 2017 4月26日上午
  6. MongoDB学习之简介、下载、安装
  7. c++ makefile和cmake
  8. sklearn datasets 库使用说明
  9. FM、LFM、AFM、NFM、DeepFM、 Deep Cross Network
  10. 关于Request.params的知识收藏