09-第九章-ILOG-OPL-建模語(yǔ)言_第1頁(yè)
09-第九章-ILOG-OPL-建模語(yǔ)言_第2頁(yè)
09-第九章-ILOG-OPL-建模語(yǔ)言_第3頁(yè)
09-第九章-ILOG-OPL-建模語(yǔ)言_第4頁(yè)
09-第九章-ILOG-OPL-建模語(yǔ)言_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

主講人:雒興剛東北高校系統(tǒng)工程探討所Email:luoxinggang@Tel:83682292優(yōu)化軟件與應(yīng)用第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)類型1、整型:范圍例:inti=25;intn=3;intsize=n*n;//留意這種初始化很特殊2、浮點(diǎn)型:雙精度,IEEE754standardfloatf=3.2;第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)類型3、字符串型例如{string}Tasks={"masonry","carpentry","plumbing","ceiling","roofing","painting","windows","facade","garden","moving"};定義字符串一個(gè)集合。字符串中的特殊字符:字符串換行:第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)結(jié)構(gòu)1、Range:給定最小和最大值。rangeRows=1..10;intn=8;rangeRows=n+1..2*n+1;用途1:數(shù)組定義rangeR=1..100;intA[R];//Aisanarrayof100integers用途2:循環(huán)rangeR=1..100;forall(iinR){//elementofaloop...}用途3:變量定義dvarintiinR;第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)結(jié)構(gòu)2、數(shù)組一維數(shù)組:inta[1..4]=[10,20,30,40];floatf[1..4]=[1.2,2.3,3.4,4.5];stringd[1..2]=["Monday","Wednesday"];inta[Days]=[10,20,30,40,50,60,70];即元素下標(biāo)可以是字符串,如a["Monday"],...,a["Sunday"].tupleEdges{intorig;intdest;}{Edge}Edges={<1,2>,<1,4>,<1,5>};inta[Edges]=[10,20,30];即下標(biāo)也可以是Tuple,a[<1,2>],a[<1,4>],anda[<1,5>]第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)結(jié)構(gòu)2、數(shù)組多維數(shù)組:inta[1..2][1..3]=...;inta[Days][1..3]=...;//混合下標(biāo){string}Warehouses=...;{string}Customers=...;tupleRoute{stringw;stringc;}{Route}routes=...;inttransp[routes]=...//事實(shí)上transp是二維數(shù)組{string}Warehouses...;{string}Customers...;tupleRoute{Warehousesw;Customersc;}{Route}routes=...;inttransp[routes]=...可能是稀疏矩陣兩種哪個(gè)好些?第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)結(jié)構(gòu)3、Tuple:結(jié)構(gòu)體tuplePoint{intx;inty;};Pointpoint[iin1..3]=<i,i+1>;Pointp=<2,3>;Pointpoint[iin1..3]=<i,i+1>;//Tuple數(shù)組{Point}points={<1,2>,<2,3>};//Tuple集合tupleRectangle{Pointll;Pointur;}//Tuple的TuplePointp=<2,3>;intx=p.x;//取Tuple的成員但是,Tuple的定義里不能出現(xiàn)Tuple集合和Tuple數(shù)組!第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)結(jié)構(gòu)4、集合:可以寫成{T},或者setof(T){int}setInt=...;setof(Precedence)precedences=...;集合初始化:tuplePrecedence{intbefore;intafter;}{Precedence}precedences={<1,2>,<1,3>,<3,4>};第九章ILOG

OPL建模語(yǔ)言O(shè)PL決策變量和約束OPL決策變量運(yùn)用關(guān)鍵字dvardvarinttransp[Orig][Dest]in0..100;//二維數(shù)組變量;限制決策變量范圍tupleRoute{Cityorig;Citydest}{Route}routes=...:dvarinttransp[routes]in0..100;//以有限tuple集routes為索引rangeCapacity=0..limitCapacity;dvarinttransp[Orig][Dest]inCapacity;//in后面是rangedvarintaverageDelayin0..maxDelay;//in后面接變量假如不同決策變量的范圍不同,可以這樣定義intcapacity[route]=...;dvarinttransp[rinroutes]in0..capacity[r];第九章ILOG

OPL建模語(yǔ)言O(shè)PL決策變量和約束也可以用+關(guān)鍵字限制決策變量只能為正:dvarint+x;//nonnegativeintegerdecisionvariabledvarfloat+y;//non-negativedecisionvariabledvarbooleanz;//booleandecisionvariable上述定義等價(jià)于:dvarintxin0..maxint;dvarfloatyin0..infinity;dvarintzin0..1;其中maxint、infinity為OPL關(guān)鍵字。

二維決策變量數(shù)組也可以逐個(gè)元素給定范圍:dvarfloattransp[oinOrig][dinDest]in0..cap[o][d];約束可以單個(gè)定義,也可以定義成數(shù)組形式,如:constraintcapCstr[Machines];第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)初始化總的來(lái)說(shuō),OPL數(shù)據(jù)初始化可以分為2種,一種是在mod文件完成,另一種是在dat文件完成。1、數(shù)組初始化初始化多維數(shù)組:/*.modfile*/inta[1..2][1..3]=...;/*.datfile*/a=[[10,20,30],[40,50,60]];依據(jù)(index,value)的方式初始化數(shù)組:但留意要用#[…]#方式元素次序無(wú)關(guān)。參見下頁(yè)例子:/*.modfile*/inta[Days]=...;/*.datfile*/a=#["Monday":1,"Tuesday":2,"Wednesday":3,"Thursday":4,"Friday":5,"Saturday":6,“Sunday”:7]#;第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)初始化前面的整型索引數(shù)組的初始化也可以寫成:/*.modfile*/inta[1..2][1..3]=...;/*.datfile*/a=#[2:[40,50,60],1:[10,20,30]]#;數(shù)組初始化也可以用ILOG腳本實(shí)現(xiàn),如:rangeR=1..10;inta[R];execute{for(variinR){ a[i]=i+1;}}行下標(biāo),留意這里有意顛倒了次序,但結(jié)果相同第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)初始化也可以用表達(dá)式方式初始化,例如上面的例子也可寫為:inta[iin1..10]=i+1;多維數(shù)組也可以用這種方式,如:intm[iin0..10][jin0..10]=10*i+j;也可以用一個(gè)已知數(shù)組初始化,如:intm[Dim1][Dim2]=...;intt[jinDim2][iinDim1]=m[i][j];也可以用index:item

方式初始化,如:inta[1..10]=[i-1:i|iin2..11];//效果同前面的2個(gè)例子intm[0..10][0..10]=[i:[j:10*i+j]|i,jin0..10];第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)初始化再如,下面的ILOG腳本初始化:GasTypegas[Gasolines];execute{for(vargingasData){ gas[]=g;}}用index:item

方式可以寫成:GasTypegas[Gasolines]=[:g|gingasData];第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)初始化2、Tuple初始化單個(gè)變量初始化干脆用<…>給出成員即可,如:Pointp=<3,2>;Tuple中含有數(shù)組的初始化:tupleRectangle{intid;Pointp[2];}Rectangler=<1,[<0,0>,<10,10>]>;Tuple中含有集合的初始化:{string}Task...;tuplePrecedence{Taskname;{string}after;}Precedencep=<a1,{a2,a3,a4,a5}>;第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)初始化3、集合初始化結(jié)合接受一對(duì)大括號(hào)進(jìn)行初始化,如:tuplePrecedence{intbefore;intafter;}{Precedence}precedences=...;precedences={<1,2>,<1,3>,<3,4>};可以在初始化時(shí)運(yùn)用集合運(yùn)算符,如:{int}s1={1,2,3};{int}s2={1,4,5};{int}i=s1inters2;{int}j={1,4,8,10}inters2;{int}u=s1union{5,7,9};{int}d=s1diffs2;結(jié)果是:i={1},u={1,2,3,5,7,9},d={2,3},sd={2,3,4,5}.留意inter等是集合運(yùn)算符第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)初始化可以利用range初始化集合,如:{int}s=asSet(1..10)//初始化s為{1,2,..,10}asSet是內(nèi)置函數(shù),功能是將range轉(zhuǎn)換為集合也可以用表達(dá)式方式初始化,格式是pinS:condition,如:{int}s={i|iin1..10:imod3==1};//結(jié)果是{1,4,7,10}.也可以定義集合數(shù)組(數(shù)組元素為一個(gè)集合),如:{int}a[iin3..4]={e|ein1..10:emodi==0};初始化a[3]為{3,6,9},a[4]為{4,8}第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)初始化集合很多時(shí)候可以用來(lái)表示稀疏矩陣,如:{string}Nodes...;intedges[Nodes][Nodes]=...;tupleEdge{Nodeso;Nodesd;}{Edge}setEdges={<o,d>|o,dinNodes:edges[o][d]==1};另一個(gè)稍困難一些的例子:{string}Resources...;{string}Tasks...;Tasksres[Resources]=...;tupleDisjunction{{string}first;{string}second;}{Disjunction}disj={<i,j>|rinResources,orderedi,jinres[r]};關(guān)鍵字,強(qiáng)制i<j關(guān)鍵字,強(qiáng)制i<j第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)一樣性為了保證輸入數(shù)據(jù)的正確性,可以通過(guò)assert語(yǔ)句來(lái)判定數(shù)據(jù)的一樣性。這樣在程序運(yùn)行前,可以通過(guò)編譯系統(tǒng)提前發(fā)覺(jué)問(wèn)題。例如,原是的需求和供應(yīng)數(shù)據(jù)具有關(guān)聯(lián)性(總和相等):intdemand[Customers]=...;intsupply[Suppliers]=...;assertsum(sinSuppliers)supply[s]==sum(cinCustomers)demand[c];再如,假如是多產(chǎn)品的狀況:intdemand[Customers][Products]=...;intsupply[Suppliers][Products]=...;assertforall(pinProducts) sum(sinSuppliers) supply[s][p]==sum(cinCustomers)demand[c][p];第九章ILOG

OPL建模語(yǔ)言O(shè)PL數(shù)據(jù)前處理OPL前處理運(yùn)用ILOG腳本,可以進(jìn)行CPLEX參數(shù)設(shè)定,可以變更變量的值、決策變量的范圍,但range和約束類型不能變更。下面是一個(gè)前處理的例子:intn=...;rangeR=1..n;intA[R]=...execute{ for(rinR) { if(A[r]<0){A[r]=0;} }}OPL數(shù)據(jù)處理的次序如下:1、各種數(shù)據(jù)源(如mod文件,dat文件,excel文件,ODBC等);2、execute塊;3、assert塊;第九章ILOG

OPL建模語(yǔ)言表達(dá)式和運(yùn)算符整型表達(dá)式:可以運(yùn)用+,-,*,div(整除),mod(or%)等運(yùn)算符;可以運(yùn)用abs等系統(tǒng)函數(shù);整型常量maxint;浮點(diǎn)表達(dá)式:可以運(yùn)用+,-,/,*等運(yùn)算符;浮點(diǎn)常量infinity;條件表達(dá)式和C語(yǔ)言類似:語(yǔ)法:(condition)?thenExpr:elseExpr例:intvalue=...;intsignValue=(value>0)?1:(value<0)?-1:0;intabsValue=(value>=0)?value:-value;第九章ILOG

OPL建模語(yǔ)言表達(dá)式和運(yùn)算符聚合表達(dá)式:可以利用聚合運(yùn)算符計(jì)算和(sum),連乘(prod),最小(min),最大(max)等。例如:intcapacity[Routes]=...;intminCap=min(rinRoutes)capacity[r];集合表達(dá)式:可以利用union,inter,diff等集合運(yùn)算符,也可以利用集合函數(shù)。例如,現(xiàn)有S是一個(gè)集合{3,6,7,9}item是S的一個(gè)集合成員n是一個(gè)整型數(shù);第九章ILOG

OPL建模語(yǔ)言表達(dá)式和運(yùn)算符S是一個(gè)集合{3,6,7,9}第九章ILOG

OPL建模語(yǔ)言表達(dá)式和運(yùn)算符各類運(yùn)算符總結(jié)和優(yōu)先級(jí):優(yōu)先級(jí)高第九章ILOG

OPL建模語(yǔ)言ILOG約束約束的位置:目標(biāo)函數(shù)必需位于約束之前;約束命名:雖然約束可以不命名,但不利于程序調(diào)試。約束也可以用數(shù)組方式,如:constraintcapacityCons[Resources];constraintdemandCons[Products];

minimizesum(pinProducts)(insideCost[p]*inside[p]+outsideCost[p]*outside[p]);subjectto{forall(rinResources)capacityCons[r]=sum(pinProducts)consumption[p,r]*inside[p]<=capacity[r];forall(pinProducts)demandCons[p]=inside[p]+outside[p]>=demand[p];}第九章ILOG

OPL建模語(yǔ)言ILOG遍歷參數(shù)有多種形式和用途:1、pinS

intn=6;ints==sum(iin1..n)i*i;//用于range{string}Products={"car","truck"};floatcost[Products]=[12000,10000];floatmaxCost=max(pinProducts)cost[p];//用于stringset{string}Cities={“Paris”,“London”,“Berlin”};//用于tuplesettupleConnection{stringorig;

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論