1、第六章 ILOG OPL 基础ILOG 简 介q Founded 1987q 590 employeesq 2,000+customersq Selling in 30 countriesq NASDAQ/Euronext3002001207098990001ISV/OEMPartnersMost influential IT companies for 第六章 ILOG OPL 基础ILOG 简 介Views Component SuiteJViews Component SuiteJTGOCPLEXSolverJRulesRules第六章 ILOG OPL 基础ILOG 简 介ILOGIL
2、OG CPLEX CPLEXILOG Solver&ILOG Solver&ILOG JSolverILOG Concert TechnologyILOG Concert Technology (C+C+&Java)HybridHybridILOGILOGOPLOPLStudioStudio约束规划约束规划solver用用java表达表达运输行业用运输行业用配置、销售应用配置、销售应用第六章 ILOG OPL 基础ILOG 简 介Core EnginesILOG Solver-Constraint Programming EngineILOG CPLEX-Math Programming En
3、gineVertical Engine ExtensionsILOG Scheduler-Constraint-Based SchedulingILOG Dispatcher-Vehicle Routing,Technician DispatchingILOG Configurator-Product and Service ConfigurationModeling ToolsOPL Studio-Rapid Development of Optimization AppsAMPL-Modeling Support for CPLEXWe use OPL Studio here since
4、its high level language makes it an easy starting point第六章 ILOG OPL 基础 MonthWeekDayHourTime stepsScopeStrategicTacticalOperationalApplicationLong-termplanningPublishedScheduleOperationalSchedulingDriversEconomicsFeasibilityTechnologyLPMIP/HybridCPRange of Optimization ApplicationsILOG has optimizati
5、on technology for the entire planning horizon第六章 ILOG OPL 基础ILOG OPL 简明教程-(1-IDE简介)OPLIDE开发环境开发环境介绍介绍1)打开打开OPLIDE.第六章 ILOG OPL 基础ILOG OPL 简明教程-(1-IDE简介)2)在在OPLIDE开发环境中有两种方式可以实现运行上面的代码:开发环境中有两种方式可以实现运行上面的代码:1以建立工程的方式:以建立工程的方式:第六章 ILOG OPL 基础ILOG OPL 简明教程-(1-IDE简介)第六章 ILOG OPL 基础ILOG OPL 简明教程-(1-IDE简介
6、)2以建立模型的方式:以建立模型的方式:第六章 ILOG OPL 基础ILOG OPL 简明教程-(1-IDE简介)推荐使用以建立工程的方式进行开发,规范且方便以后开发。推荐使用以建立工程的方式进行开发,规范且方便以后开发。第六章 ILOG OPL 基础ILOG OPL 简明教程-(1-IDE简介)求解求解按钮按钮第六章 ILOG OPL 基础ILOG OPL 简明教程-(2-最简单的例子)例例:一个简单的线性规划问题一个简单的线性规划问题某公司生产氨气某公司生产氨气 (N H3N H3)and)and 氯化铵氯化铵 (N H4 ClN H4 Cl).).公司的日处理能力为公司的日处理能力为5
7、0 50 单位的单位的 氮氮 (N N),180),180 单位的氢单位的氢 (H H),40),40 单位氯单位氯 (ClCl).).氨气的利润是氨气的利润是 40 euros40 euros每单位每单位、氯氯化铵的利润是化铵的利润是50 euros 50 euros 每单位每单位.如何确定如何确定氨气氨气和和氯化铵氯化铵的产量,使利润最大的产量,使利润最大目标函数:目标函数:max z=40*Gas+50*Chloridemax z=40*Gas+50*Chloride满足约束条件:满足约束条件:Gas+Chloride=50 Gas+Chloride=50 3*Gas+4*Chlorid
8、e=180 3*Gas+4*Chloride=180 Chloride=40 Chloride=40 第六章 ILOG OPL 基础ILOG OPL 简明教程-(2-最简单的例子)OPLIDE开发环境中对应编码:开发环境中对应编码:dvarfloat+gas;dvarfloat+chloride;/constraintnaming.constraintct1;constraintct2;constraintct3;maximize40*gas+50*chloride;subjecttoct1=gas+chloride=50;ct2=3*gas+4*chloride=180;ct3=chlori
9、de=40;在在OPLIDE开发环境中开发环境中Console窗口窗口的输出结果:的输出结果:Finalsolutionwithobjective2300:gas=20;chloride=30;注意:注释语句和注意:注释语句和C语语言同,支持言同,支持/和和/*/注意:注意:OPL语言区分大语言区分大小写!小写!第六章 ILOG OPL 基础ILOG OPL 简明教程-(2-最简单的例子)说明说明:dvar,+,constraint,maximize,subjectto都是什么含义?都是什么含义?dvar:(decisionvariable)是是OPL的关键字,放在前面讲过的的关键字,放在前面
10、讲过的“定义变量定义变量”之前之前,表示此定义的变量是决策变量。表示此定义的变量是决策变量。基本格式是:基本格式是:dvar数据类型数据类型变变量名量名;例如:例如:dvarfloatgas;+:一般放在前面讲过的定义的一般放在前面讲过的定义的“决策变量决策变量”中的中的“基本数据类型基本数据类型”之后,之后,表示所定义的决策变量是正数。基本格式是:数据类型表示所定义的决策变量是正数。基本格式是:数据类型+变量名变量名;例如:例如:dvarfloat+gas;/“+”只能在决策变量中使用只能在决策变量中使用.?有没有有没有dvarfloat-gas;的用法?的用法?constraint:是是O
11、PL的关键字,定义方式同的关键字,定义方式同“定义变量定义变量”,放在定义的约,放在定义的约束变量名之前,表示此定义的变量是约束变量。基本格式:束变量名之前,表示此定义的变量是约束变量。基本格式:constraint约约束变量名束变量名;例如:例如:constraintct1;说明:例子中的程序在改写成说明:例子中的程序在改写成不加入不加入“约约束变量束变量”的情况后,仍然可以正常运行的情况后,仍然可以正常运行,在以后的例子中会发现有,在以后的例子中会发现有“约约束变量束变量”的程序要更健壮一些,所以的程序要更健壮一些,所以推荐使用推荐使用“约束变量约束变量”。第六章 ILOG OPL 基础I
12、LOG OPL 简明教程-(2-最简单的例子)maximize:是是OPL的关键字,放在表达式之前,表示求此表的关键字,放在表达式之前,表示求此表达式的最大值。基本格式:达式的最大值。基本格式:maximize表达式表达式;例如:例如:maximize40*gas+50*chloride;subjectto:是是OPL的关键字,放在一组约束之前,是用于约的关键字,放在一组约束之前,是用于约束的另一种形式。基本格式:束的另一种形式。基本格式:subjectto一组约束一组约束;例如:例如:subjecttoct1=gas+chloride=50;ct2=3*gas+4*chloride=180;
13、ct3=chloride=40;如果是最小化问题如果是最小化问题,则使用则使用minimize第六章 ILOG OPL 基础ILOG OPL 简明教程-(2-最简单的例子)将数学模型转化成将数学模型转化成OPL语言方法语言方法数学模型中的目标函数:目标函数:max z=40*Gas+50*Choride OPL语言:maximize 40*Gas+50*Chloride;第六章 ILOG OPL 基础ILOG OPL 简明教程-(2-最简单的例子)将数学模型转化成将数学模型转化成OPL语言方法语言方法数学模型中的约束条件:约束条件:Gas+Chloride=50 3*Gas+4*Chlorid
14、e=180 Chloride=40 OPL语言:subject to ct1=gas*chloride=50;ct2=3*gas+4*chloride=180;ct3=chloride=40;第六章 ILOG OPL 基础ILOG OPL 简明教程-(3-使用数组)使用数组使得模型可读性好,而且容易扩展。通过使用数组,前面的例子使用数组使得模型可读性好,而且容易扩展。通过使用数组,前面的例子可以表示为:可以表示为:stringProducts=gas,chloride;dvarfloatproductionProducts;maximize40*productiongas+50*product
15、ionchloride;subjecttoproductiongas+productionchloride=50;3*productiongas+4*productionchloride=180;productionchloride=40;对比对比LINGO的集;的集;对比对比C的数组下标的数组下标具体解释参见下页具体解释参见下页第六章 ILOG OPL 基础ILOG OPL 简明教程-(3-使用数组)说明:说明:stringProducts=gas,chloride;声明一组字串集合(声明一组字串集合(asetofstrings),表示公司的两个产品),表示公司的两个产品dvarfloatp
16、roductionProducts;声明一个决策变量数组,包含声明一个决策变量数组,包含2个变量个变量,production“gas”和和productionchloride第六章 ILOG OPL 基础ILOG OPL 简明教程-(3-使用数组)注意,很多程序员会把前面的例子简化如下:注意,很多程序员会把前面的例子简化如下:但是会导致编译出错。定义数组的语句中,但是会导致编译出错。定义数组的语句中,数组元素个数数组元素个数不能像高级语言不能像高级语言那样直接给出一个常量,而应该是一个范围那样直接给出一个常量,而应该是一个范围(Range)。正确的写法是:。正确的写法是:第六章 ILOG OP
17、L 基础ILOG OPL 简明教程-(3-使用数组)rangekinds=1.2;dvarfloatproductionkinds;maximize40*production1+50*production2;subjecttoproduction1+production2=50;3*production1+4*production2=180;production2=40;第六章 ILOG OPL 基础ILOG OPL 简明教程-(3-使用数组)看看前面的模型代码:看看前面的模型代码:stringProducts=gas,chloride;dvarfloatproductionProducts;
18、maximize40*productiongas+50*productionchloride;subjecttoproductiongas+productionchloride=50;3*productiongas+4*productionchloride=180;productionchloride=40;可读性还是不好!可读性还是不好!数据直接嵌入到了程序中,不利于扩展数据直接嵌入到了程序中,不利于扩展第六章 ILOG OPL 基础ILOG OPL 简明教程-(3-使用数组)可将数据定义部分进一步修改为:可将数据定义部分进一步修改为:stringProducts=gas,chloride;
19、stringComponents=nitrogen,hydrogen,chlorine;floatdemandProductsComponents=1,3,0,1,4,1;floatprofitProducts=40,50;floatstockComponents=50,180,40;dvarfloat+productionProducts;3种成分种成分受益系数的数组受益系数的数组库存的数组库存的数组产品和成分之间的关系的数组,即每种产产品和成分之间的关系的数组,即每种产品需要的成分的数量。品需要的成分的数量。2种产品种产品对比对比LINGO集的用法集的用法-更接近于更接近于C习惯习惯第六章
20、 ILOG OPL 基础ILOG OPL 简明教程-(3-使用数组)那么,原来的目标函数那么,原来的目标函数maximize40*productiongas+50*productionchloride;就可以修改为:就可以修改为:maximizesum(pinProducts)profitp*productionp;函数,表明针对对每一个成员函数,表明针对对每一个成员p,计算表达式,计算表达式profitp*productionp的和。的和。收益系数收益系数决策变量决策变量对比对比LINGO用法:用法:MAX=SUM(A(I):P(I)*X(I);第六章 ILOG OPL 基础ILOG OPL
21、 简明教程-(3-使用数组)同理,原来的约束同理,原来的约束subjecttoproductiongas+productionchloride=50;3*productiongas+4*productionchloride=180;productionchloride=40;可以修改为:可以修改为:constraintct;subjecttoct=forall(cinComponents)sum(pinProducts)demandpc*productionp=stockc;函数,表明针对每种成分函数,表明针对每种成分c(故共有(故共有3个约束),后面的个约束),后面的sum表达式小于表达式小
22、于stockc必须满足必须满足Sum函数的用法见上页函数的用法见上页对比对比LINGO用法:用法:FOR(WH(I):SUM(VD(J):X(I,J)=AI(I);第六章 ILOG OPL 基础ILOG OPL 简明教程-(3-使用数组)stringProducts=gas,chloride;stringComponents=nitrogen,hydrogen,chlorine;floatdemandProductsComponents=1,3,0,1,4,1;floatprofitProducts=40,50;floatstockComponents=50,180,40;dvarfloat+
23、productionProducts;/constraintnaming.constraintct;maximizesum(pinProducts)profitp*productionp;subjecttoct=forall(cinComponents)sum(pinProducts)demandpc*productionp=stockc;完整代码:完整代码:第六章 ILOG OPL 基础ILOG OPL 简明教程-(4-分离数据)接上节。目前的文件中,数据和模型代码集中在一起,都保存在接上节。目前的文件中,数据和模型代码集中在一起,都保存在mod文件文件中。好的程序结构应该将数据和模型代码分
24、离,保存在不同的文件中。中。好的程序结构应该将数据和模型代码分离,保存在不同的文件中。下面我们通过例子来说明在下面我们通过例子来说明在OPL中如何实现上述目的。中如何实现上述目的。将前面代码中带有初始化数据的部分,将前面代码中带有初始化数据的部分,全部换成全部换成3个点个点:stringProducts=.;stringComponents=.;floatdemandProductsComponents=.;floatprofitProducts=.;floatstockComponents=.;第六章 ILOG OPL 基础ILOG OPL 简明教程-(4-分离数据)如下所示,添加一个如下所
25、示,添加一个sample.dat文件到当前工程。文件到当前工程。第六章 ILOG OPL 基础ILOG OPL 简明教程-(4-分离数据)在数据文件中键入下面的内容:在数据文件中键入下面的内容:Products=gas,chloride;Components=nitrogen,hydrogen,chlorine;profit=40,50;stock=50,180,40;demand=130,141;运行程序,结果和前面的相同。运行程序,结果和前面的相同。第六章 ILOG OPL 基础ILOG OPL 简明教程-(4-分离数据)规范的完整写法:规范的完整写法:Products=gas,chlor
26、ide;Components=nitrogen,hydrogen,chlorine;profit=#gas:40,chloride:50#;stock=#nitrogen:50,hydrogen:180,chlorine:40#;demand=#gas:#nitrogen:1hydrogen:3chlorine:0#,chloride:#nitrogen:1hydrogen:4chlorine:1#;中间可用逗号或者空格中间可用逗号或者空格成员的次序无关成员的次序无关注意:数组类型初始化注意:数组类型初始化用用#加中括号,加中括号,第六章 ILOG OPL 基础ILOG OPL 简明教程-(5
27、-结构体)下面举例说明下面举例说明OPL结构体结构体(Tuples)的用法:的用法:例,一个工厂有例,一个工厂有3种产品种产品(面条面条,面包面包,蛋糕蛋糕),各产品的市场需求量为,各产品的市场需求量为(100,200,300)。工厂可以自己生产产品,也外包生产。如果自己生产,每工厂可以自己生产产品,也外包生产。如果自己生产,每个产品消耗一定的资源(个产品消耗一定的资源(面粉和鸡蛋面粉和鸡蛋),资源总量为),资源总量为(20,40)。如何确定每。如何确定每种产品自己生产和外包的产量,使得总费用最小。种产品自己生产和外包的产量,使得总费用最小。面条面包蛋糕资源消耗面粉0.50.40.3鸡蛋0.2
28、0.40.6费用情况自己生产0.60.80.3外包0.80.90.4第六章 ILOG OPL 基础ILOG OPL 简明教程-(5-结构体)容易得到这个线性规划模型的容易得到这个线性规划模型的OPL程序:程序:stringProducts=.;stringResources=.;floatconsumptionProductsResources=.;floatcapacityResources=.;floatdemandProducts=.;floatinsideCostProducts=.;floatoutsideCostProducts=.;dvarfloat+insideProducts
29、;dvarfloat+outsideProducts;/constraintnaming.constraintct1;constraintct2;stringProducts=.;stringResources=.;floatconsumptionProductsResources=.;floatcapacityResources=.;floatdemandProducts=.;floatinsideCostProducts=.;floatoutsideCostProducts=.;dvarfloat+insideProducts;dvarfloat+outsideProducts;/cons
30、traintnaming.constraintct1;constraintct2;minimizesum(pinProducts)(insideCostp*insidep+outsideCostp*outsidep);subjecttoct1=forall(rinResources)sum(pinProducts)consumptionpr*insidep=demandp;第六章 ILOG OPL 基础ILOG OPL 简明教程-(5-结构体)minimizesum(pinProducts)(insideCostp*insidep+outsideCostp*outsidep);subjectt
31、oct1=forall(rinResources)sum(pinProducts)consumptionpr*insidep=demandp;第六章 ILOG OPL 基础ILOG OPL 简明教程-(5-结构体)数据文件:数据文件:Products=Noodle,Bread,Cake;Resources=flour,eggs;consumption=0.5,0.2,0.4,0.4,0.3,0.6;capacity=20,40;demand=100,200,300;insideCost=0.6,0.8,0.3;outsideCost=0.8,0.9,0.4;第六章 ILOG OPL 基础ILO
32、G OPL 简明教程-(5-结构体)但是,从数据分离的角度来说,上述模型仍然有问题。但是,从数据分离的角度来说,上述模型仍然有问题。demand,insideCost,outsideCost,consumption都是关于都是关于Products的相关信的相关信息,但是被定义成独立的数组,这样模型可读性差,不宜于维护且容易修息,但是被定义成独立的数组,这样模型可读性差,不宜于维护且容易修改出错。改出错。利用利用OPL的的Tuples是一个解决问题的办法。原来的程序可以修改为:是一个解决问题的办法。原来的程序可以修改为:stringProducts=.;stringResources=.;tup
33、leProductDatafloatdemand;floatinsideCost;floatoutsideCost;floatconsumptionResources;ProductDataproductProducts=.;floatcapacityResources=.;相对于声明一个结构体类型相对于声明一个结构体类型注意:末尾无分号!注意:末尾无分号!相对于定义一个结构体数组相对于定义一个结构体数组第六章 ILOG OPL 基础ILOG OPL 简明教程-(5-结构体)dvarfloat+insideProducts;dvarfloat+outsideProducts;minimizes
34、um(pinProducts)(productp.insideCost*insidep+productp.outsideCost*outsidep);subjecttoforall(rinResources)sum(pinProducts)productp.consumptionr*insidep=productp.demand;相对于使用结构体变量中的成员相对于使用结构体变量中的成员(也用一个点取其成员)(也用一个点取其成员)第六章 ILOG OPL 基础ILOG OPL 简明教程-(5-结构体)数据文件修改为:数据文件修改为:Products=Noodle,Bread,Cake;Resou
35、rces=flour,eggs;product=#Noodle:,Bread:,Cake:#;capacity=20,40;Product的初始化也可以简化写为的初始化也可以简化写为product=,;相对于初始化结构体数组相对于初始化结构体数组注意:每个结构体变量初始化使用注意:每个结构体变量初始化使用第六章 ILOG OPL 基础ILOG OPL 简明教程-(6-显示结果)ILOG提供脚本(提供脚本(Script)可以帮助显示程序运行的结果。)可以帮助显示程序运行的结果。在前面的在前面的.mod文件的末尾加入以下代码:文件的末尾加入以下代码:executewriteln(ShowResul
36、ts:);writeln(inside=:,inside);writeln(outside=:,outside);for(pinProducts)writeln(inside,p,.reducedCost=,insidep.reducedCost);输出结果如图所示(注意在输出结果如图所示(注意在Console面板中)面板中)函数:执行脚本函数:执行脚本输出一行信息输出一行信息比较比较C语言的语言的sprintf函数函数第六章 ILOG OPL 基础ILOG OPL 简明教程-(7-设置参数)ILOG提供脚本(提供脚本(Script)可以设置一些)可以设置一些CPLEX参数参数在前面的在前面的
37、.mod文件的末尾加入以下代码:文件的末尾加入以下代码:executePARAMScplex.tilim=100;CPLEX和和OPL有很多可以设置的参数,具体可以参见帮助文档中的有很多可以设置的参数,具体可以参见帮助文档中的“CPLEXParametersandOPLParameters”最大求解时间最大求解时间timelimit=100秒秒第六章 ILOG OPL 基础例:整数规划多背包问题一个背包有一个背包有7种资源(例如体积、重量),每个资源的总量为种资源(例如体积、重量),每个资源的总量为(18209,7692,1333,924,26638,61188,13360)。有。有12个物品
38、,每个物品对应的价格为个物品,每个物品对应的价格为(96,76,56,11,86,10,66,86,83,12,9,81)。一个物品放入背包时,所占用的资。一个物品放入背包时,所占用的资源不同(见表)。问题是如何放置,使总的价格最多。源不同(见表)。问题是如何放置,使总的价格最多。12个物品个物品7种资源种资源第六章 ILOG OPL 基础例:整数规划多背包问题上述问题给出的是一个案例上述问题给出的是一个案例,但我们按照但我们按照通用的多背包问题通用的多背包问题建模建模.首先首先,定义背包的物品总数、资源总数,定义背包的物品总数、资源总数,并定义相应的并定义相应的range以备数组用以备数组用
39、:intnbItems=.;intnbResources=.;rangeItems=1.nbItems;rangeResources=1.nbResources;具体的数量可以由单独的具体的数量可以由单独的data文件给出文件给出.然后定义资源总量、价格、物品占用资源的数组:然后定义资源总量、价格、物品占用资源的数组:intcapacityResources=.;intvalueItems=.;intuseResourcesItems=.;第六章 ILOG OPL 基础例:整数规划多背包问题放入背包的物品所占的资源都是整数,占资源最少为放入背包的物品所占的资源都是整数,占资源最少为1。那么,背
40、包放入。那么,背包放入的物品个数,最小是的物品个数,最小是1个,最大的可能为:个,最大的可能为:maxCount为为Max(18209,7692,1333,924,26638,61188,13360)如果定义如果定义takeItems为决策变量,那么其范围可以定为为决策变量,那么其范围可以定为1,maxCount用用OPL代码来表示:代码来表示:intmaxValue=max(rinResources)capacityr;dvarinttakeItemsin0.maxValue;目标是背包里的价格之和,可以表示为:目标是背包里的价格之和,可以表示为:maximizesum(iinItems)v
41、aluei*takei;取最大函数取最大函数限定了范围:有利限定了范围:有利于求解速度于求解速度资源总量的数组资源总量的数组背包里每种物品放多少?背包里每种物品放多少?第六章 ILOG OPL 基础例:整数规划多背包问题对于每种资源,背包里的物品占用的资源总和都不许超过资源总量,可以对于每种资源,背包里的物品占用的资源总和都不许超过资源总量,可以表示为:表示为:constraintct;subjecttoct=forall(rinResources)sum(iinItems)useri*takei=capacityr;第六章 ILOG OPL 基础例:整数规划多背包问题综上,综上,mod文件为
42、:文件为:intnbItems=.;intnbResources=.;rangeItems=1.nbItems;rangeResources=1.nbResources;intcapacityResources=.;intvalueItems=.;intuseResourcesItems=.;intmaxValue=max(rinResources)capacityr;dvarinttakeItemsin0.maxValue;constraintct;maximizesum(iinItems)valuei*takei;subjecttoct=forall(rinResources)sum(ii
43、nItems)useri*takei=capacityr;第六章 ILOG OPL 基础例:整数规划多背包问题对应的数据文件为:对应的数据文件为:nbResources=7;nbItems=12;capacity=18209,7692,1333,924,26638,61188,13360;value=96,76,56,11,86,10,66,86,83,12,9,81;use=19,1,10,1,1,14,152,11,1,1,1,1,0,4,53,0,0,80,0,4,5,0,0,0,4,660,3,0,30,0,3,0,4,90,0,0,7,0,18,6,770,330,7,0,0,6,0
44、,0,0,20,0,4,52,3,0,0,0,5,4,0,0,0,40,70,4,63,0,0,60,0,4,0,0,32,0,0,0,5,0,3,0,660,0,9;第六章 ILOG OPL 基础例:整数规划多背包问题运行结果:运行结果:FinalSolutionwithobjective261922.0000:take=000154000913333064991180;第六章 ILOG OPL 基础例:混合整数规划混成问题一个工厂要生产一个工厂要生产71吨合金。该合金使用吨合金。该合金使用3种金属合成。生产该合金有四种种金属合成。生产该合金有四种途径:途径:1)直接购买这)直接购买这3种金
45、属合成,对应种金属合成,对应3种金属的价格是种金属的价格是(22,10,13)万万/吨;吨;2)购买原材料(如矿石)炼制,现有)购买原材料(如矿石)炼制,现有2种原材料,价格分别为种原材料,价格分别为(6,5)万万/吨;吨;第第1种种原材料含原材料含3种金属的百分比为种金属的百分比为(0.2,0.05,0.05),第二种是,第二种是(0.01,0,0.3);3)购买废料炼制,现有)购买废料炼制,现有2种废料,价格分别为种废料,价格分别为(7,8)万万/吨;第吨;第1种原材料含种原材料含3种金属的百分比为种金属的百分比为(0,0.6,0.4),第二种是,第二种是(0.01,0,0.7);4)购买
46、锭铁。其价格为)购买锭铁。其价格为9万万/吨;含吨;含3种金属的百分比为种金属的百分比为(0.1,0.45,0.45)生产合金时,合金中生产合金时,合金中3种金属的最低含量的百分比为种金属的最低含量的百分比为(0.05,0.30,0.60),最高含量为最高含量为(0.10,0.40,0.80)。决策问题是:选用哪种途径生产合金,每种途径购买的物料的量是多少。决策问题是:选用哪种途径生产合金,每种途径购买的物料的量是多少。注意锭铁的量注意锭铁的量是整数类型是整数类型第六章 ILOG OPL 基础例:混合整数规划混成问题首先定义金属、原材料、废料、锭铁的种类个数,以及对应的首先定义金属、原材料、废
47、料、锭铁的种类个数,以及对应的range:intnbMetals=.;intnbRaw=.;intnbScrap=.;intnbIngo=.;然后定义上述然后定义上述4种材料对应的价格数组:种材料对应的价格数组:floatcostMetalMetals=.;floatcostRawRaws=.;floatcostScrapScraps=.;floatcostIngoIngos=.;定义合金中定义合金中3种金属的最低含量的百分比的数组:种金属的最低含量的百分比的数组:floatlowMetals=.;floatupMetals=.;322122,10,136,57,890.05,0.30,0.6
48、00.10,0.40,0.80第六章 ILOG OPL 基础例:混合整数规划混成问题然后定义然后定义原材料原材料、废料废料、锭铁锭铁中中含含3种金属的百分比,注意这里是二维种金属的百分比,注意这里是二维数组。例如,原材料有数组。例如,原材料有2种,每种的种,每种的3种金属的百分比都不同。种金属的百分比都不同。floatpercRawMetalsRaws=.;floatpercScrapMetalsScraps=.;floatpercIngoMetalsIngos=.;最后定义合金的总重量:最后定义合金的总重量:intalloy=.;定义决策变量。设购买定义决策变量。设购买3种金属的重量为种金属
49、的重量为w,购买原材料、废料的重量为,购买原材料、废料的重量为r、s,购买,购买锭铁的个数为锭铁的个数为i:dvarfloat+wMetals;dvarfloat+rRaws;dvarfloat+sScraps;dvarint+iIngos;71注意锭铁的量注意锭铁的量是整数类型是整数类型percRaw=0.20,0.01,0.05,0,0.05,0.30;percScrap=0,0.01,0.60,0,0.40,0.70;percIngo=0.10,0.45,0.45;第六章 ILOG OPL 基础例:混合整数规划混成问题不论采取何种购买策略,定义最终不论采取何种购买策略,定义最终3种金属的
50、合计重量为:种金属的合计重量为:dvarfloatmjinMetals;/实际上这是一个中间变量实际上这是一个中间变量考虑到考虑到合金合金包含的包含的3种金属种金属有上限和下限,上述定义可以修改为:有上限和下限,上述定义可以修改为:dvarfloatmjinMetalsinlowj*alloy.upj*alloy;3种金属的总重量必然等于合金重量,这显然有约束种金属的总重量必然等于合金重量,这显然有约束sum(jinMetals)mj=alloy;对于每种金属,其重量等于购买的重量,故有约束对于每种金属,其重量等于购买的重量,故有约束forall(jinMetals)mj=wj+sum(kin
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922