背景:
自己读研期间曾经用matlab做过一些小项目和实验,自己的毕业论文实验仿真也是用的matlab,最近打算更换电脑,在翻阅电脑磁盘的时候找到了一些和matlab相关的代码和文档,简单整理和分享一下。
说明:
Matlab是一个高级的矩阵/阵列语言,它包含控制语句、函数、数据结构、输入和输出和特点。用户可以在命令窗口中将输入语句与执行命令同步,也可以先编写好一个较大的复杂的应用程序(M文件)后再一起运行。新版本的MATLAB语言是基于最为流行的C++语言基础上的,因此语法特征与C++语言极为相似,而且更加简单,更加符合科技人员对数学表达式的书写格式。本文主要使用matlab来实现运筹学中线性规划问题的求解。
案列:
某饭店24小时中需要服务员数量如下表,如果每个服务员连续工作8小时,试问在2点、6点、10点、14点、18点、22点开始上班的服务员为多少时,一天所需服务员人数最少?
时间 2-6 6-10 10-14 14-18 18-22 22-2
最少服务员 4 8 10 7 12 4
建模思路:
1.设在2点、6点、10点、14点、18点、22点开始上班的服务员分别为 x1,x2,x3,x4,x5,x6
2. 根据题目中所给条件建立目标函数和约束条件方程组
3. 目标函数是: Max x1+x2+x3+x4+x5+x6
4. 约束条件是:
st x1+x6>=4
x1+x2>=8
x2+x3>=10
x3+x4>=7
x4+x5>=12
x5+x6>=4
编程:
clc;
clear;
c=[1 1 1 1 1 1];
A=[-1 0 0 0 0 -1;-1 -1 0 0 0 0;0 -1 -1 0 0 0;0 0 -1 -1 0 0;0 0 0 -1 -1 0; 0 0 0 0 -1 -1 ];
b=[-4; -8; -10; -7; -12; -4];
vlb=[0;0;0;0;0;0];
vub=[];
Aeq=[];
beq=[];
[x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub);
运行结果:
求出结果为 fval=26 ,即总人数为26人。得到了目标函数的值,需要查看各个时间段的人数:
x =
2.7154
6.9396
3.0604
6.4597
5.5403
1.2846
由题意可知,人数不可能为小数,这是一个线性的整数规划问题,于是我们尝试用lindo软件:
输入
Min x1+x2+x3+x4+x5+x6
st
x1+x6>=4
x1+x2>=8
x2+x3>=10
x3+x4>=7
x4+x5>=12
x5+x6>=4
end
gin 6
得到结果为
1) 26.00000
VARIABLE VALUE REDUCED COST
X1 0.000000 1.000000
X2 8.000000 1.000000
X3 2.000000 1.000000
X4 12.000000 1.000000
X5 0.000000 1.000000
X6 4.000000 1.000000
所以在2点,6点,10点,14点,18点,22点开始上班的服务员分别为 0 ,8 ,2,12, 0, 4 一共26人,将所得结果与matlab结果对比检验,总人数都为26人。