数学建模实验一数学规划模型AMPL求解.docx
《数学建模实验一数学规划模型AMPL求解.docx》由会员分享,可在线阅读,更多相关《数学建模实验一数学规划模型AMPL求解.docx(15页珍藏版)》请在冰豆网上搜索。
数学建模实验一数学规划模型AMPL求解
实验一:
数学规划模型AMPL求解
专业年级:
2014级信息与计算科学1班
姓名:
黄志锐学号:
************
一、实验目的
1.熟悉启动AMPL的方法。
2.熟悉SCITE编辑软件的运行。
3.熟悉AMPL基本编程。
4.熟悉AMPL求解数学规划模型的过程。
二、实验内容
1.用AMPL求解下列问题并作灵敏度分析:
一奶制品加工厂用牛奶生产A1和A2两种奶制品,1桶牛奶可以在甲类设备上用12小时加工成3公斤A1或者在乙类设备上用8小时加工成4公斤A2,且都能全部售出,且每公斤A1获利24元,每公斤A2获利16元。
先加工厂每天能得到50桶牛奶的供应,每天工人总的劳动时间为480小时,并且甲类设备每天至多加工100公斤A1,乙类设备的加工能力没有限制,试为该厂制定一个计划,使每天的获利最大。
基本模型:
根据题意,设每天用
桶牛奶生产
,用
桶牛奶生产
,每天获利为
元,则可建立线性规划模型如下:
模型求解:
使用AMPL编程求解上述线性规划模型(并作敏感性分析)代码如下:
milk.mod:
1
2
3
4
5
6
7
8
9
setProductsordered;#产品集合
paramTime{iinProducts}>0;#加工时间
paramQuan{iinProducts}>0;#单位产量
paramProfit{iinProducts}>0;#单位利润
varx{iinProducts}>=0;#决策变量
maximizeprofit:
sum{iinProducts}Profit[i]*Quan[i]*x[i];
subjecttoraw:
sum{iinProducts}x[i]<=50;
subjecttotime:
sum{iinProducts}Time[i]*x[i]<=480;
subjecttocapacity:
Quan[first(Products)]*x[first(Products)]<=100;
milk.dat:
1
2
3
4
setProducts:
=A1A2;
paramTime:
=A112A28;
paramQuan:
=A13A24;
paramProfit:
=A124A216;
milk.run:
1
2
3
4
5
6
7
8
9
modelmilk.mod;
datamilk.dat;
optionsolvercplex;
optioncplex_options'sensitivity';
solve;
displayx;
displayx.rc,x.down,x.up;
displayraw,time,capacity;
displayraw.down,raw.up,raw.current,raw.slack;
结果分析:
使用AMPL编程求解上述线性规划模型(并作敏感性分析)结果如下:
通过分析上述结果可知,该线性规划模型的全局最优解为
,则最优值为3360(即最大利润为3360元)。
求解过程中迭代次数为2次。
对上述线性规划模型进行敏感度分析有:
1.目标函数系数变化范围:
x.rcx.downx.up:
=
x106496
x204872
;
即x.rc为最优解下“资源”增加1单位时“效益”的增量;x.down,x.up为最优解不变时目标函数系数允许变化范围。
2.影子价格
raw=48原料增加1单位,利润增长48;
time=2时间增加1单位,利润增长2;
capacity=0加工能力增长不影响利润
即1桶牛奶的影子价格为48元,1小时劳动的影子价格为2元,甲类设备的影子价格为0元。
3.影子价格有意义时约束右端的允许变化范围;
raw.down=43.3333
raw.up=60
raw.current=50
raw.slack=0
即原料最少到43.3,最大到60,slack=0意为原料用完。
2.某公司有6个建筑工地,位置坐标为(ai,bi)(单位:
公里),水泥日用量di(单位:
吨)
i
1
2
3
4
5
6
a
1.25
8.75
0.5
5.75
3
7.25
b
1.25
0.75
4.75
5
6.5
7.75
d
3
5
4
7
6
11
1)现有2料场,位于A(5,1),B(2,7),记(xj,yj),j=1,2,日储量ej各有20吨,制定每天的供应计划,即从A,B两料场分别向各工地运送多少吨水泥,使总的吨公里数最小。
2)改建两个新料场,需要确定新料场位置(xj,yj)和运量cij,在其它条件不变下使总吨公里数最小。
问题1):
基本模型:
根据题意,设从A,B两料场分别向各工地运送
吨水泥,则可建立线性规划模型如下:
模型求解:
使用AMPL编程求解上述线性规划模型代码如下:
build1.mod:
1
2
3
4
5
6
7
8
9
10
11
12
13
setI:
=1..6;
setJ:
={1,2};
paramx{jinJ};
paramy{jinJ};
parama{iinI};
paramb{iinI};
paramd{iinI};
parame{jinJ};
varc{iinI,jinJ}>=0;
minimizetonkilometre:
sum{jinJ}(sum{iinI}c[i,j]*sqrt((x[j]-a[i])^2+(y[j]-b[i])^2));
subjecttoDi{iinI}:
sum{jinJ}c[i,j]=d[i];
subjecttoEj{jinJ}:
sum{iinI}c[i,j]<=e[j];
build1.dat:
1
2
3
4
5
6
paramx:
=1522;
paramy:
=1127;
parama:
=11.2528.7530.5045.7553.067.25;
paramb:
=11.2520.7534.7545.0056.567.75;
paramd:
=13.0025.0034.0047.0056.0611.0;
parame:
=120220;
build1.run:
1
2
3
4
5
modelbuild1.mod;
databuild1.dat;
optionsolvercplex;
solve;
displayc;
结果分析:
使用AMPL编程求解上述线性规划模型结果如下:
通过分析上述结果可知,从A,B两料场按下表分别向各工地运送水泥,使总的吨公里数最小,约为136.2吨公里。
1
2
3
4
5
6
(料场A)
3
5
0
7
0
1
(料场B)
0
0
4
0
6
10
问题2):
基本模型:
根据题意,可建立非线性规划模型如下:
模型求解:
使用AMPL编程求解上述非线性规划模型代码如下:
build2.mod:
1
2
3
4
5
6
7
8
9
10
11
12
13
setI:
=1..6;
setJ:
={1,2};
parama{iinI};
paramb{iinI};
paramd{iinI};
parame{jinJ};
varx{jinJ};
vary{jinJ};
varc{iinI,jinJ}>=0;
minimizetonkilometre:
sum{jinJ}(sum{iinI}c[i,j]*sqrt(1e-20+(x[j]-a[i])^2+(y[j]-b[i])^2));
subjecttoDi{iinI}:
sum{jinJ}c[i,j]=d[i];
subjecttoEj{jinJ}:
sum{iinI}c[i,j]<=e[j];
build2.dat:
1
2
3
4
parama:
=11.2528.7530.5045.7553.067.25;
paramb:
=11.2520.7534.7545.0056.567.75;
paramd:
=13.0025.0034.0047.0056.0611.0;
parame:
=120220;
build2.run:
1
2
3
4
5
6
7
8
modelbuild2.mod;
databuild2.dat;
optionsolverSNOPT;
solve;#默认求解器minos求解此规划会陷入局部极小
displayx;
displayy;
displayc;
displaytonkilometre;
结果分析:
使用AMPL编程求解上述非线性规划模型结果如下:
通过分析上述结果可知,当新料场位置分别为
、
和运量满足下表时,在其它条件不变下使总吨公里数最小,为85.266吨公里。
1
2
3
4
5
6
(料场A)
0
5
0
0
0
11
(料场B)
3
0
4
7
6
0
3.某班准备从5名游泳队员中选择4人组成接力队,参与学校的4*100m混合接力比赛。
5名队员4种泳姿的百米成绩如表所示,应如何选拔队员组成接力队?
提示:
1)建立0-1规划模型。
2)若选择队员i参加泳姿j的比赛,记xij=1,否则记xij=0,AMPL程序中0-1变量声明:
varx{iinI,jinJ}binary;
3)5名队员4种泳姿的百米成绩的表格可以采用矩阵描述如
paramGrade:
甲乙丙丁戊:
=
蝶泳
仰泳
蛙泳
自由泳
基本模型:
根据题意,记甲乙丙丁戊分别为队员
;记蝶泳,仰泳,蛙泳,自由泳分别为泳姿
。
记队员
的第
种泳姿的百米最好成绩
为,则有:
66.8
57.2
78.0
70.0
67.4
75.6
66.0
67.8
74.2
71.0
87.0
66.4
84.6
69.6
83.8
58.6
53.0
59.4
57.2
62.4
引入0-1变量
,若选择队员
参加泳姿
的比赛,则记
,否则记
。
设接力队成绩为
,则可建立0-1规划模型如下:
模型求解:
使用AMPL编程求解上述线性规划模型代码如下:
swim.mod:
1
2
3
4
5
6
7
8
setI:
=1..5;
setJ:
=1..4;
paramc{I,J};
varx{iinI,jinJ}binary;
minimizez:
sum{jinJ}(sum{iinI}c[i,j]*x[i,j]);
subjecttoperson{iinI}:
sum{jinJ}x[i,j]<=1;
subjecttoposition{jinJ}:
sum{iinI}x[i,j]=1;
swim.dat:
1
2
3
4
5
6
paramc:
1234:
=
166.875.687.058.6
257.266.066.453.0
378.067.884.659.4
470.074.269.657.2
567.471.083.862.4;
swim.run:
1
2
3
4
5
modelswim.mod;
dataswim.dat;
optionsolvercplex;
solve;
displayx;
结果分析:
使用AMPL编程求解上述线性规划模型结果如下:
通过分析上述结果可知,应当选派甲乙丙丁4人组成接力队,分别参加自由泳、蝶泳、仰泳、蛙泳的比赛,历史总平均成绩为253.2秒。
三、实验心得
通过本次实验,本人熟悉了AMPL基本编程和SCITE编辑软件的运用,了解了AMPL求解数学规划模型的过程,并发现了在使用AMPL求解非线性规划要注意选择合适的求解器。
因为不同的求解器是使用不同的算法去求解非线性规划,所以针对不同类型的非线性规划应当选择不同的求解器,避免陷入局部极小或局部极大的问题,以及出现“根号下为零”的问题。