数模实验报告.docx
《数模实验报告.docx》由会员分享,可在线阅读,更多相关《数模实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
数模实验报告
数学建模与实验
实验报告
*******
院系:
仪器科学与工程学院
学号:
********
******
数学建模与实验实验报告
实验一
实验题目
(1)已知某平原地区的一条公路经过如下坐标所示的点,请采用样条插值绘出这条公路(不考虑公路的宽度)。
X/米
0
30
50
70
80
90
120
148
170
180
Y/米
80
64
47
42
48
66
80
120
121
138
X/米
202
212
230
248
268
271
280
290
300
312
Y/米
160
182
200
208
212
210
200
196
188
186
X/米
320
340
360
372
382
390
416
430
478
440
Y/米
200
184
188
200
202
240
246
280
296
308
X/米
420
380
360
340
320
314
280
240
200
/
Y/米
334
328
334
346
356
360
392
390
400
/
(2)对于上表给出的数据,估计公路长度。
实验过程
(1)第一问代码如下:
X=[0,30,50,70,80,90,120,148,170,180,202,212,230,248,268,271,280,290,300,312,320,340,360,372,382,390,416,430,478];
Y=[80,64,47,42,48,66,80,120,121,138,160,182,200,208,212,210,200,196,188,186,200,184,188,200,202,240,246,280,296];
%给出坐标点
xx=0:
1:
478;%选取0~478内的点
yy=spline(X,Y,xx);%样条插值法找出曲线
plot(X,Y,'p',xx,yy,'g');%绘出曲线图
x=[440,420,380,360,340,320,314,280,240,200];
y=[308,334,328,334,346,356,360,392,390,400];
holdon
xy=440:
-1:
200;
yx=spline(x,y,xy);
plot(x,y,'p',xy,yx,'g');
运行上述代码得到结果如下:
上图为所绘公路图
(2)代码如下:
X=[03050708090120148170180202212230248268271280290300312320340360372382390416430478440420380360340320314280240200];
Y=[80644742486680120121138160182200208212210200196188186200184188200202240246280296308334328334346356360392390400];
fork=1:
length(X)-1
len(k)=sqrt((X(k+1)-X(k))^2+(Y(k+1)-Y(k))^2);
end;
Len=sum(len);Len
运行得到结果如下:
即公路长为967.46米。
实验二
实验题目
二、面试排序问题
有4名同学到一家公司参加三个阶段的面试:
公司要求每个同学都必须首先找公司秘书初试,然后到部门主管处复试,最后到经理处参加面试,并且不允许插队(即在任何一个阶段4名同学的顺序是一样的)。
由于4名同学的专业背景不同,所以每人在三个阶段的面试时间也不同,如下表所示(单位:
分钟)。
这4名同学约定他们全部面试完以后一起离开公司。
假定现在时间是早晨8:
00,问他们最早何时能离开公司?
秘书初试
主管复试
经理面试
同学甲
13
15
20
同学乙
10
20
18
同学丙
20
16
10
同学丁
8
10
15
模型分析与建立
方法一:
假设:
同学甲、乙、丙、丁用i表示(i=1,2,3,4),秘书初试、主管复试和经理面试用j表示(j=1,2,3); 表示同学i的面试j时间,表示同学i到开始面试j之前所用时间.
优化目标:
MinT=Max{xi3+ti3}
约束条件:
1)时间先后次序约束(每人只有参加完前一个阶段的面试后才能进入下一个阶段):
xij+tij<=xi,j+1(i=1,2,3,4;j=1,2)
2)每个阶段j同一时间只能面试1名同学:
用0-1变量表示第k名同学是否排在第i名同学前面(1表示是,0表示否),则
xij+tij-xkj<=Tyik (i,k=1,2,3,4;j=1,2,3;i xkj+tkj-xij<=T(1-yik) (i,k=1,2,3,4;j=1,2,3;i将目标函数改写为:
MinT
s.t.
T>=x13+t13
T>=x23+t23
T>=x33+t33
T>=x43+t43
加上约束条件1),2),用LINGO求解得到:
结果如上图可知最短时间为84min。
Localoptimalsolutionfound.
Objectivevalue:
84.00000
Objectivebound:
84.00000
Infeasibilities:
0.1421085E-13
Extendedsolversteps:
55
Totalsolveriterations:
3871
VariableValueReducedCost
T84.000000.000000
X1336.000000.000000
T1320.000000.000000
X2356.000000.000000
T2318.000000.000000
X3374.000000.000000
T3310.000000.000000
X4321.000000.000000
T4315.000000.000000
T1113.000000.000000
T1215.000000.000000
T2110.000000.000000
T2220.000000.000000
T3120.000000.000000
T3216.000000.000000
T418.0000000.000000
T4210.000000.000000
X118.0000000.000000
X1221.000000.000000
X2121.000000.000000
X2236.000000.000000
X3131.000000.000000
X3256.000000.000000
X410.0000000.9999970
X4211.000000.000000
Y120.000000-83.99950
Y130.0000000.000000
Y141.00000083.99950
Y230.000000-83.99950
Y241.0000000.000000
Y341.0000000.000000
RowSlackorSurplusDualPrice
184.00000-1.000000
228.000000.000000
310.000000.000000
40.000000-0.9999970
548.000000.000000
60.000000-0.9999970
70.000000-0.9999970
80.0000000.000000
90.0000000.000000
100.000000-0.9999970
110.000000-0.9999970
120.0000000.000000
130.0000000.000000
140.000000-0.9999970
150.000000-0.9999970
160.0000000.000000
170.0000000.000000
180.0000000.9999970
190.0000000.000000
205.0000000.000000
210.0000000.9999970
225.0000000.000000
232.0000000.000000
243.0000000.000000
250.0000000.000000
260.0000000.000000
2710.000000.000000
2863.000000.000000
290.0000000.9999970
3020.000000.000000
3159.000000.000000
320.0000000.000000
3318.000000.000000
3449.000000.000000
350.0000000.000000
360.0000000.000000
370.0000000.9999970
3853.000000.000000
3939.000000.000000
4031.000000.000000
4133.000000.000000
4223.000000.000000
4321.000000.000000
4461.000000.000000
4541.000000.000000
460.0000000.9999970
4749.000000.000000
4833.000000.000000
490.0000000.000000
5046.000000.000000
5136.000000.000000
520.0000000.000000
5354.000000.000000
5448.000000.000000
5556.000000.000000
5613.000000.000000
5715.000000.000000
5820.000000.000000
5923.000000.000000
6035.000000.000000
6138.000000.000000
根据y12=0,y13=0,y14=1,y23=0,y24=1,y34=1,可知面试顺序为4-1-2-3,即:
丁-甲-乙-丙。
方法二:
实际上,这个问题就是要安排4名同学的面试顺序,是完成全部面试所花费的时间最少。
时间构成原始时间矩阵:
A(ij)=a11a12a13
a21a22a23
a31a32a33
a41a42a43
A(ij)=131520
102018
201610
81015
优化目标:
MinT=max(x(i3)+t(j3))
约束条件:
x(i,j)+t(i,j)<=x(i,j+i);i=1,2,3,4;j=1,2
(每个同学只能参加完前一阶段才能进入下一阶段的面试)
每阶段j同一时间只能面试i名同学;0-1变量y(i,k)表示第k名同学是否排在第i名同学前面(1表示“是”,0表示“否”)
x(i,j)+t(i,j)-x(k,j)<=200*y(i,k);i,k=1,2,3,4;ix(k,j)+t(k,j)-x(i,j)<=200*(1-y(i,k));i,k=1,2,3,4;i将非线性的优化目标改写成线性的优化目标:
MinTs.tT>=x(i3)+t(i3),i=1,2,3,4
根据建立的模型,编写出lingo程序代码,通过lingo软件运行结果如下:
由上图可知,最短时间为84min。
Globaloptimalsolutionfound.
Objectivevalue:
84.00000
Objectivebound:
84.00000
Infeasibilities:
0.1532108E-13
Extendedsolversteps:
8
Totalsolveriterations:
598
VariableValueReducedCost
NS4.0000000.000000
NP3.0000000.000000
TMAX84.000000.000000
T(S1,P1)13.000000.000000
T(S1,P2)15.000000.000000
T(S1,P3)20.000000.000000
T(S2,P1)10.000000.000000
T(S2,P2)20.000000.000000
T(S2,P3)18.000000.000000
T(S3,P1)20.000000.000000
T(S3,P2)16.000000.000000
T(S3,P3)10.000000.000000
T(S4,P1)8.0000000.000000
T(S4,P2)10.000000.000000
T(S4,P3)15.000000.000000
X(S1,P1)8.0000000.000000
X(S1,P2)21.000000.000000
X(S1,P3)36.000000.000000
X(S2,P1)26.000000.000000
X(S2,P2)36.000000.000000
X(S2,P3)56.000000.000000
X(S3,P1)36.000000.000000
X(S3,P2)56.000000.000000
X(S3,P3)74.000000.000000
X(S4,P1)0.0000001.000000
X(S4,P2)8.0000000.000000
X(S4,P3)21.000000.000000
Y(S1,S2)0.000000-200.0000
Y(S1,S3)0.0000000.000000
Y(S1,S4)1.000000200.0000
Y(S2,S3)0.000000-200.0000
Y(S2,S4)1.0000000.000000
Y(S3,S4)1.0000000.000000
RowSlackorSurplusDualPrice
10.0000000.000000
20.0000000.000000
35.0000000.000000
4172.00000.000000
50.0000001.000000
6165.00000.000000
70.0000000.000000
8162.00000.000000
915.000000.000000
10152.00000.000000
1120.000000.000000
12149.00000.000000
1318.000000.000000
14152.00000.000000
15179.00000.000000
160.0000001.000000
17172.00000.000000
183.0000000.000000
19165.00000.000000
200.0000000.000000
210.0000000.000000
22170.00000.000000
230.0000000.000000
24164.00000.000000
250.0000001.000000
26172.00000.000000
27164.00000.000000
2818.000000.000000
29152.00000.000000
3018.000000.000000
31147.00000.000000
3220.000000.000000
33144.00000.000000
3428.000000.000000
35136.00000.000000
3638.000000.000000
37137.00000.000000
3838.000000.000000
3984.00000-1.000000
4028.000000.000000
4110.000000.000000
420.0000001.000000
4348.000000.000000
440.0000001.000000
450.0000000.000000
460.0000000.000000
470.0000001.000000
480.0000000.000000
492.0000000.000000
500.0000000.000000
513.0000000.000000
由变量Y(S1,S2)的最优解值0.000000,知student1排在student2之前,即同学甲排在同学乙之前。
由变量Y(S1,S3)的最优解值为0.000000,知student1排在student3之前,即同学甲排在同学丙之前。
由变量Y(S1,S4)的最优解值为1.000000,知student4排在student1之前,即同学丁排在同学甲之前。
由变量Y(S2,S3)的最优解值为0.000000,知student2排在student3之前,即同学乙排在同学丙之前。
由变量Y(S2,S4)的最优解值为1.000000,知student4排在student2之前,即同学丁排在同学乙之前。
由变量Y(S3,S4)的最优解值为1.000000,知student4排在student3之前,即同学丁排在同学丙之前。
所以面试顺序为丁甲乙丙。
程序代码
方法一:
model:
min=T;
T>=x13+t13;
T>=x23+t23;
T>=x33+t33;
T>=x43+t43;
t11=13;t12=15;t13=20;
t21=10;t22=20;t23=18;
t31=20;t32=16;t33=10;
t41=8;t42=10;t43=15;
x11+t11<=x12;x12+t12<=x13;
x21+t21<=x22;x22+t22<=x23;
x31+t31<=x32;x32+t32<=x33;
x41+t41<=x42;x42+t42<=x43;
x11+t11-x21<=T*y12;x11+t11-x31<=T*y13;x11+t11-x41<=T*y14;
x12+t12-x22<=T*y12;x12+t12-x32<=T*y13;x12+t12-x42<=T*y14;
x13+t13-x23<=T*y12;x13+t13-x33<=T*y13;x13+t13-x43<=T*y14;
x21+t21-x31<=T*y23;x22+t22-x32<=T*y23;x23+t23-x33<=T*y23;
x21+t21-x41<=T*y24;x22+t22-x42<=T*y24;x23+t23-x43<=T*y24;
x31+t31-x41<=T*y34;x32+t32-x42<=T*y34;x33+t33-x43<=T*y34;
x21+t21-x11<=T*(1-y12);x31+t31-x11<=T*(1-y13);x41+t41-x11<=T*(1-y14);
x22+t22-x12<=T*(1-y12);x32+t32-x12<=T*(1-y13);x42+t42-x12<=T*(1-y14);
x23+t23-x13<=T*(1-y12);x33+t33-x13<=T*(1-y13);x43+t43-x13<=T*(1-y14);
x31+t31-x21<=T*(1-y23);x32+t32-x22<=T*(1-y23);x33+t33-x23<=T*(1-y23);
x41+t41-x21<=T*(1-y24);x42+t42-x22<=T*(1-y24);x43+t43-x23<=T*(1-y24);
x41+t41-x31<=T*(1-y34);x42+t42-x32<=T*(1-y34);x43+t43-x33<=T*(1-y34);
@bin(y12);@bin(y13);@bin(y14);@bin(y23);@bin(y24);@bin(y34);
end
方法二:
model:
sets:
students;!
学生集三阶段面试模型;
phases;!
阶段集;
sp(students,phases):
t,x;
ss(students,students)|&1#LT#&2:
y;
endsets
data:
students=s1..s4;
phases=p1..p3;
t=131520,102018,201610,81015;
enddata
ns=@size(students);!
学生数;
np=@size(phases);!
阶段数;
!
单个学生面试时间先后次序的约束;
@for(sp(i,j)|j#LT#np:
x(i,j)+t(i,j)<=x(i,j+1));
!
学生间的面试先后次序保持不变的约束;
@for(ss(i,k):
@for(phases(j):
x(i,j)+t(i,j)-x(k,j)<=200*y(i,k);
x(k,j)+t(k,j)-x(i,j)<=200*(1-y(i,k))));
!
目标函数;
min=TMAX;
@for(students(i):
x(i,3)+t(i,3)<=TMAX);
!
把y定义0-1变量;