资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,主讲人:雒兴刚,东北大学系统工程争论所,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“;,定义字符串一个集合。,字符串中的特殊字符:,字符串换行:,第九章,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,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;,即元素下标可以是字符串,如a“Monday“,.,a“Sunday“.,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=.;,string 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=;,Point p=;,Point pointi in 1.3=;/Tuple数组,Point points=,;/Tuple集合,tuple Rectangle Point ll;Point ur;/Tuple的Tuple,Point 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 after;,Precedence precedences=,;,第九章,ILOG,OPL,建模语言,OPL 决策变量和约束,OPL决策变量使用关键字dvar,dvar 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 后面是range,dvar 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 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文件完成,另一种是在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 数据初始化,前面的整型索引数组的初始化也可以写成:,/*.mod 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 mDim1Dim2=.;,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;,第九章,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;,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,asSet是内置函数,功能是将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 setEdges=|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语句来判定数据的全都性。这样在程序运行前,可以通过编译系统提前觉察问题。例如,原是的需求和供给数据具有关联性总和相等:,int demandCustomers=.;,int supplySuppliers=.;,assert sum(s in Suppliers)supplys=sum(c in Customers)demandc;,再如,假设是多产品的状况:,int demandCustomers Products=.;,int supplySuppliers Products=.;,asser
展开阅读全文