您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > Ilog-CPLEX
ILOG简介Founded1987over700employees2,500+customersSellingin30countriesNASDAQ/Euronext3002001207098990001ISV/OEMPartnersILOG简介ViewsComponentSuiteJViewsComponentSuiteJTGOCPLEXSolverJRulesRulesILOG简介ILOGCPLEXILOGSolver&ILOGJSolverILOGConcertTechnology(C++&Java)HybridILOGOPLStudioILOGSchedulerILOGDispatcherILOGConfiguratorILOGJConfiguratorILOG简介•CoreEngines–ILOGSolver-ConstraintProgrammingEngine–ILOGCPLEX-MathProgrammingEngine•VerticalEngineExtensions–ILOGScheduler-Constraint-BasedScheduling–ILOGDispatcher-VehicleRouting,TechnicianDispatching–ILOGConfigurator-ProductandServiceConfiguration•ModelingTools–OPLStudio-RapidDevelopmentofOptimizationApps–AMPL-ModelingSupportforCPLEXWeuseOPLStudioheresinceitshighlevellanguagemakesitaneasystartingpointMonthWeekDayHourTimestepsScopeStrategicTacticalOperationalApplicationLong-termplanningPublishedScheduleOperationalSchedulingDriversEconomicsFeasibilityTechnologyLPMIP/HybridCPRangeofOptimizationApplicationsILOGhasoptimizationtechnologyfortheentireplanninghorizonILOGOPL简明教程-(1-IDE简介)OPLIDE开发环境介绍1)打开OPLIDE.ILOGOPL简明教程-(1-IDE简介)2)在OPLIDE开发环境中有两种方式可以实现运行上面的代码:1以建立工程的方式:ILOGOPL简明教程-(1-IDE简介)ILOGOPL简明教程-(1-IDE简介)2以建立模型的方式:ILOGOPL简明教程-(1-IDE简介)推荐使用以建立工程的方式进行开发,规范且方便以后开发。ILOGOPL简明教程-(1-IDE简介)求解按钮ILOGOPL简明教程-(2-最简单的例子)例:一个简单的线性规划问题ConsideraBelgiancompanyVolsay,whichspecializesinproducingammoniacgas(NH3)andammoniumchloride(NH4Cl).Volsayhasatitsdisposal50unitsofnitrogen(N),180unitsofhydrogen(H),and40unitsofchlorine(Cl).Thecompanymakesaprofitof40eurosforeachsaleofanammoniacgasunitand50eurosforeachsaleofanammoniumchlorideunit.Volsaywouldlikeaproductionplanmaximizingitsprofitsgivenitsavailablestocks.目标函数:maxz=40*Gas+50*Choride满足约束条件:Gas+Chloride=503*Gas+4*Chloride=180Chloride=40ILOGOPL简明教程-(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语言同,支持//和/**/ILOGOPL简明教程-(2-最简单的例子)说明:dvar,+,constraint,maximize,subjectto都是什么含义?dvar:(decisionvariable)是OPL的关键字,放在前面讲过的“定义变量”之前,表示此定义的变量是决策变量。基本格式是:dvar数据类型变量名;例如:dvarfloatgas;+:一般放在前面讲过的定义的“决策变量”中的“基本数据类型”之后,表示所定义的决策变量是正数。基本格式是:数据类型+变量名;例如:dvarfloat+gas;//“+”只能在决策变量中使用.constraint:是OPL的关键字,定义方式同“定义变量”,放在定义的约束变量名之前,表示此定义的变量是约束变量。基本格式:constraint约束变量名;例如:constraintct1;说明:例子中的程序在改写成不加入“约束变量”的情况后,仍然可以正常运行,在以后的例子中会发现有“约束变量”的程序要更健壮一些,所以推荐使用“约束变量”。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;}如果是最小化问题,则使用minimizeILOGOPL简明教程-(2-最简单的例子)将数学模型转化成OPL语言方法数学模型中的目标函数:maxz=40*Gas+50*ChorideOPL语言:maximize40*Gas+50*Chloride;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简明教程-(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简明教程-(3-使用数组)说明:{string}Products={gas,chloride};声明一组字串(asetofstrings),表示公司的两个产品dvarfloatproduction[Products];声明一个决策变量数组,包含2个变量,production[“gas”]和production[chloride]ILOGOPL简明教程-(3-使用数组)注意,很多程序员会把前面的例子简化如下:但是会导致编译出错。定义数组的语句中,数组元素个数不能像高级语言那样直接给出一个常量,而应该是一个范围(Range)。正确的写法是: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简明教程-(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简明教程-(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种产品ILOGOPL简明教程-(3-使用数组)那么,原来的目标函数maximize40*production[gas]+50*production[chloride];就可以修改为:maximizesum(pinProducts)profit[p]*production[p];函数,表明针对对每一个成员p,计算表达式profit[p]*production[p]的和。收益系数决策变量ILOGOPL简明教程-(3-使用数组)同理,原来的约束subjectto{production[gas]+production[chloride]=50;3*production[gas]+4*production[chloride]=180;production[chloride]=40;}可以修改为:constraintct;subjectto{ct=forall(cinComponents)sum(pinProducts)demand[p][c]*production[p]=stock[c];}函数,表明针对每种成分c(故共有3个约束),后面的sum表达式小于stock[c]必须满足Sum函数的用法见上页ILOGOPL简明教程-(3-使用数组){string}Products={gas,chloride};{string}Compo
本文标题:Ilog-CPLEX
链接地址:https://www.777doc.com/doc-3173261 .html