主讲人:雒兴刚东北大学系统工程研究所Email:luoxinggang@ise.neu.edu.cnTel:83682292优化软件与应用第六章ILOGOPL基础ILOG简介Founded1987590employees2,000+customersSellingin30countriesNASDAQ/Euronext3002001207098990001ISV/OEMPartnersMostinfluentialITcompaniesfor第六章ILOGOPL基础ILOG简介ViewsComponentSuiteJViewsComponentSuiteJTGOCPLEXSolverJRulesRules第六章ILOGOPL基础ILOG简介ILOGCPLEXILOGSolver&ILOGJSolverILOGConcertTechnology(C++&Java)HybridILOGOPLStudioILOGSchedulerILOGDispatcherILOGConfiguratorILOGJConfigurator约束规划solver用java表达运输行业用配置、销售应用第六章ILOGOPL基础ILOG简介•CoreEngines–ILOGSolver-ConstraintProgrammingEngine–ILOGCPLEX-MathProgrammingEngine•VerticalEngineExtensions–ILOGScheduler-Constraint-BasedScheduling–ILOGDispatcher-VehicleRouting,TechnicianDispatching–ILOGConfigurator-ProductandServiceConfiguration•ModelingTools–OPLStudio-RapidDevelopmentofOptimizationApps–AMPL-ModelingSupportforCPLEXWeuseOPLStudioheresinceitshighlevellanguagemakesitaneasystartingpoint第六章ILOGOPL基础MonthWeekDayHourTimestepsScopeStrategicTacticalOperationalApplicationLong-termplanningPublishedScheduleOperationalSchedulingDriversEconomicsFeasibilityTechnologyLPMIP/HybridCPRangeofOptimizationApplicationsILOGhasoptimizationtechnologyfortheentireplanninghorizon第六章ILOGOPL基础ILOGOPL简明教程-(1-IDE简介)OPLIDE开发环境介绍1)打开OPLIDE.第六章ILOGOPL基础ILOGOPL简明教程-(1-IDE简介)2)在OPLIDE开发环境中有两种方式可以实现运行上面的代码:1以建立工程的方式:第六章ILOGOPL基础ILOGOPL简明教程-(1-IDE简介)第六章ILOGOPL基础ILOGOPL简明教程-(1-IDE简介)2以建立模型的方式:第六章ILOGOPL基础ILOGOPL简明教程-(1-IDE简介)推荐使用以建立工程的方式进行开发,规范且方便以后开发。第六章ILOGOPL基础ILOGOPL简明教程-(1-IDE简介)求解按钮第六章ILOGOPL基础ILOGOPL简明教程-(2-最简单的例子)例:一个简单的线性规划问题某公司生产氨气(NH3)and氯化铵(NH4Cl).公司的日处理能力为50单位的氮(N),180单位的氢(H),40单位氯(Cl).氨气的利润是40euros每单位、氯化铵的利润是50euros每单位.如何确定氨气和氯化铵的产量,使利润最大目标函数:maxz=40*Gas+50*Chloride满足约束条件:Gas+Chloride=503*Gas+4*Chloride=180Chloride=40第六章ILOGOPL基础ILOGOPL简明教程-(2-最简单的例子)OPLIDE开发环境中对应编码:dvarfloat+gas;dvarfloat+chloride;//constraintnaming.constraintct1;constraintct2;constraintct3;maximize40*gas+50*chloride;subjectto{ct1=gas+chloride=50;ct2=3*gas+4*chloride=180;ct3=chloride=40;}在OPLIDE开发环境中Console窗口的输出结果:Finalsolutionwithobjective2300:gas=20;chloride=30;注意:注释语句和C语言同,支持//和/**/注意:OPL语言区分大小写!第六章ILOGOPL基础ILOGOPL简明教程-(2-最简单的例子)说明:dvar,+,constraint,maximize,subjectto都是什么含义?dvar:(decisionvariable)是OPL的关键字,放在前面讲过的“定义变量”之前,表示此定义的变量是决策变量。基本格式是:dvar数据类型变量名;例如:dvarfloatgas;+:一般放在前面讲过的定义的“决策变量”中的“基本数据类型”之后,表示所定义的决策变量是正数。基本格式是:数据类型+变量名;例如:dvarfloat+gas;//“+”只能在决策变量中使用.?有没有dvarfloat-gas;的用法?constraint:是OPL的关键字,定义方式同“定义变量”,放在定义的约束变量名之前,表示此定义的变量是约束变量。基本格式:constraint约束变量名;例如:constraintct1;说明:例子中的程序在改写成不加入“约束变量”的情况后,仍然可以正常运行,在以后的例子中会发现有“约束变量”的程序要更健壮一些,所以推荐使用“约束变量”。第六章ILOGOPL基础ILOGOPL简明教程-(2-最简单的例子)maximize:是OPL的关键字,放在表达式之前,表示求此表达式的最大值。基本格式:maximize表达式;例如:maximize40*gas+50*chloride;subjectto:是OPL的关键字,放在一组约束之前,是用于约束的另一种形式。基本格式:subjectto{一组约束};例如:subjectto{ct1=gas+chloride=50;ct2=3*gas+4*chloride=180;ct3=chloride=40;}如果是最小化问题,则使用minimize第六章ILOGOPL基础ILOGOPL简明教程-(2-最简单的例子)将数学模型转化成OPL语言方法数学模型中的目标函数:maxz=40*Gas+50*ChorideOPL语言:maximize40*Gas+50*Chloride;第六章ILOGOPL基础ILOGOPL简明教程-(2-最简单的例子)将数学模型转化成OPL语言方法数学模型中的约束条件:Gas+Chloride=503*Gas+4*Chloride=180Chloride=40OPL语言:subjectto{ct1=gas*chloride=50;ct2=3*gas+4*chloride=180;ct3=chloride=40;}第六章ILOGOPL基础ILOGOPL简明教程-(3-使用数组)使用数组使得模型可读性好,而且容易扩展。通过使用数组,前面的例子可以表示为:{string}Products={gas,chloride};dvarfloatproduction[Products];maximize40*production[gas]+50*production[chloride];subjectto{production[gas]+production[chloride]=50;3*production[gas]+4*production[chloride]=180;production[chloride]=40;}对比LINGO的集;对比C的数组下标具体解释参见下页第六章ILOGOPL基础ILOGOPL简明教程-(3-使用数组)说明:{string}Products={gas,chloride};声明一组字串集合(asetofstrings),表示公司的两个产品dvarfloatproduction[Products];声明一个决策变量数组,包含2个变量,production[“gas”]和production[chloride]第六章ILOGOPL基础ILOGOPL简明教程-(3-使用数组)注意,很多程序员会把前面的例子简化如下:但是会导致编译出错。定义数组的语句中,数组元素个数不能像高级语言那样直接给出一个常量,而应该是一个范围(Range)。正确的写法是:第六章ILOGOPL基础ILOGOPL简明教程-(3-使用数组)rangekinds=1..2;dvarfloatproduction[kinds];maximize40*production[1]+50*production[2];subjectto{production[1]+production[2]=50;3*production[1]+4*production[2]=180;production[2]=40;}第六章ILOGOPL基础ILOGOPL简明教程-(3-使用数组)看看前面的模型代码:{string}Products={gas,chloride};dvarfloatproduction[Products];maximize40*production[gas]+50*production[chloride];subjectto{production[gas]+production[chloride]=50;3*production[gas]+4*production[chloride]=180;production[chloride]=40;}可读性还是不好!数据直接嵌入到了程序中,不利于扩展第六章ILOGOPL基础ILOGOPL简明教程-(3-使用数组)可将数据定义部分进一步修改为:{string}Products={gas,chloride};{string}Components={nitrogen,hydrogen,chlorine};floatdemand[Products][Components]=[[1,3,0],[1,4,1]];floatprofit[Products]=[40,50];floatstock[Components]=[50,180,40];dvarfloat+production[Products];3种成分受益系数的数组库存的数组产品和成分之间的关系的数组,即每种产品需要的成分的数量。2种产品对比LINGO集的用法---更接近于C习惯第六章ILOGOPL基础ILOGOPL简明教程-(3-使用数组)那么,原来的目标函数maximize40*production[gas]+50*production[chloride];就可以修改为:maximizesum(pinProducts)profit[p]*production[p];函数,表明针对对每一个成员p,计算表达式profit[p]*production[p]的和。收益系数决策变量对比LINGO用法:MAX=@SUM(A(I):P(I)*X(I));第六章ILOGOPL基础ILOGOPL简明教程-(3-使用数组)同理,原来的约束subjectto{production[gas]+production[chloride]=50;3*produ