实验四求解非线性规划模型.docx
《实验四求解非线性规划模型.docx》由会员分享,可在线阅读,更多相关《实验四求解非线性规划模型.docx(13页珍藏版)》请在冰豆网上搜索。
实验四求解非线性规划模型
《数学建模》
实验指导书
姓名:
吴家猛
班号:
AP08055
学号:
AP0805530
五邑大学数学物理系
二○○八年八月印刷
实验4指导书
实验项目名称:
求解非线性规划模型
所属课程名称:
数学建模
实验计划学时:
2学时
一、实验目的
掌握数学软件Lingo用集合步和循环语句等编程求解非线性规划模型。
二、实验内容和要求
(一)实验内容(钢管下料模型)
某钢管零售商从钢管厂进货,将钢管按照顾客的要求切割后售出,从钢管厂进货时原料钢管都是168米。
现有顾客需要968根12米、848根23米、1253根28米和988根35米的钢管。
1.因为零售商如果采用不同切割模式太多,将会导致生产过程复杂化,从而增加生产成本,所以该零售商规定采用的切割模式不超过3种。
请你确定下料方案。
2.若该零售商规定采用的切割模式不超过4种。
请你重新确定下料方案。
3.思考题
在上面下料问题中若不限制切割模式的数量,请你确定下料方案。
(二)要求
有问题分析、数学模型、Lingo的求解程序、程序的运行结果和所有问题的回答。
三、实验主要仪器设备和材料
每人一台计算机,要求已安装Lingo8.0以上版本。
四、实验方法、步骤及结果测试
(1)模型建立:
决策变量:
由于不同切割模式不超过3种,可以用
表示按照第i模式(i=1,2,3)切割的原料,显然它们应当是非负整数,设所使用的第i种切割模式下每根原料钢管生产12米,23米,28米和38米的钢管分别为
.
决策目标:
切割原料钢管的总根数最少,目标为
Min
约束条件为满足客户的需求,应有
每一种切割模式必须可行,合理,所以每根原料钢管的成品量不能超过168米,也不能少于157米,于是有:
为了把模型求解的范围缩小,我们再假设第一种全部用来切割12米的,一根可以切割14根,第二种全部用来切割23米的,一根可以切割7根,第三种一根可以用来切割4根28和1根35米的故最多要用70+122+988=1180根,又假设每根完全用完,没有剩余量,则最少要用
根,故有
模型求解:
将构成的模型输入LINGO中,程序如下:
Title钢管下料-最小化钢管根数的LINGO模型;
SETS:
NEEDS/1..4/:
LENGTH,NUM;
!
定义基本集合NEEDS及其属性LENGTH,NUM;
CUTS/1..3/:
X;
!
定义基本集合CUTS及其属性X;
PATTERNS(NEEDS,CUTS):
R;
!
定义派生集合PATTERNS(这是一个稠密集合)及其属性R;
ENDSETS
DATA:
LENGTH=12232835;
NUM=9688481253988;
C=168;
ENDDATA
min=@SUM(CUTS(I):
X(I));
!
目标函数;
@FOR(NEEDS(I):
@SUM(CUTS(J):
X(J)*R(I,J))>NUM(I));
!
满足需求约束;
@FOR(CUTS(J):
@SUM(NEEDS(I):
LENGTH(I)*R(I,J))!
合理切割模式约束;
@FOR(CUTS(J):
@SUM(NEEDS(I):
LENGTH(I)*R(I,J))>C
-@MIN(NEEDS(I):
LENGTH(I))+1);
!
合理切割模式约束;
@SUM(CUTS(I):
X(I))>600;@SUM(CUTS(I):
X(I))<1180;
!
人为增加约束;
@FOR(CUTS(I)|I#LT#@SIZE(CUTS):
X(I)>X(I+1));
!
人为增加约束;
@FOR(CUTS(J):
@GIN(X(J)));
@FOR(PATTERNS(I,J):
@GIN(R(I,J)));
end
输出结果为:
Localoptimalsolutionfoundatiteration:
265490
Objectivevalue:
603.0000
ModelTitle:
钢管下料-最小化钢管根数的LINGO模型
VariableValueReducedCost
C168.00000.000000
LENGTH
(1)12.000000.000000
LENGTH
(2)23.000000.000000
LENGTH(3)28.000000.000000
LENGTH(4)35.000000.000000
NUM
(1)968.00000.000000
NUM
(2)848.00000.000000
NUM(3)1253.0000.000000
NUM(4)988.00000.000000
X
(1)389.00001.000000
X
(2)144.00001.000000
X(3)70.000001.000000
R(1,1)2.0000000.000000
R(1,2)0.0000000.000000
R(1,3)3.0000000.000000
R(2,1)2.0000000.000000
R(2,2)0.0000000.000000
R(2,3)1.0000000.000000
R(3,1)1.0000000.000000
R(3,2)6.0000000.000000
R(3,3)0.0000000.000000
R(4,1)2.0000000.000000
R(4,2)0.0000000.000000
R(4,3)3.0000000.000000
RowSlackorSurplusDualPrice
1603.0000-1.000000
220.000000.000000
30.0000000.000000
40.0000000.000000
50.0000000.000000
60.0000000.000000
70.0000000.000000
84.0000000.000000
911.000000.000000
1011.000000.000000
117.0000000.000000
123.0000000.000000
13577.00000.000000
14245.00000.000000
1574.000000.000000
由运算得出的数据可以知道:
总使用原料钢管的总根数为603根,第一种切割模式下一根原料钢管切割成2根12米、2根23米、1根28米和2根35米;第二种切割模式下一根原料钢管切割成6根28米;第三种切割模式下一根原料钢管切割成3根12米、1根23米和3根35米。
(2)模型建立:
决策变量:
由于不同切割模式不超过4种,可以用
表示按照第i模式(i=1,2,3、4)切割的原料,显然它们应当是非负整数,设所使用的第i种切割模式下每根原料钢管生产12米,23米,28米和38米的钢管分别为
.
决策目标:
切割原料钢管的总根数最少,目标为
Min
约束条件为满足客户的需求,应有
每一种切割模式必须可行,合理,所以每根原料钢管的成品量不能超过168米,也不能少于157米,于是有:
为了把模型求解的范围缩小,我们再假设第一种全部用来切割12米的,一根可以切割14根,第二种全部用来切割23米的,一根可以切割7根,第三种一根可以用来切割4根28米和1根35米的,第四种一根可以用来切割1根28米和4根35米的,故最多要用70+122+313+170=675根,又假设每根完全用完,没有剩余量,则最少要用
根,故有
模型求解:
将构成的模型输入LINGO中,程序如下:
Title钢管下料-最小化钢管根数的LINGO模型;
SETS:
NEEDS/1..4/:
LENGTH,NUM;
!
定义基本集合NEEDS及其属性LENGTH,NUM;
CUTS/1..4/:
X;
!
定义基本集合CUTS及其属性X;
PATTERNS(NEEDS,CUTS):
R;
!
定义派生集合PATTERNS(这是一个稠密集合)及其属性R;
ENDSETS
DATA:
LENGTH=12232835;
NUM=9688481253988;
C=168;
ENDDATA
min=@SUM(CUTS(I):
X(I));
!
目标函数;
@FOR(NEEDS(I):
@SUM(CUTS(J):
X(J)*R(I,J))>NUM(I));
!
满足需求约束;
@FOR(CUTS(J):
@SUM(NEEDS(I):
LENGTH(I)*R(I,J))!
合理切割模式约束;
@FOR(CUTS(J):
@SUM(NEEDS(I):
LENGTH(I)*R(I,J))>C
-@MIN(NEEDS(I):
LENGTH(I))+1);
!
合理切割模式约束;
@SUM(CUTS(I):
X(I))>600;@SUM(CUTS(I):
X(I))<675;
!
人为增加约束;
@FOR(CUTS(I)|I#LT#@SIZE(CUTS):
X(I)>X(I+1));
!
人为增加约束;
@FOR(CUTS(J):
@GIN(X(J)));
@FOR(PATTERNS(I,J):
@GIN(R(I,J)));
输出结果为:
Localoptimalsolutionfoundatiteration:
1066456452
Objectivevalue:
601.0000
ModelTitle:
钢管下料-最小化钢管根数的LINGO模型
VariableValueReducedCost
C168.00000.000000
LENGTH
(1)12.000000.000000
LENGTH
(2)23.000000.000000
LENGTH(3)28.000000.000000
LENGTH(4)35.000000.000000
NUM
(1)968.00000.000000
NUM
(2)848.00000.000000
NUM(3)1253.0000.000000
NUM(4)988.00000.000000
X
(1)243.00001.000000
X
(2)208.00001.000000
X(3)134.00001.000000
X(4)16.000001.000000
R(1,1)0.0000000.000000
R(1,2)4.0000000.000000
R(1,3)0.0000000.000000
R(1,4)9.0000000.000000
R(2,1)0.0000000.000000
R(2,2)4.0000000.000000
R(2,3)0.0000000.000000
R(2,4)1.0000000.000000
R(3,1)1.0000000.000000
R(3,2)1.0000000.000000
R(3,3)6.0000000.000000
R(3,4)0.0000000.000000
R(4,1)4.0000000.000000
R(4,2)0.0000000.000000
R(4,3)0.0000000.000000
R(4,4)1.0000000.000000
RowSlackorSurplusDualPrice
1601.0000-1.000000
28.0000000.000000
30.0000000.000000
42.0000000.000000
50.0000000.000000
60.0000000.000000
70.0000000.000000
80.0000000.000000
92.0000000.000000
1011.000000.000000
1111.000000.000000
1211.000000.000000
139.0000000.000000
143.0000000.000000
1519.000000.000000
1635.000000.000000
1774.000000.000000
18118.00000.000000
由计算结果可知:
总使用原料钢管的总根数为601根,第一种切割模式下一根原料钢管切割成1根28米、4根35米;第二种切割模式下一根原料钢管切割成4根12米、4根23米、1根28米;第三种切割模式下一根原料钢管切割成6根28米;第四种切割模式下一根原料钢管切割成9根12米、1根23米、1根35米。
(3)思考题:
由于不限制切割模式的种类,故需要算出总切割模式总数,用C++程序来计算。
在MicrosoftVisualC++6.0中输入以下程序:
#include
usingnamespacestd;
intc=0,sum;//sum表示满足客户要求所用的原料钢管的根数的上限;
inti,j,k,l;
//某种模式时,i表示切割12米的根数,j表示切割23米的根数,k表示切割28米的根数,l表示切割35米的根数,
inta,e;
intd1,d2,d3,d4;
intsumi=0,sumj=0,sumk=0,suml=0;
intmain()
{
e=(12*968+23*848+28*1253+35*988)/168-1;//需要钢管原料的下限
for(l=0;l<5;l++)
for(k=0;k<7;k++)
for(j=0;j<8;j++)
for(i=0;i<15;i++)
{a=12*i+23*j+28*k+35*l;//某种模式时,一根钢管用掉得长度
if(a>=157&&a<=168)
{c=c+1;//符合条件的模式数量值
sumi=sumi+i;
sumj=sumj+j;
sumk=sumk+k;
suml=suml+l;
cout<<""<<"第"<"<<"切割"<
<//分别输出符合条件的切割模式
}
}
d1=968/sumi;
d2=848/sumj;
d3=1253/sumk;
d4=988/suml;
if(d1>d2)
{if(d1>d3)
if(d1>d4)sum=d1*c;
elsesum=d4*c;
elseif(d3>d4)sum=d3*c;
elsesum=d4*c;
}
else
{if(d2>d3)
if(d2>d4)sum=d2*c;
elsesum=d4*c;
else
if(d3>d4)sum=d3*c;
elsesum=d4*c;
}
cout<<""<<"总共有"<cout<<"需要钢管原料的下限为:
"<cout<<"需要钢管原料的上限为:
"<return0;
}
运行结果为:
由输出结果可知:
总共有70种切割模式
下限为598根,上限为910根;
由
(1)
(2)问可知,不超过70种模式时有:
将构成的模型输入LINGO中,程序如下:
Title钢管下料-最小化钢管根数的LINGO模型;
SETS:
NEEDS/1..4/:
LENGTH,NUM;
!
定义基本集合NEEDS及其属性LENGTH,NUM;
CUTS/1..70/:
X;
!
定义基本集合CUTS及其属性X;
PATTERNS(NEEDS,CUTS):
R;
!
定义派生集合PATTERNS(这是一个稠密集合)及其属性R;
ENDSETS
DATA:
LENGTH=12232835;
NUM=9688481253988;
C=168;
ENDDATA
min=@SUM(CUTS(I):
X(I));
!
目标函数;
@FOR(NEEDS(I):
@SUM(CUTS(J):
X(J)*R(I,J))>NUM(I));
!
满足需求约束;
@FOR(CUTS(J):
@SUM(NEEDS(I):
LENGTH(I)*R(I,J))!
合理切割模式约束;
@FOR(CUTS(J):
@SUM(NEEDS(I):
LENGTH(I)*R(I,J))>C
-@MIN(NEEDS(I):
LENGTH(I))+1);
!
合理切割模式约束;
@SUM(CUTS(I):
X(I))>598;@SUM(CUTS(I):
X(I))<910;
!
人为增加约束;
@FOR(CUTS(I)|I#LT#@SIZE(CUTS):
X(I)>X(I+1));
!
人为增加约束;
@FOR(CUTS(J):
@GIN(X(J)));
@FOR(PATTERNS(I,J):
@GIN(R(I,J)));
输出结果为:
由于运行不了