数学建模实验一 数学规划模型AMPL求解.docx
《数学建模实验一 数学规划模型AMPL求解.docx》由会员分享,可在线阅读,更多相关《数学建模实验一 数学规划模型AMPL求解.docx(15页珍藏版)》请在冰豆网上搜索。
数学建模实验一数学规划模型AMPL求解
实验一:
数学规划模型AMPL求解
一、实验目的
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,乙类设备的加工能力没有限制,试为该厂制定一个计划,使每天的获利最大。
建模:
决策变量:
x1桶牛奶生产A1,x2桶牛奶生产A2
目标函数:
约束条件:
AMPL安装与设置(Windows下):
(1)下载ampl.zip,限制版本,带求解器cplex(解线性规划),minos(解线性或非线性规划,默认求解器);
(2)把ampl.zip解压至一个目录下,然后找到ampl.exe文件所在的目录,称为ampl根目录,比如C:
\ampl;
(3)把ampl根目录设置到Windows路径上,方法:
鼠标右击我的电脑---属性—高级---点击环境变量出现环境变量窗口,在图下方的系统变量窗口找到Path变量,把C:
\ampl增加在变量值后面(注意前面加分号),如下图;
AMPL求解过程:
(1)下载文本编辑器Scite.rar并解压到安装目录,双击scite.exe,得到如下界面
(2)建立模型文件:
在空白窗口中输入如下代码,语言选项选择AMPL,保存为milk.mod
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;
(2)建立数据文件:
新建文件,输入如下代码,保存为milk.dat
setProducts:
=A1A2;
paramTime:
=A112A28;
paramQuan:
=A13A24;
paramProfit:
=A124A216;
(3)建立批处理文件:
新建文件,输入如下代码,保存为milk.run
modelmilk.mod;
datamilk.dat;
optionsolvercplex;
solve;
displayx;
注意:
模型文件、数据文件和批处理文件的文件名应该相同,保存在同一文件夹。
最好保存在安装路径的根目录,如C:
\ampl。
(4)运行,按F5(或工具/运行),结果如下:
(5)灵敏度分析:
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;
1.目标函数系数变化范围:
displayx.rc,x.down,x.up;
x.rcx.downx.up:
=
A106496
A204872
;
x.rc最优解下“资源”增加1单位时“效益”的增量;x.down,x.up最优解不变时目标函数系数允许变化范围。
2.影子价格
displayraw,time,capacity;
raw=48原料增加1单位,利润增长48;
time=2时间增加1单位,利润增长2;
capacity=0加工能力增长不影响利润
3.影子价格有意义时约束右端的允许变化范围;
displayraw.down,raw.up,raw.current,raw.slack;
raw.down=43.3333
raw.up=60
raw.current=50
raw.slack=0
原料最少到43.3,最大到60,slack=0意为原料用完.
除了在Scite的界面下运行程序以外,也可以双击ampl文件夹中的sw.exe,在窗口中输入ampl,在ampl提示符下输入命令。
如下图:
2 编写AMPL程序并求解
某公司有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)问题1为线性规划,问题2为非线性规划。
2)CPLEX无法求解非线性规划问题。
可以用默认求解器MINOS求解(能求解线性和非线性规划)。
问题1参考:
模型:
AMPL程序:
(1)模型文件:
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];
(2)数据文件:
paramx:
=1522;
paramy:
=1127;
parama:
=11.2528.7530.545.755367.25;
paramb:
=11.2520.7534.754556.567.75;
paramd:
=1325344756611;
parame:
=120220;
(3)批处理文件:
modeladd.mod;
dataadd.dat;
solve;#默认求解器minos
displayc;
三、实验内容
1.用AMPL求解下列问题并作灵敏度分析:
一奶制品加工厂用牛奶生产A1和A2两种奶制品,1桶牛奶可以在甲类设备上用12小时加工成3公斤A1或者在乙类设备上用8小时加工成4公斤A2,且都能全部售出,且每公斤A1获利24元,每公斤A2获利16元。
先加工厂每天能得到50桶牛奶的供应,每天工人总的劳动时间为480小时,并且甲类设备每天至多加工100公斤A1,乙类设备的加工能力没有限制,试为该厂制定一个计划,使每天的获利最大。
解:
建模:
决策变量:
x1桶牛奶生产A1,x2桶牛奶生产A2
目标函数:
约束条件:
创建模型文件milk.mod,输入:
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,输入:
setProducts:
=A1A2;
paramTime:
=A112A28;
paramQuan:
=A13A24;
paramProfit:
=A124A216;
创建处理文件milk.run,输入:
modelmilk.mod;
datamilk.dat;
optionsolverminos;
solve;
displayx;
displayprofit;
运行输出:
结果:
得出最优解为x1=20,x2=30,获利最大为3360元。
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)
创建模型文件concrete.mod:
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];
创建数据文件concrete.dat:
paramx:
=1522;
paramy:
=1127;
parama:
=11.2528.7530.545.755367.25;
paramb:
=11.2520.7534.754556.567.75;
paramd:
=1325344756611;
parame:
=120220;
创建模型文件concrete.run:
modelconcrete.mod;
dataconcrete.dat;
solve;#默认求解器minos
displayc;
运行输出:
结果:
水泥分配如下表:
1
2
3
4
5
6
A
3
5
0
7
0
1
B
0
0
4
0
6
10
可得总的吨公里数最小,为136.228公里。
(2)
创建模型文件concrete.mod:
setI:
=1..6;
setJ:
={1,2};
parama{iinI};#工地x坐标
paramb{iinI};#工地y坐标
paramd{iinI};#水泥日用量
parame{jinJ};#料场日产水泥量
varc{iinI,jinJ}>=0;#决策变量:
料场j到工地i的运量
varx{jinJ};#料场x坐标
vary{jinJ};#料场y坐标
#目标函数
minimizef:
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];
创建数据文件concrete.dat:
parama:
=11.2528.7530.545.755367.25;
paramb:
=11.2520.7534.754556.567.75;
paramd:
=1325344756611;
parame:
=120220;
创建模型文件concrete.run:
modelconcrete.mod;
dataconcrete.dat;
optionsolverminos;
solve;
displayx,y;
displayc;
displayf;
运行输出:
结果:
新料场位置(xj,yj)如下:
xj
yj
1
7.25
7.75
2
4.74
3.50
运量cij分配如下:
i
1
2
3
4
5
6
ci1
0
0
0
3
6
11
ci2
3
5
4
4
0
0
时,总吨公里数最小,为97.6617公里。
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:
甲乙丙丁戊:
=
蝶泳
仰泳
蛙泳
自由泳
解:
创建模型文件concrete.mod:
setI:
=1..5;
setJ:
=1..4;
paramc{iinI,jinJ};#队员i第j种泳姿的百米成绩
varx{iinI,jinJ}binary;#选择队员i参加泳姿j的比赛
minimizez:
sum{jinJ}(sum{iinI}c[i,j]*x[i,j]);
subjecttoA{iinI}:
sum{jinJ}x[i,j]<=1;
subjecttoB{jinJ}:
sum{iinI}x[i,j]=1;
创建数据文件concrete.dat:
paramc:
1234:
=
166.875.68758.6
257.26666.453
37867.884.659.4
47074.269.657.2
567.47183.862.4;
创建模型文件concrete.run:
modelswim.mod;
dataswim.dat;
optionsolverminos;
solve;
displayx;
displayz;
运行输出:
结果:
由队员1参加自由泳,由队员2参加蝶泳,由队员3参加仰泳,由队员4参加蛙泳,队员5不参加比赛,此时用时最短,为253.2秒。
四、实验心得
在实验过程中掌握了AMPL语言的基本编程和使用方法,并用之求解数学规划和0-1模型等数学模型,在这三个实验中,体会到了不同的求解器minos和cplex之间的不同之处,minos无法进行灵敏度分析,而cplex可以,此外,minos求解器得出的值具有较大的精度,可以显示到小数点17位,而cplex无法达到这样的精度。