《实验四求解非线性规划模型.doc》由会员分享,可在线阅读,更多相关《实验四求解非线性规划模型.doc(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品文档,仅供学习与交流,如有侵权请联系网站删除数学建模 实验指导书姓名:吴家猛 班号:AP08055 学号:AP0805530五邑大学数学物理系二八年八月印刷实验4 指导书实验项目名称:求解非线性规划模型所属课程名称:数学建模实验计划学时:2学时一、 实验目的掌握数学软件Lingo用集合步和循环语句等编程求解非线性规划模型。二、 实验内容和要求(一) 实验内容(钢管下料模型)某钢管零售商从钢管厂进货,将钢管按照顾客的要求切割后售出,从钢管厂进货时原料钢管都是168米。现有顾客需要968根12米、848根23米、1253根28米和988根35米的钢管。1. 因为零售商如果采用不同切割模式太多,
2、将会导致生产过程复杂化,从而增加生产成本,所以该零售商规定采用的切割模式不超过3种。请你确定下料方案。2. 若该零售商规定采用的切割模式不超过4种。请你重新确定下料方案。3. 思考题在上面下料问题中若不限制切割模式的数量,请你确定下料方案。(二) 要求 有问题分析、数学模型、Lingo的求解程序、程序的运行结果和所有问题的回答。三、 实验主要仪器设备和材料 每人一台计算机,要求已安装Lingo 8.0以上版本。四、 实验方法、步骤及结果测试 (1)模型建立: 决策变量: 由于不同切割模式不超过3种,可以用表示按照第i模式(i=1,2,3)切割的原料,显然它们应当是非负整数,设所使用的第i种切割
3、模式下每根原料钢管生产12米,23米,28米和38米的钢管分别为. 决策目标:切割原料钢管的总根数最少,目标为 Min 约束条件 为满足客户的需求,应有 每一种切割模式必须可行,合理,所以每根原料钢管的成品量不能超过168米,也不能少于157米,于是有: 为了把模型求解的范围缩小,我们再假设第一种全部用来切割12米的,一根可以切割14根,第二种全部用来切割23米的,一根可以切割7根,第三种一根可以用来切割4根28和1根35米的故最多要用70+122+988=1180根,又假设每根完全用完,没有剩余量,则最少要用根,故有模型求解:将构成的模型输入LINGO中,程序如下:Title 钢管下料 -
4、最小化钢管根数的LINGO模型;SETS: NEEDS/1.4/:LENGTH,NUM; ! 定义基本集合NEEDS及其属性LENGTH,NUM;CUTS/1.3/:X; ! 定义基本集合CUTS及其属性X;PATTERNS(NEEDS,CUTS):R; ! 定义派生集合PATTERNS(这是一个稠密集合)及其属性R;ENDSETSDATA:LENGTH=12 23 28 35;NUM=968 848 1253 988;C=168;ENDDATAmin=SUM(CUTS(I): X(I) );!目标函数;FOR(NEEDS(I): SUM(CUTS(J): X(J)*R(I,J) ) NUM(
5、I) ); !满足需求约束;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) ) X(I+1) ); !人为增加约束;FOR(CUTS(J): GIN(X(J) ) ;FOR(PATTERNS(I,J): GIN(R(I,J) );end输出结果为:Local optimal solution found at iteration: 265490 Objective value: 603
6、.0000 Model Title: 钢管下料 - 最小化钢管根数的LINGO模型 Variable Value Reduced Cost C 168.0000 0.000000 LENGTH( 1) 12.00000 0.000000 LENGTH( 2) 23.00000 0.000000 LENGTH( 3) 28.00000 0.000000 LENGTH( 4) 35.00000 0.000000 NUM( 1) 968.0000 0.000000 NUM( 2) 848.0000 0.000000 NUM( 3) 1253.000 0.000000 NUM( 4) 988.0000
7、 0.000000 X( 1) 389.0000 1.000000 X( 2) 144.0000 1.000000 X( 3) 70.00000 1.000000 R( 1, 1) 2.000000 0.000000 R( 1, 2) 0.000000 0.000000 R( 1, 3) 3.000000 0.000000 R( 2, 1) 2.000000 0.000000 R( 2, 2) 0.000000 0.000000 R( 2, 3) 1.000000 0.000000 R( 3, 1) 1.000000 0.000000 R( 3, 2) 6.000000 0.000000 R(
8、 3, 3) 0.000000 0.000000 R( 4, 1) 2.000000 0.000000 R( 4, 2) 0.000000 0.000000 R( 4, 3) 3.000000 0.000000 Row Slack or Surplus Dual Price 1 603.0000 -1.000000 2 20.00000 0.000000 3 0.000000 0.000000 4 0.000000 0.000000 5 0.000000 0.000000 6 0.000000 0.000000 7 0.000000 0.000000 8 4.000000 0.000000 9
9、 11.00000 0.000000 10 11.00000 0.000000 11 7.000000 0.000000 12 3.000000 0.000000 13 577.0000 0.000000 14 245.0000 0.000000 15 74.00000 0.000000由运算得出的数据可以知道: 总使用原料钢管的总根数为603根,第一种切割模式下一根原料钢管切割成2根12米、2根23米、1根28米和2根35米;第二种切割模式下一根原料钢管切割成6根28米;第三种切割模式下一根原料钢管切割成3根12米、1根23米和3根35米。(2)模型建立: 决策变量: 由于不同切割模式不超过
10、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米的,故最多要用7
11、0+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;ENDSETSDATA:LENGTH=12 23 28 35;NUM=968 848 1253 988;C=168;
12、ENDDATAmin=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) ) C -MIN(NEEDS(I):LENGTH(I)+1 ); !合理切割模式约束;SUM(CUTS(I): X(I) ) 600; SUM(CUTS(I): X(I) ) X(I+1) ); !人为增加约束;FOR(CUTS(J): GIN(X(J) ) ;FOR(PATTERNS(I,J): GIN(R(I,J)
13、 );输出结果为:Local optimal solution found at iteration: 1066456452 Objective value: 601.0000 Model Title: 钢管下料 - 最小化钢管根数的LINGO模型 Variable Value Reduced Cost C 168.0000 0.000000 LENGTH( 1) 12.00000 0.000000 LENGTH( 2) 23.00000 0.000000 LENGTH( 3) 28.00000 0.000000 LENGTH( 4) 35.00000 0.000000 NUM( 1) 968
14、.0000 0.000000 NUM( 2) 848.0000 0.000000 NUM( 3) 1253.000 0.000000 NUM( 4) 988.0000 0.000000 X( 1) 243.0000 1.000000 X( 2) 208.0000 1.000000 X( 3) 134.0000 1.000000 X( 4) 16.00000 1.000000 R( 1, 1) 0.000000 0.000000 R( 1, 2) 4.000000 0.000000 R( 1, 3) 0.000000 0.000000 R( 1, 4) 9.000000 0.000000 R(
15、2, 1) 0.000000 0.000000 R( 2, 2) 4.000000 0.000000 R( 2, 3) 0.000000 0.000000 R( 2, 4) 1.000000 0.000000 R( 3, 1) 1.000000 0.000000 R( 3, 2) 1.000000 0.000000 R( 3, 3) 6.000000 0.000000 R( 3, 4) 0.000000 0.000000 R( 4, 1) 4.000000 0.000000 R( 4, 2) 0.000000 0.000000 R( 4, 3) 0.000000 0.000000 R( 4,
16、4) 1.000000 0.000000 Row Slack or Surplus Dual Price 1 601.0000 -1.000000 2 8.000000 0.000000 3 0.000000 0.000000 4 2.000000 0.000000 5 0.000000 0.000000 6 0.000000 0.000000 7 0.000000 0.000000 8 0.000000 0.000000 9 2.000000 0.000000 10 11.00000 0.000000 11 11.00000 0.000000 12 11.00000 0.000000 13
17、9.000000 0.000000 14 3.000000 0.000000 15 19.00000 0.000000 16 35.00000 0.000000 17 74.00000 0.000000 18 118.0000 0.000000由计算结果可知:总使用原料钢管的总根数为601根,第一种切割模式下一根原料钢管切割成1根28米、4根35米;第二种切割模式下一根原料钢管切割成4根12米、4根23米、1根28米;第三种切割模式下一根原料钢管切割成6根28米;第四种切割模式下一根原料钢管切割成9根12米、1根23米、1根35米。(3)思考题:由于不限制切割模式的种类,故需要算出总切割模式总
18、数,用C+程序来计算。 在MicrosoftVisualC+6.0中输入以下程序:#includeusing namespace std;int c=0,sum;/sum表示满足客户要求所用的原料钢管的根数的上限;int i,j,k,l; /某种模式时,i表示切割12米的根数,j表示切割23米的根数,k表示切割28米的根数,l表示切割35米的根数,int a,e; int d1,d2,d3,d4;int sumi=0,sumj=0,sumk=0,suml=0;int main() e=(12*968+23*848+28*1253+35*988)/168-1; /需要钢管原料的下限 for(l=
19、0;l5;l+) for(k=0;k7;k+) for(j=0;j8;j+) for(i=0;i=157&a=168) c=c+1; /符合条件的模式数量值 sumi=sumi+i; sumj=sumj+j; sumk=sumk+k; suml=suml+l; cout 第c种模式:切割i根12米的, j根23米的,k根28米的,l根35米的;d2) if(d1d3) if(d1d4)sum=d1*c; else sum=d4*c;else if(d3d4) sum=d3*c; else sum=d4*c;else if(d2d3)if(d2d4) sum=d2*c;else sum=d4*c
20、; else if(d3d4) sum=d3*c; else sum=d4*c;cout 总共有c种模式endl; /总模式有的总值cout需要钢管原料的下限为:eendl;cout需要钢管原料的上限为:sumNUM(I) ); !满足需求约束;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) ) X(I+1) ); !人为增加约束;FOR(CUTS(J): GIN(X(J) ) ;FOR(PATTERNS(I,J): GIN(R(I,J) );输出结果为:由于运行不了【精品文档】第 7 页