数学建模实验一 数学规划模型AMPL求解.docx

上传人:b****6 文档编号:7359675 上传时间:2023-01-23 格式:DOCX 页数:15 大小:211.79KB
下载 相关 举报
数学建模实验一 数学规划模型AMPL求解.docx_第1页
第1页 / 共15页
数学建模实验一 数学规划模型AMPL求解.docx_第2页
第2页 / 共15页
数学建模实验一 数学规划模型AMPL求解.docx_第3页
第3页 / 共15页
数学建模实验一 数学规划模型AMPL求解.docx_第4页
第4页 / 共15页
数学建模实验一 数学规划模型AMPL求解.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数学建模实验一 数学规划模型AMPL求解.docx

《数学建模实验一 数学规划模型AMPL求解.docx》由会员分享,可在线阅读,更多相关《数学建模实验一 数学规划模型AMPL求解.docx(15页珍藏版)》请在冰豆网上搜索。

数学建模实验一 数学规划模型AMPL求解.docx

数学建模实验一数学规划模型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

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

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无法达到这样的精度。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1