fori=1:
n
ins=0;
forj=1:
length(s)
ifi==s(j)
ins=1;
end
end
ifins==0
v=i;
iflabel(v)>(label(u)+w(u,v))
label(v)=(label(u)+w(u,v));
f(v)=u;
end
end
end
%
v1=0;
k=inf;
fori=1:
n
ins=0;
forj=1:
length(s)
ifi==s(j)
ins=1;
end
end
ifins==0
v=i;
ifk>label(v)
k=label(v);
v1=v;
end
end
end
s(length(s)+1)=v1;
u=v1;
end
min=label(terminal);path
(1)=terminal;
i=1;
whilepath(i)~=start
path(i+1)=f(path(i));
i=i+1;
end
path(i)=start;
L=length(path);
path=path(L:
-1:
1);
求解下图中的最短路
求解过程:
输入输出:
>>x=
0218InfInfInfInfInfInfInf
20Inf61InfInfInfInfInfInf
1Inf07InfInf9InfInfInfInf
8670512InfInfInfInf
Inf1Inf503Inf21InfInf
InfInfInf1304Inf6InfInf
InfInf92Inf40Inf31Inf
InfInfInfInf2InfInf07InfInf
InfInfInfInfInf637012
InfInfInfInfInfInf1Inf101
InfInfInfInfInfInfInfInf210
>>start=1;
>>terminate=11;
>>[min,path]=dijkstra(x,start,terminate)
min=
6
path=
125911
结果分析:
即最短路径为:
v1→v2→v5→v9→v11,最短距离为:
16,手工计算的结果为:
上述两种结果一致。
总结:
通过编程,将最短路的算法加深了印象,也熟悉了matlab编程,颇有收获的一次实验,给力!
实验7最大流问题的编程实现
成绩
专业班级数学121学号201212010128姓名秦柯柯报告日期.
实验类型:
●验证性实验○综合性实验○设计性实验
实验目的:
熟练最大流问题的求解算法。
实验内容:
最大流问题的求解算法。
实验原理:
先给定初始可行流,然后找出可扩充路(增广链),调整可扩充路上的流量,使可行流增大,不断重复上述过程,直到不存在可扩充路为止。
实验步骤
1要求上机实验前先编写出程序代码
2编辑录入程序
3调试程序并记录调试过程中出现的问题及修改程序的过程
4经反复调试后,运行程序并验证程序运行是否正确。
5记录运行时的输入和输出。
预习编写程序代码:
实验报告:
根据实验情况和结果撰写并递交实验报告。
实验总结:
参考程序
使用lingo求解
model:
sets:
point/v1,v2,v3,v4,v5/;
route(point,point)/v1v2,v1v3,v2v3,v2v4,v4v3,v3v5,v4v5/:
transport,capacity;
endsets
data:
capacity=3212042;
enddata
max=z;
z=@sum(point(j)|@in(route,@index(point,v1),j):
transport(1,j));
@for(point(i)|i#ne#@index(point,v1)#and#i#ne#@index(point,v5):
@sum(point(j)|@in(route,i,j):
transport(i,j))=@sum(point(j)|@in(route,j,i):
transport(j,i)));
@for(route:
transport<=capacity);
end
运行结果:
Globaloptimalsolutionfound.
Objectivevalue:
5.000000
Totalsolveriterations:
0
VariableValueReducedCost
Z5.0000000.000000
TRANSPORT(V1,V2)3.0000000.000000
TRANSPORT(V1,V3)2.0000000.000000
TRANSPORT(V2,V3)1.0000000.000000
TRANSPORT(V2,V4)2.0000000.000000
TRANSPORT(V4,V3)0.0000000.000000
TRANSPORT(V3,V5)3.0000000.000000
TRANSPORT(V4,V5)2.0000000.000000
CAPACITY(V1,V2)3.0000000.000000
CAPACITY(V1,V3)2.0000000.000000
CAPACITY(V2,V3)1.0000000.000000
CAPACITY(V2,V4)2.0000000.000000
CAPACITY(V4,V3)0.0000000.000000
CAPACITY(V3,V5)4.0000000.000000
CAPACITY(V4,V5)2.0000000.000000
RowSlackorSurplusDualPrice
15.0000001.000000
20.0000001.000000
30.000000-1.000000
40.0000000.000000
50.000000-1.000000
60.0000000.000000
70.0000001.000000
80.0000001.000000
90.0000000.000000
100.0000001.000000
111.0000000.000000
120.0000001.000000
实验总结:
最大流问题的基本思路是:
先给出初始可行流,再找到可扩充路,不断进行优化,直至无法找到可扩充路为止。
实验8排队论与存储论问题的编程实现
成绩
专业班级数学121学号201212010128姓名秦柯柯报告日期.
实验类型:
●验证性实验○综合性实验○设计性实验
实验目的:
了解非线性规划的模型与求解算法。
实验内容:
实验原理
按照存储问题的基本模型类型,通过求解使总费用最小的优化问题,求出最优订购批量、生产批量、最大存储量和最大缺货量、订货周期、间隔等数量指标。
实验步骤
1要求上机实验前先编写出程序代码
2编辑录入程序
3调试程序并记录调试过程中出现的问题及修改程序的过程
4经反复调试后,运行程序并验证程序运行是否正确。
5记录运行时的输入和输出。
预习编写程序代码:
实验报告:
根据实验情况和结果撰写并递交实验报告。
实验总结:
参考程序
问题:
某电气公司的生产流水线需要某种零件,该零件需要靠订货得到。
为此公司考虑到了如下费用结构:
1)批量订购的订货费12000元/次
2)每个零件的单位成本10元/件
3)每个零件的存储费用0.3元/(件.月)
4)每个零件的缺货损失1.1元/(件.月)
Lingo求解:
min=0.5*C_P*(Q-S)^2/Q+C_D*D/Q+0.5*C_S*S^2/Q;
N=D/Q;
@gin(N);
data:
C_D=12000;
D=96000;
C_P=3.6;
C_S=13.2;
enddata
运行结果:
Localoptimalsolutionfound.
Objectivevalue:
81257.14
Extendedsolversteps:
3
Totalsolveriterations:
895
VariableValueReducedCost
C_P3.6000000.000000
Q32000.000.000000
S6857.1430.000000
C_D12000.000.000000
D96000.000.000000
C_S13.200000.000000
N3.000000-3085.704
RowSlackorSurplusDualPrice
181257.14-1.000000
20.000000-3085.704
实验9排队论问题的编程实现
成绩
专业班级数学121学号201212010128姓名秦柯柯报告日期.
实验类型:
●验证性实验○综合性实验○设计性实验
实验目的:
了解非线性规划的模型与求解算法。
实验内容:
实验原理
按照排队论的基本模型:
M/M/1、M/M/c等会计算排队系统的数量指标,包括队长、排队等待的队长、逗留时间、等待时间、忙期、闲期及排队系统的优化。
实验步骤
1要求上机实验前先编写出程序代码
2编辑录入程序
3调试程序并记录调试过程中出现的问题及修改程序的过程
4经反复调试后,运行程序并验证程序运行是否正确。
5记录运行时的输入和输出。
预习编写程序代码:
实验报告:
根据实验情况和结果撰写并递交实验报告。
实验总结:
参考程序
程序文件:
%*****************************************
%初始化顾客源
%*****************************************
%总仿真时间
Total_time=10;
%队列最大长度
N=10000000000;
%到达率与服务率
lambda=10;
mu=6;
%平均到达时间与平均服务时间
arr_mean=1/lambda;
ser_mean=1/mu;
arr_num=round(Total_time*lambda*2);
events=[];
%按负指数分布产生各顾客达到时间间隔
events(1,:
)=exprnd(arr_mean,1,arr_num);
%各顾客的到达时刻等于时间间隔的累积和
events(1,:
)=cumsum(events(1,:
));
%按负指数分布产生各顾客服务时间
events(2,:
)=exprnd(ser_mean,1,arr_num);
%计算仿真顾客个数,即到达时刻在仿真时间内的顾客数
len_sim=sum(events(1,:
)<=Total_time);
%*****************************************
%计算第1个顾客的信息
%*****************************************
%第1个顾客进入系统后直接接受服务,无需等待
events(3,1)=0;
%其离开时刻等于其到达时刻与服务时间之和
events(4,1)=events(1,1)+events(2,1);
%其肯定被系统接纳,此时系统内共有
%1个顾客,故标志位置1
events(5,1)=1;
%其进入系统后,系统内已有成员序号为1
member=[1];
fori=2:
arr_num
%如果第i个顾客的到达时间超过了仿真时间,则跳出循环
ifevents(1,i)>Total_time
break;
else
number=sum(events(4,member)>events(1,i));
%如果系统已满,则系统拒绝第i个顾客,其标志位置0
ifnumber>=N+1
events(5,i)=0;
%如果系统为空,则第i个顾客直接接受服务
else
ifnumber==0
%其等待时间为0
2009.1516
%PROGRAMLANGUAGEPROGRAMLANGUAGE
events(3,i)=0;
%其离开时刻等于到达时刻与服务时间之和
events(4,i)=events(1,i)+events(2,i);
%其标志位置1
events(5,i)=1;
member=[member,i];
%如果系统有顾客正在接受服务,且系统等待队列未满,则第i个顾客进入系统
elselen_mem=length(member);
%其等待时间等于队列中前一个顾客的离开时刻减去其到达时刻
events(3,i)=events(4,member(len_mem))-events(1,i);
%其离开时刻等于队列中前一个顾客的离开时刻加上其服
%务时间
events(4,i)=events(4,member(len_mem))+events(2,i);
%标识位表示其进入系统后,系统内共有的顾客数
events(5,i)=number+1;
member=[member,i];
end
end
end
end
%仿真结束时,进入系统的总顾客数
len_mem=length(member);
%*****************************************
%输出结果
%*****************************************
%绘制在仿真时间内,进入系统的所有顾客的到达时刻和离
%开时刻曲线图(stairs:
绘制二维阶梯图)
stairs([0events(1,member)],0:
len_mem);
holdon;
stairs([0events(4,member)],0:
len_mem,'.-r');
legend('到达时间','离开时间');%标签
holdoff;
gridon;%添加网格线
%绘制在仿真时间内,进入系统的所有顾客的停留时间和等
%待时间曲线图(plot:
绘制二维线性图)
figure;
plot(1:
len_mem,events(3,member),'r-*',1:
len_mem,events(2,member)+events(3,member),'k-');
legend('等待时间','停留时间');
gridon;
运行图像:
ans=
2.0092e+003
实验10运筹学综合应用
成绩
专业班级数学121学号201212010128姓名秦柯柯报告日期.
实验类型:
○验证性实验●综合性实验○设计性实验
实验目的:
培养用运筹理论与方法解决实际问题的能力。
实验内容:
自己发现生活、生产实际中的问题,建立其数学模型,进行求解,完成实验报告;或针对过去数学建模问题的某一部分进行建模求解,写出实验报告。
实验原理根据生活、生产实际中的问题特征,综合运筹学所学理论与方法建立相应的模型,设计求解算法,求出问题的解。
实验步骤
1要求上机实验前先编建立模型、设计求解算法、写出程序代码
2编辑录入程序
3调试程序并记录调试过程中出现的问题及修改程序的过程
4经反复调试后,运行程序并验证程序运行是否正确。
5记录运行时的输入和输出。
预习编写程序代码:
实验报告:
根据实验情况和结果撰写并递交实验报告。
实验总结:
参考程序
问题:
某公司有甲乙两个工厂生产两种产品,这两种产品要运到南北两个地区出售。
相关信息见表格,产品分别有两个工厂中的两个车间来完成。
公司希望采取一些措施来提高经济效益,为此要弄清楚应该关注哪些问题,是扩大销量还是改善工厂的瓶颈问题?
如果扩大销量,首先扩大哪个市场以及首先扩大哪种产品?
如果要增加工厂的有效工时,应首先关注哪一家工厂的哪个车间?
分析:
这是一个线性规划问题,重点在建模并用对偶理论进行分析。
产品收益=售价-销售费用-单价生产成本-单价运费
建模:
销量限制:
,工时限制:
故可建立模型:
s.t
求解:
下面用matlab求解:
1)建立函数文件:
function[sol,val,kk]=ssimplex(A,N)
%--求解标准型线性规划:
maxc*x;s.t.A*x=b;x>=0
%--A:
初始单纯形表,(包括:
第一行为c,最后一行是初始的检验数,最后一列是资源向量b)
%--N:
初始的基变量的下标
%--sol:
是最优解
%--val:
是最优值
%--kk:
是迭代次数
[mA,nA]=size(A);
kk=0;%迭代次数
flag=1;
whileflag
kk=kk+1;
ifA(mA,:
)<=0%已找到最优解
flag=0;
sol=zeros(1,nA-1);
fori=1:
mA-1
sol(N(i))=A(i,nA);
end
val=-A(mA,nA);
else
fori=1:
nA-1
ifA(mA,i)>0&A(1:
mA-1,i)<=0%问题有无界解
disp('haveinfinitesolution!
');
flag=0;
break;
end
end
ifflag%还不是最优表,进行转轴运算
temp=0;
fori=1:
nA-1
ifA(mA,i)>temp
temp=A(mA,i);
inb=i;%进基变量的下标
end
end
sita=zeros(1,mA-1);
fori=1:
mA-1
ifA(i,inb)>0
sita(i)=A(i,nA)/A(i,inb);
end
end
temp=inf;
fori=1:
mA-1
ifsita(i)>0&sita(i)temp=sita(i);
outb=i;%出基变量下标
end
end
%以下更新N
fori=1:
mA-1
ifi==outb
N(i)=inb;
end
end
%以下进行转轴运算
A(outb,:
)=A(outb,:
)/A(outb,inb);
fori=1:
mA
ifi~=outb
A(i,:
)=A(i,:
)-A(outb,:
)*A(i,inb);
end
end
end
end
end
2)输入输出:
>>A=[1000100010000000009000;
0100010001000000007500;
00100010001000000012000;
0001000100010000006000;
1.51.5000000000010000012000;
00220000000001000016000;
11220000000000100030000;
0000110000000001008000;
00000022000000001022000;
00002.52.52.52.5000000000140000;
2356245700000000000;
];
>>N=[9101112131415161718];
>>[sol,val,kk]=ssimplex(A,N)
sol=
8000500075008000400006000
val=
156500
kk=
3
故最优解为(8000,500,0,7500,8000,4000,0,6000),最优值为156500。
3)分析:
与本问题对应的线性规划问题中各约束条件对应的影子价格为:
w*=(0,3,5,7,|1.333,0,0,2,0,0)
由影子价格可知:
(1)销售方面:
首先应当考虑增加产品乙在北部的销量(7最大),其次考虑产品乙在南部的销售量(5次大),再考虑增加产品甲在北部的销售量(3次大),其余的由于影子价格为零,故不用考虑。
(2)工时方面:
首先