数学建模python matlab 编程(指派问题)
指派授课问题
现有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 copy c=[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=0 for i in range(4):
for j in range(4):
if j==i:
continue
for u in range(4):
if u==i or u==j :
continue
for v in range(4):
if v==i or v==j or v==u:
continue p = 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:L
a = zeros(4,4);
b = A(i,:);%遍历全排列中的每一种
c = 1:4;
a(sub2ind(size(a), b, c))=1;%a矩阵指定的位置赋值为1
s = 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:L
a = zeros(4,4);
b = A(i,:);%遍历全排列中的每一种
c = 1:4;
a(sub2ind(size(a), b, c))=1;%a矩阵指定的位置赋值为1
D{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:1000
X=randperm(4);
Y(i)=A(X(1))+B(X(2))+C(X(3))+D(X(4));
if Y(i)<s
s=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:n
for j=(i-1)*n+1:n*i
Ae(i,j)=1;
end
for k=i:n:n^2
Ae(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)
数学建模python matlab 编程(指派问题)的更多相关文章
- 数学建模python matlab 编程(疾病传播模型)
例12:一只游船上有800(1000)人,一名游客不慎患传染病,12(10)小时后有3人发病,由于船上不能及时隔离,问经过60(30)小时,72小时,患此病的人数.(与人口模型和Logistic模型类 ...
- 数学建模python matlab 编程(随机游走问题)
1 (1). 随机游走问题.在-10到10的一维线段上,质点以1/5的概率用左运动1单位,以2/5的概率停止不动,以2/5的概率向右运动2单位,且碰到-10时向右运动3单位,碰到10时向左运动4单位. ...
- 数学建模python matlab 编程(喷泉模拟)
在无风情况下的喷泉模拟 我的python代码 import numpy as np import random import matplotlib matplotlib.rcParams['font. ...
- 数学建模python matlab 编程(椭圆声学原理画图证明,解析几何)
证明,在椭圆形的音乐厅内,从一个椭圆的一个焦点发出声音,则另一个焦点听到的声音是最大的. 分析:证明,从椭圆的一个焦点任意发射的直线经过反射后,并经过另一个焦点. 画图,过一个焦 ...
- 在数学建模中学MATLAB
为期三周的数学建模国赛培训昨天正式结束了,还是有一定的收获的,尤其是在MATLAB的使用上. 1. 一些MATLAB的基础性东西: 元胞数组的使用:http://blog.csdn.net/z1137 ...
- 【数学建模】MatLab 数据读写方法汇总
1.读入 txt 文件数据. load xxx.txt A=load(‘xxx.txt’) A=dlmread(‘xxx.txt’) A=importdata(‘xxx.txt’) 例:将身高体重的 ...
- 【数学建模】MATLAB语法
一.向量.矩阵的表示和使用 format long %小数很多format short %默认4位小数format rat %显示最近的分数format short e %指数格式的数 尾数多少 e ...
- 【数学建模】MATLAB学习笔记——函数式文件
MATLAB学习笔记——函数式文件 引入函数式文件 说明: 函数式文件主要用于解决计算中的参数传递和函数调用的问题. 函数式的标志是它的第一行为function语句. 函数式文件可以有返回值,也可以没 ...
- Matlab 多个版本的安装包下载、安装和激活教程 + 多套数学建模视频教程
目录 1. 关键词 1.1. 说明 2. 下载地址 2.1. OneDrive高速云盘 2.1.1. 多版本的安装包 2.1.2. 多套数学建模的视频教程 2.2. 百度云 3. 安装教程 1. 关键 ...
随机推荐
- OSI七层协议和TCP/IP四层协议
1. OSI七层和TCP/IP四层的关系 1.1 OSI引入了服务.接口.协议.分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型. 1.2 OSI先有模型,后有协议,先有标准,后进行 ...
- php 把数字拆分成数组
用str_split $a = 1234567890; //拆分数字为数组 var_dump( str_split($a, 1) ); 打印结果 : Array ( [0] =2 [1] =5 )
- java与JSON
XML 格式数据极其的冗长.因为每个离散的数据片段需要大量的 XML 结构,所有有效 的数据的比例非常低.XML 语法还有轻微的模糊.还有,解析 XML 是非常占程序员的精力的.你需要提前了解详细的结 ...
- bat 读取 ini 文件
bat 读取 ini 文件 参考链接:https://stackoverflow.com/questions/2866117/windows-batch-script-to-read-an-ini-f ...
- 【测试代码执行时间】console.time + console.timeEnd 打印输出耗时
// 计时开始,内部文字为计时ID,开始要和结束保持一致 console.time('计时器1') // 需要测试执行时间的代码 for (let index = 0; index < 1000 ...
- JS中BOM和DOM之间的关系
一.Javascript组成JavaScript的实现包括以下3个部分:1.核心(ECMAScript):描述了JS的语法和基本对象.2.文档对象模型 (DOM):处理网页内容的方法和接口.3.浏览器 ...
- Kettle安装和简单使用
Kettle安装和使用 安装 安装之前需要准备的环境为Java环境,需要提前配置好jdk 下载之后,解压即可使用. 使用 1.因为该工具主要是对数据库进行操作,所以需要提前将mysql的jar包放到l ...
- Spring boot连接3.03以上的mongodb 权限验证问题
由于3.0.3,mongodb加入了SCRAM-SHA-1校验方式,需要第三方工具配合进行验证,所有Spring boot连接MongoDB时会出现用户认证失败. 解决方法: > use adm ...
- 【Android-连接数据库】 直接连接SqlServer数据库
一.测试过的开发环境 Eclispse + SqlServer2008R2 二.下载支持Android的SQL驱动 只能下载1.2.7版本的,将 jtds-1.2.7.jar 包放在android项目 ...
- Visual Studio 查看宏展开
使用Visual Studio 开发c++项目,中遇到项目中宏定义套宏定义,难以阅读源代码的时候. 可在 项目-->右键-->配置属性-->c/c++ -->预处理器 --&g ...