您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 08-第八章-ILOG-OPL进阶功能
主讲人:雒兴刚东北大学系统工程研究所Email:luoxinggang@ise.neu.edu.cnTel:83682292优化软件与应用第八章ILOGOPL进阶功能ILOG数据库连接1、与ODBC数据源的连接OPL支持通过ODBC数据源读取数据库中的数据,下面是数据库连接的语句,都以大写的DB开头:DBconnectiondb(odbc,DRIVER={MicrosoftAccessDriver(*.mdb)};DBQ=..\\examples\\opl\\oilDB.mdb//);功能:打开数据库,建立数据库连接;Db---数据库连接的名字;“odbc”---指明以ODBC方式连接;OPL也同时支持Oracle等RDB直连;“Driver=…”---连接字符串;不同数据库对应的连接字符串不同,有的需要提供用户名称和密码,具体请参阅ODBC文档;第八章ILOGOPL进阶功能ILOG数据库连接Mod文件:{string}Gasolines=...;Dat文件:DBconnectiondb(odbc,DRIVER={MicrosoftAccessDriver(*.mdb)};DBQ=..\\examples\\opl\\oilDB.mdb//);GasolinesfromDBread(db,SELECTnameFROMGasData);Db必须通过前面的DBconnection初始化完毕第八章ILOGOPL进阶功能ILOG数据库连接Mod文件:tupleGasType{stringname;floatdemand;floatprice;floatoctane;floatlead;}{GasType}gasData=...;Dat文件:DBconnectiondb(odbc,DRIVER={MicrosoftAccessDriver(*.mdb)};DBQ=..\\examples\\opl\\oilDB.mdb//);gasDatafromDBread(db,SELECT*FROMGasData);注意:字段名称要和tuple定义成员的名称相同!第八章ILOGOPL进阶功能ILOG数据库连接利用DB语句删除表:DBexecute(db,droptableResult);新建一个表:DBexecute(db,createtableResult(oilvarchar(10),gasvarchar(10),blendreal,areal));输出运行结果到数据库:第八章ILOGOPL进阶功能ILOG数据库连接例如,mod文件为tupleResult{stringoil;stringgas;floatblend;floata;}{string}Oils=...;{string}Gasolines=...;{Result}result={o,g,1,0|oinOils,ginGasolines};Dat文件为DBconnectiondb(odbc,DRIVER={MicrosoftAccessDriver(*.mdb)};DBQ=..\\examples\\opl\\oilDB.mdb//);GasolinesfromDBread(db,SELECTnameFROMGasData);OilsfromDBread(db,SELECTnameFROMOilData);resulttoDBupdate(db,INSERTINTOResult(oil,gas,blend,a)VALUES(?,?,?,?));第八章ILOGOPL进阶功能ILOG数据库连接2、与Excel的连接OPL通过SheetConnection连接Excel表:SheetConnectionsheet(e:\\oilSheet.xls);功能:打开数据库,建立数据库连接;“oilSheet.xls”---文件名称,路径是OPL运行路径;也可以给出全路径;sheet---连接的名称;第八章ILOGOPL进阶功能ILOG数据库连接读取Excel里的数据Mod文件:{string}Gasolines=...;Dat文件:SheetConnectionsheet(e:\\oilSheet.xls);GasolinesfromSheetRead(sheet,gas!A2:A4);注意“gas!A2:A4”中,gas表示Excel的worksheet的名字,A2:A4表示取这个范围内的单元格。sheet必须通过前面的DBconnection初始化完毕第八章ILOGOPL进阶功能ILOG数据库连接Mod文件:tupleGasType{floatdemand;floatprice;floatoctane;floatlead;}{GasType}gasData=...;{int}blend={1,2};Dat文件:SheetConnectionsheet(e:\\oilSheet.xls);gasDatafromSheetRead(sheet,gas!B2:E4);类似的,可以用SheetWrite将数据写到Excel:blendtoSheetWrite(sheet,RESULT!B2:B3);第八章ILOGOPL进阶功能ILOGScript介绍OPL语言主要着眼于模型的建模、表达约束和目标等。但是,优化应用很多时候需要更强的功能去控制算法求解的流程和更强的处理数据的方法。作为一种非建模语言,ILOG脚本提供了这方面的功能。主要的功能包括:数据前处理;数据后处理;流程控制;…第八章ILOGOPL进阶功能ILOGScript介绍ILOG脚本和OPL结合主要有两种方式,一种是嵌入Execute语句,一种是用main函数。二者都在mod文件中。前者主要是用于设置参数、数据的前处理(如数组初始化)和后处理,后者可以提供很强的综合能力,例如参数设置、数据处理、控制程序运行流程、设置改变模型参数重新运行模型等等。例如,可以用下面的Execute语句设置Options里的参数(仅对当前运行的模型有效):executeCPX_PARAM{cplex.preind=0;cplex.simdisplay=2;}注意CPX_PARAM不是关键字,是execute块的名字,同一个文件里的execute块不要重名就可以了。第八章ILOGOPL进阶功能ILOGScript介绍下面的语句输出一行HelloWorld提示信息:executeHELLO{writeln(HelloWorld.);}运行后在Output窗口的Console标签页会看到“Helloworld”字样。另外,execute语句在模型中的位置可以在约束和目标之前,也可以在后。如果在前,就在模型求解之前运行;如果之后,则在模型求解后运行;可以用于数组的初始化。例如:intnNum=10;rangerSample=1..nNum;floatfMyArray[rSample];executeMy_Init{for(vari=1;i=nNum;i++){fMyArray[i]=i*i;writeln(Array,i,=,fMyArray[i]);}}第八章ILOGOPL进阶功能ILOGScript介绍结果输出以下信息:Array1=1Array2=4Array3=9Array4=16Array5=25Array6=36Array7=49Array8=64Array9=81Array10=100这里用到了ILOG脚本的for语句,语法和C语言的用法类似。第八章ILOGOPL进阶功能ILOGScript介绍另外一种方式就是使用main函数。如果mod文件中含有main函数,IDE就会:1.执行约束和目标前的execute语句;2.不自动执行模型求解,也不会执行约束和目标后的execute语句;3.执行main函数,然后结束;例如,可以在一个打开的mod文件中输入一个main函数:main{thisOplModel.generate();}这里的thisOplModel是脚本的一个关键字,表示当前mod文件里的模型和附带的dat文件数据(如果有dat文件)。第八章ILOGOPL进阶功能ILOGScript介绍可以尝试下面的main函数:main{thisOplModel.generate();with(thisOplModel){writeln(HelloWorld.);}}和executeHELLO{writeln(“HelloWorld.”);}功能相同。另一个重要的关键字是cplex,表示当前模型对应的算法实例。参见下例:main{thisOplModel.generate();with(thisOplModel){writeln(HelloWorld.);}cplex.solve();curr=cplex.getObjValue();writeln(Optimal=:,curr);}第八章ILOGOPL进阶功能ILOGScript介绍也可以在main中,根据已有的mod和dat文件,重新建立新的模型,例如:main{varmySrc=newIloOplModelSource(production.mod);varmyDef=newIloOplModelDefinition(mySrc);varmyCplex=newIloCplex();varmyOpl=newIloOplModel(myDef,myCplex);varmyData=newIloOplDataSource(production.dat);myOpl.addDataSource(myData);myOpl.generate();myCplex.solve();myOpl.postProcess();curr=myCplex.getObjValue();writeln(Optimal=:,curr);}第八章ILOGOPL进阶功能ILOGScript介绍脚本也支持函数的定义和调用,语法和C语言类似,但不支持递归和嵌套。例如,下面的定义了一个打印的函数,并在后面调用:functionmyPrint(myPara){for(vinmyOpl.Products){writeln(inside[,v,]=,myPara.inside[v]);writeln(outside[,v,]=,myPara.outside[v]);}}myPrint(myOpl);同时,可以设置断点,并用stepinto、stepoutside等命令进行调试。第八章ILOGOPL进阶功能ILOGScript介绍下面是一个循环调用求解的例子。每次修改面粉的capacity,重新求解模型。main{varmySrc=newIloOplModelSource(production.mod);varmyDef=newIloOplModelDefinition(mySrc);varmyCplex=newIloCplex();varmyOpl=newIloOplModel(myDef,myCplex);varmyData=newIloOplDataSource(production.dat);myOpl.addDataSource(myData);myOpl.generate();for(varv=1;v=10;v++){myCplex.solve();curr=myCplex.getObjValue();writeln(Optimal=:,curr);varmyBidingData=myOpl.dataElements;myBidingData.capacity[flour]+=10;myOpl=newIloOplModel(myDef,myCplex);myOpl.addDataSource(myBidingData);myOpl.generate();}}本例未加出错处理!StartingScriptexecution...Optimal=:372Optimal=:368Optimal=:364Optim
本文标题:08-第八章-ILOG-OPL进阶功能
链接地址:https://www.777doc.com/doc-3177645 .html