教学课件:第九章-ILOG-OPL-建模语言.ppt

上传人:牧羊曲112 文档编号:6290281 上传时间:2023-10-14 格式:PPT 页数:28 大小:305.82KB
返回 下载 相关 举报
教学课件:第九章-ILOG-OPL-建模语言.ppt_第1页
第1页 / 共28页
教学课件:第九章-ILOG-OPL-建模语言.ppt_第2页
第2页 / 共28页
教学课件:第九章-ILOG-OPL-建模语言.ppt_第3页
第3页 / 共28页
教学课件:第九章-ILOG-OPL-建模语言.ppt_第4页
第4页 / 共28页
教学课件:第九章-ILOG-OPL-建模语言.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《教学课件:第九章-ILOG-OPL-建模语言.ppt》由会员分享,可在线阅读,更多相关《教学课件:第九章-ILOG-OPL-建模语言.ppt(28页珍藏版)》请在三一办公上搜索。

1、主讲人:雒兴刚东北大学系统工程研究所Email:Tel:83682292,优化软件与应用,第九章 ILOG OPL 建模语言,OPL 数据类型,1、整型:范围例:int i=25;int n=3;int size=n*n;/注意这种初始化很特别2、浮点型:双精度,IEEE 754 standard float f=3.2;,第九章 ILOG OPL 建模语言,OPL 数据类型,3、字符串型例如string Tasks=masonry,carpentry,plumbing,ceiling,roofing,painting,windows,facade,garden,moving;定义字符串一个集

2、合。字符串中的特殊字符:字符串换行:,第九章 ILOG OPL 建模语言,OPL 数据结构,1、Range:给定最小和最大值。range Rows=1.10;int n=8;range Rows=n+1.2*n+1;用途1:数组定义range R=1.100;int AR;/A is an array of 100 integers 用途2:循环range R=1.100;forall(i in R)/element of a loop.用途3:变量定义dvar int i in R;,第九章 ILOG OPL 建模语言,OPL 数据结构,2、数组一维数组:int a1.4=10,20,30,

3、40;float f1.4=1.2,2.3,3.4,4.5;string d1.2=Monday,Wednesday;int aDays=10,20,30,40,50,60,70;即元素下标可以是字符串,如aMonday,.,aSunday.tuple Edges int orig;int dest;Edge Edges=,;int aEdges=10,20,30;即下标也可以是Tuple,a,a,and a,第九章 ILOG OPL 建模语言,OPL 数据结构,2、数组多维数组:int a1.21.3=.;int aDays1.3=.;/混合下标string Warehouses=.;str

4、ing Customers=.;tuple Route string w;string c;Route routes=.;int transproutes=./实际上transp是二维数组string Warehouses.;string Customers.;tuple Route Warehouses w;Customers c;Route routes=.;int transproutes=.,可能是稀疏矩阵,两种哪个好些?,第九章 ILOG OPL 建模语言,OPL 数据结构,3、Tuple:结构体tuple Point int x;int y;Point pointi in 1.3=

5、;Point p=;Point pointi in 1.3=;/Tuple数组Point points=,;/Tuple集合tuple Rectangle Point ll;Point ur;/Tuple的TuplePoint p=;int x=p.x;/取Tuple的成员但是,Tuple的定义里不能出现Tuple集合和Tuple数组!,第九章 ILOG OPL 建模语言,OPL 数据结构,4、集合:可以写成T,或者 setof(T)int setInt=.;setof(Precedence)precedences=.;集合初始化:tuple Precedence int before;int

6、 after;Precedence precedences=,;,第九章 ILOG OPL 建模语言,OPL 决策变量和约束,OPL决策变量使用关键字dvardvar int transpOrigDest in 0.100;/二维数组变量;限制决策变量范围tuple Route City orig;City dest Route routes=.:dvar int transproutes in 0.100;/以有限tuple集routes 为索引range Capacity=0.limitCapacity;dvar int transpOrigDest in Capacity;/in 后面是

7、rangedvar int averageDelay in 0.maxDelay;/in 后面接变量如果不同决策变量的范围不同,可以这样定义int capacityroute=.;dvar int transpr in routes in 0.capacityr;,第九章 ILOG OPL 建模语言,OPL 决策变量和约束,也可以用关键字限制决策变量只能为正:dvar int+x;/non negative integer decision variable dvar float+y;/non-negative decision variable dvar boolean z;/boolean

8、 decision variable 上述定义等价于:dvar int x in 0.maxint;dvar float y in 0.infinity;dvar int z in 0.1;其中maxint、infinity为OPL关键字。二维决策变量数组也可以逐个元素给定范围:dvar float transpo in Origd in Dest in 0.capod;约束可以单个定义,也可以定义成数组形式,如:constraint capCstrMachines;,第九章 ILOG OPL 建模语言,OPL 数据初始化,总的来说,OPL数据初始化可以分为2种,一种是在mod文件完成,另一种

9、是在dat文件完成。1、数组初始化初始化多维数组:/*.mod file*/int a1.21.3=.;/*.dat file*/a=10,20,30,40,50,60;按照(index,value)的方式初始化数组:但注意要用#方式元素次序无关。参见下页例子:,/*.mod file*/int aDays=.;/*.dat file*/a=#Monday:1,Tuesday:2,Wednesday:3,Thursday:4,Friday:5,Saturday:6,“Sunday”:7#;,第九章 ILOG OPL 建模语言,OPL 数据初始化,前面的整型索引数组的初始化也可以写成:/*.mo

10、d file*/int a1.21.3=.;/*.dat file*/a=#2:40,50,60,1:10,20,30#;数组初始化也可以用ILOG脚本实现,如:range R=1.10;int aR;execute for(var i in R)ai=i+1;,行下标,注意这里故意颠倒了次序,但结果相同,第九章 ILOG OPL 建模语言,OPL 数据初始化,也可以用表达式方式初始化,例如上面的例子也可写为:int ai in 1.10=i+1;多维数组也可以用这种方式,如:int mi in 0.10j in 0.10=10*i+j;也可以用一个已知数组初始化,如:int mDim1Dim

11、2=.;int tj in Dim2i in Dim1=mij;也可以用index:item 方式初始化,如:int a1.10=i-1:i|i in 2.11;/效果同前面的2个例子int m0.100.10=i:j:10*i+j|i,j in 0.10;,第九章 ILOG OPL 建模语言,OPL 数据初始化,再如,下面的ILOG脚本初始化:GasType gasGasolines;execute for(var g in gasData)gasg.name=g;用index:item 方式可以写成:GasType gasGasolines=g.name:g|g in gasData;,第

12、九章 ILOG OPL 建模语言,OPL 数据初始化,2、Tuple初始化单个变量初始化直接用 给出成员即可,如:Point p=;Tuple中含有数组的初始化:tuple Rectangle int id;Point p2;Rectangle r=,;Tuple中含有集合的初始化:string Task.;tuple Precedence Task name;string after;Precedence p=;,第九章 ILOG OPL 建模语言,OPL 数据初始化,3、集合初始化结合采用一对大括号进行初始化,如:tuple Precedence int before;int after;

13、Precedence precedences=.;precedences=,;可以在初始化时使用集合运算符,如:int s1=1,2,3;int s2=1,4,5;int i=s1 inter s2;int j=1,4,8,10 inter s2;int u=s1 union 5,7,9;int d=s1 diff s2;,结果是:i 1,u 1,2,3,5,7,9,d 2,3,sd 2,3,4,5.注意inter 等是集合运算符,第九章 ILOG OPL 建模语言,OPL 数据初始化,可以利用range初始化集合,如:int s=asSet(1.10)/初始化 s为 1,2,.,10 asS

14、et是内置函数,功能是将range转换为集合也可以用表达式方式初始化,格式是p in S:condition,如:int s=i|i in 1.10:i mod 3=1;/结果是1,4,7,10.也可以定义集合数组(数组元素为一个集合),如:int ai in 3.4=e|e in 1.10:e mod i=0;初始化a3 为 3,6,9,a4 为 4,8,第九章 ILOG OPL 建模语言,OPL 数据初始化,集合很多时候可以用来表示稀疏矩阵,如:string Nodes.;int edgesNodesNodes=.;tuple Edge Nodes o;Nodes d;Edge setEd

15、ges=|o,d in Nodes:edgesod=1;另一个稍复杂一些的例子:string Resources.;string Tasks.;Tasks resResources=.;tuple Disjunction string first;string second;Disjunction disj=|r in Resources,ordered i,j in resr;,关键字,强制ij,关键字,强制ij,第九章 ILOG OPL 建模语言,OPL 数据一致性,为了保证输入数据的正确性,可以通过assert语句来判定数据的一致性。这样在程序运行前,可以通过编译系统提前发现问题。例如,

16、原是的需求和供应数据具有关联性(总和相等):int demandCustomers=.;int supplySuppliers=.;assert sum(s in Suppliers)supplys=sum(c in Customers)demandc;再如,如果是多产品的情况:int demandCustomers Products=.;int supplySuppliers Products=.;assert forall(p in Products)sum(s in Suppliers)supplysp=sum(c in Customers)demandcp;,第九章 ILOG OPL

17、建模语言,OPL 数据前处理,OPL前处理使用ILOG脚本,可以进行CPLEX参数设定,可以改变变量的值、决策变量的范围,但range和约束类型不能改变。下面是一个前处理的例子:int n=.;range R=1.n;int AR=.execute for(r in R)if(Ar0)Ar=0;OPL数据处理的次序如下:1、各种数据源(如mod文件,dat文件,excel文件,ODBC等);2、execute块;3、assert块;,第九章 ILOG OPL 建模语言,表达式和运算符,整型表达式:可以使用+,-,*,div(整除),mod(or%)等运算符;可以使用abs等系统函数;整型常量m

18、axint;浮点表达式:可以使用+,-,/,*等运算符;浮点常量infinity;条件表达式和C语言类似:语法:(condition)?thenExpr:elseExpr 例:int value=.;int signValue=(value0)?1:(value=0)?value:-value;,第九章 ILOG OPL 建模语言,表达式和运算符,聚合表达式:可以利用聚合运算符计算和(sum),连乘(prod),最小(min),最大(max)等。例如:int capacityRoutes=.;int minCap=min(r in Routes)capacityr;集合表达式:可以利用unio

19、n,inter,diff等集合运算符,也可以利用集合函数。例如,现有S 是一个集合 3,6,7,9 item 是S 的一个集合成员n 是一个整型数;,第九章 ILOG OPL 建模语言,表达式和运算符,S 是一个集合 3,6,7,9,第九章 ILOG OPL 建模语言,表达式和运算符,各类运算符总结和优先级:,优先级高,第九章 ILOG OPL 建模语言,ILOG 约束,约束的位置:目标函数必须位于约束之前;约束命名:虽然约束可以不命名,但不利于程序调试。约束也可以用数组方式,如:constraint capacityConsResources;constraint demandConsPro

20、ducts;minimize sum(p in Products)(insideCostp*insidep+outsideCostp*outsidep);subject to forall(r in Resources)capacityConsr=sum(p in Products)consumptionp,r*insidep=demandp;,第九章 ILOG OPL 建模语言,ILOG 遍历参数,有多种形式和用途:1、p in S int n=6;int s=sum(i in 1.n)i*i;/用于rangestring Products=car,truck;float costProdu

21、cts=12000,10000;float maxCost=max(p in Products)costp;/用于string setstring Cities=“Paris”,“London”,“Berlin”;/用于tuple settuple Connection string orig;string dest;Connection connections=,;float costconnections=1000,2000;float maxCost=max(r in connections)costr;,第九章 ILOG OPL 建模语言,ILOG 遍历参数,2、p in S:filt

22、ering condition int n=8;dvar int a1.n1.n;subject to forall(i in 1.8)forall(j in 1.8:i=0;int s=sum(i,j in 1.n:i=0;forall(i in 1.n,j in 1.n:i=0;forall(ordered i,j in 1.n)aij=0;/这3个等价,第九章 ILOG OPL 建模语言,ILOG 遍历参数,3、filtering tuple 考虑下面的例子forall(c in connections)sum(in routes:c=co)trans in routes)trans=limit;这种用法称为Implicit Slicing,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号