您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 05-第五章-Lingo高级功能
主讲人:雒兴刚东北大学系统工程研究所Email:luoxinggang@ise.neu.edu.cnTel:83682292优化软件与应用第五章Lingo高级功能Lingo与数据库连接电子制表软件善于管理小到中等规模的数据。一旦我们的模型要处理大规模的数据,首选的就是数据库管理系统DBMS。Lingo可与任何DBMS进行连接。ODBC为DBMS定义了一个标准化接口。借助于它,Lingo可以访问任何ODBC支持的数据库。Lingo为下列DBMS安装了ODBC驱动程序:Access;Dbase;Excel;FoxPro;Oracle;Paradox;SQLServerLingo与数据库连接无论是基本集合还是派生集合,都可以从一个ODBC数据源中输入。在集合域里输入基本集合元素的语法:Primitive_Set_name/@ODBC([‘data_source’[,’table_name’[,’column_name’]]])/基本集合名(Primitive_Set_name)是正在定义的基本集合的名字。数据源(data_source)参数是用ODBC管理器注册过的ODBC数据源的名字。数据表名(table_name)参数是含有集合元素表(在数据源里)的名称。最后,列名(column_name)参数就是上面数据表的列名•利用@ODBC输入集合元素第五章Lingo高级功能Lingo与数据库连接如果数据源参数被忽略了,则模型的标题(Title)取而代之;如果数据表被忽略了,则基本集合的名字取而代之。如果列名被忽略了,基本集合的名字取而代之。只有在忽略列名参数的情况下才可以忽略数据表名参数;只有在数据表名参数和列名参数都被忽略的情况下才可以忽略数据源参数。第五章Lingo高级功能Lingo与数据库连接•ODBC的例子例1:TRUCKS/@ODBC(‘SHIPPING’,TRUCKS’,’TRUCK_NAME’)/数据表TRUCKS是存放在ODBC数据源SHIPPING里的。Lingo将此表的TRUCK_NAME列里的元素输入到基本集合TRUCKS之中。例2:STOCKS/@ODBC(‘PORTFOLIO’)/在这个例子中,数据表名和列名都被忽略了,所以Lingo用基本集合名STOCKS取而代之。因此,Lingo将表STOCKS里的STOCKS列中的元素输入到基本集合STOCKS之中,而表STOCKS是存放在ODBC数据源PORTFOLIO里的。第五章Lingo高级功能Lingo与数据库连接•例:ODBC数据源连接下面是一个夹带数据的LINGO程序(6仓库8客户问题)SETS:WAREHOUSES/WH1WH2/:CAPACITY;VENDORS/V1V2V3/:DEMAND;LINKS(WAREHOUSES,VENDORS):COST,VOLUME;ENDSETS!Theobjective;MIN=@SUM(LINKS(I,J):COST(I,J)*VOLUME(I,J));!Thedemandconstraints;@FOR(VENDORS(J):@SUM(WAREHOUSES(I):VOLUME(I,J))=DEMAND(J));!Thecapacityconstraints;@FOR(WAREHOUSES(I):@SUM(VENDORS(J):VOLUME(I,J))=CAPACITY(I));第五章Lingo高级功能Lingo与数据库连接•例:ODBC数据源连接!Hereisthedata;DATA:CAPACITY=6055;DEMAND=353722;COST=626495;ENDDATA红色的数据部分应该从程序中分离!第五章Lingo高级功能Lingo与数据库连接•例:ODBC数据源连接下面建立数据库文件和ODBC数据源。首先,打开Access,建立一个空的数据库,这里命名为ODBC_expl.mdb;建立三个表,WareHouse、Vendor和Shipping;第五章Lingo高级功能Lingo与数据库连接•例:ODBC数据源连接三个表WareHouse、Vendor和Shipping的表结构如图所示。注意这些表的ID字段也可没有;SET对应的字段类型为文本类型;DATA对应字段类型为数字类型。特别注意,这里WAREHOUSES和WENDORS两个字段的名字一定要和LINKS(WAREHOUSES,VENDORS)括号里的名字相同!!!第五章Lingo高级功能Lingo与数据库连接•例:ODBC数据源连接三个表WareHouse、Vendor和Shipping的中的数据如图所示。第五章Lingo高级功能Lingo与数据库连接•例:ODBC数据源连接建立数据库文件后,就可以配置ODBC数据源。控制面板-》管理工具-》ODBC数据源;单击“Add”第五章Lingo高级功能Lingo与数据库连接•例:ODBC数据源连接DataSourceName处,键入MyODBC;点击“Database”下的“Select”按钮,选择前面建立的数据库文件;点击确定配置ODBC数据源结束。修改Lingo代码如下页。第五章Lingo高级功能Lingo与数据库连接•例:ODBC数据源连接SETS:WAREHOUSES/@ODBC('MyODBC','WareHouse','Name')/:CAPACITY;VENDORS/@ODBC('MyODBC','Vendor','Name')/:DEMAND;LINKS(WAREHOUSES,VENDORS):COST,VOLUME;ENDSETS!Theobjective;MIN=@SUM(LINKS(I,J):COST(I,J)*VOLUME(I,J));!Thedemandconstraints;@FOR(VENDORS(J):@SUM(WAREHOUSES(I):VOLUME(I,J))=DEMAND(J));!Thecapacityconstraints;@FOR(WAREHOUSES(I):@SUM(VENDORS(J):VOLUME(I,J))=CAPACITY(I));!Hereisthedata;DATA:CAPACITY=@ODBC('MyODBC','WareHouse','Capacity');DEMAND=@ODBC('MyODBC','Vendor','Require');COST=@ODBC('MyODBC','Shipping','Cost');ENDDATA第五章Lingo高级功能Lingo与高级语言连接•Lingo可以和VisualC++、VisualBasic等软件开发中应用尽管Lingo是一个交互性的模型构建环境,但是也可以利用Lingo提供的一些功能嵌入自己构造的应用程序中。Lingo允许采用动态连接库,(DLL)的方式让外部的应用程序调用它的功能。这样其它的应用程序可以构造前台程序,而和模型相关的复杂问题交给Lingo在后台运算,这一点对最终的用户是透明的。第五章Lingo高级功能Lingo与高级语言连接Lingo的动态连接库是一个32位的DLL,因此可以运行在Windows95及以后的版本中。在这里将演示采用VisualC/C++andVisualBasic等如何使用动态连接库调用Lingo的。而其它开发工具如何调用,可以参照这些例子完成。Lingo的动态连接库第五章Lingo高级功能Lingo与高级语言连接MODEL:SETS:DAYS:REQUIRED,START;ENDSETSDATA:DAYS=MONTUEWEDTHUFRISATSUN;REQUIRED=20161316191412;ENDDATAMIN=@SUM(DAYS(I):START(I));@FOR(DAYS(J):@SUM(DAYS(I)|I#LE#5:START(@WRAP(J-I+1,7)))=REQUIRED(J));ENDLingo与VC++连接举例:StaffSchedulingProblem第五章Lingo高级功能Lingo与高级语言连接MODEL:SETS:DAYS:REQUIRED,START;ENDSETSDATA:DAYS=@POINTER(1);REQUIRED=@POINTER(2);ENDDATA[OBJECTIVE]MIN=@SUM(DAYS(I):START(I));@FOR(DAYS(J):@SUM(DAYS(I)|I#LE#5:START(@WRAP(J-I+1,7)))=REQUIRED(J));DATA:@POINTER(3)=START;@POINTER(4)=OBJECTIVE;@POINTER(5)=@STATUS();ENDDATAEND修改Lingo代码如下:程序代码保存在C:\exmp.lng中.注意不要保存为lg4格式,因为take命令对字符要求很严格,用ASCii纯文本格式比较安全.输出部分的Data要放在程序后部,否则解释时会不认识OBJECTIVE第五章Lingo高级功能如有问题,可以查看VC工程目录中的“LINGO.log”进行debugLingo与高级语言连接数据域中的@POINTER函数的功能是在Lingo求解器与调用的应用程序之间建立起直接的内存连接。这样的基于内存的数据传输将是高效快捷的,避免了基于磁盘文件的数据传输当外部程序调用Lingo的动态链接库时,将传递给Lingo一个内存指针列表。@POINTER(n)表示指针列表中的第n个指针。@POINTER函数仅在外部程序通过DLL接口方式访问模型时在模型的内部使用。当@POINTER函数出现在等式的右侧时,(如下所示)表示从外部程序传递的数据赋值给模型中的内容。NEEDS=@POINTER(1);反之,则是将模型内部的数据传递到外部程序中。@POINTER函数采用双精度浮点指针格式读写所有的数据。BASIC以及C/C++程序员可以采用double数据类型,而FORTRAN程序员采用的数据类型为REAL*8或者DOUBLEPRECISION.第五章Lingo高级功能Lingo与高级语言连接由于LINGO假定程序员已经正确的分配了内存空间,因此在使用@POINTER函数设置内存时,必须确认分配了适当的内存空间。如果程序员没有分配足够的内存空间,将导致内存保护错误,或者出现没有警告的计算错误。DATA:DAYS=@POINTER(1);REQUIRED=@POINTER(2);ENDDATADATA:@POINTER(3)=START;@POINTER(4)=OBJECTIVE;@POINTER(5)=@STATUS();ENDDATA注意START等属性排列的先后顺序。第五章Lingo高级功能Lingo与高级语言连接LINGO的动态链接库将输出若干个函数,它们在库文件LINGO8\DLL\LINGOD80.LIB中有列表,并可以将这些函数导入到MicrosoftC或者FORTRAN中.VisualBasic用户可以通过在项目中包含模块文件导入LINGO8\DLL\LINGOD80.BAS完成上述功能。下面给出Lingo动态链接库的输出函数:(1):voidLSclearPointersLng(pLSenvLINGOpL)清除通过LSsetPointerLng()函数建立起来@POINTER()内存区域参数:pL指向LScreateEnvLng()函数建立的内存区域(2):intLScloseLogFileLng(pLSenvLINGOpL)关闭由LSopenLogFileLng()函数打开的Lingo创建的LOG文件参数:指向LScreateEnvLng()函数建立的内存区域返回值:没有错误返回0,非零表示出错。第五章Lingo高级功能Lingo与高级语言连接(3):pLSenvLINGOCALLTYPELScreateEnvLng();创建Lingo的内存环境对象。所有的Lingo例程都需要一个合法的指向内存环境对象的指针。返回值:返回0表示出错,
本文标题:05-第五章-Lingo高级功能
链接地址:https://www.777doc.com/doc-4815256 .html