05-第五章 Lingo高级功能 优化软件与应用 教学课件

上传人:飞*** 文档编号:56889861 上传时间:2018-10-16 格式:PPT 页数:33 大小:488KB
返回 下载 相关 举报
05-第五章 Lingo高级功能 优化软件与应用 教学课件_第1页
第1页 / 共33页
05-第五章 Lingo高级功能 优化软件与应用 教学课件_第2页
第2页 / 共33页
05-第五章 Lingo高级功能 优化软件与应用 教学课件_第3页
第3页 / 共33页
05-第五章 Lingo高级功能 优化软件与应用 教学课件_第4页
第4页 / 共33页
05-第五章 Lingo高级功能 优化软件与应用 教学课件_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《05-第五章 Lingo高级功能 优化软件与应用 教学课件》由会员分享,可在线阅读,更多相关《05-第五章 Lingo高级功能 优化软件与应用 教学课件(33页珍藏版)》请在金锄头文库上搜索。

1、主讲人: 雒兴刚 东北大学系统工程研究所 Email: Tel: 83682292,优化软件与应用,第五章 Lingo高级功能,Lingo与数据库连接,电子制表软件善于管理小到中等规模的数据。一旦我们的模型要处理大规模的数据,首选的就是数据库管理系统DBMS。Lingo可与任何DBMS进行连接。ODBC为DBMS定义了一个标准化接口。借助于它,Lingo可以访问任何ODBC支持的数据库。Lingo为下列DBMS安装了ODBC驱动程序: Access;Dbase;Excel;FoxPro;Oracle;Paradox;SQL Server,Lingo与数据库连接,无论是基本集合还是派生集合,都可

2、以从一个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与数据库连接,如果数据源参数被忽略了,则模型的标题(

3、Title)取而代之; 如果数据表被忽略了,则基本集合的名字取而代之。 如果列名被忽略了,基本集合的名字取而代之。只有在忽略列名参数的情况下才可以忽略数据表名参数;只有在数据表名参数和列名参数都被忽略的情况下才可以忽略数据源参数。,第五章 Lingo高级功能,Lingo与数据库连接,ODBC的例子,例1:TRUCKS/ODBC(SHIPPING,TRUCKS,TRUCK_NAME)/数据表TRUCKS是存放在ODBC数据源SHIPPING里的。Lingo将此表的TRUCK_NAME列里的元素输入到基本集合TRUCKS之中。例2:STOCKS/ODBC(PORTFOLIO)/ 在这个例子中,数据

4、表名和列名都被忽略了,所以Lingo用基本集合名STOCKS取而代之。因此,Lingo将表STOCKS里的STOCKS列中的元素输入到基本集合STOCKS之中,而表STOCKS是存放在ODBC数据源PORTFOLIO里的。,第五章 Lingo高级功能,Lingo与数据库连接,例:ODBC数据源连接,下面是一个夹带数据的LINGO程序(6仓库8客户问题) SETS:WAREHOUSES / WH1 WH2/: CAPACITY;VENDORS / V1 V2 V3/ : DEMAND;LINKS( WAREHOUSES, VENDORS): COST, VOLUME; ENDSETS ! The

5、 objective;MIN = SUM( LINKS( I, J): COST( I, J) * VOLUME( I, J); ! The demand constraints;FOR( VENDORS( J): SUM( WAREHOUSES( I): VOLUME( I, J) = DEMAND( J); ! The capacity constraints;FOR( WAREHOUSES( I): SUM( VENDORS( J): VOLUME( I, J) = CAPACITY( I);,第五章 Lingo高级功能,Lingo与数据库连接,例:ODBC数据源连接,! Here is

6、 the data; DATA:CAPACITY = 60 55;DEMAND = 35 37 22;COST = 6 2 64 9 5; ENDDATA,红色的数据部分应该从程序中分离!,第五章 Lingo高级功能,Lingo与数据库连接,例:ODBC数据源连接,下面建立数据库文件和ODBC数据源。首先,打开Access,建立一个空的数据库,这里命名为ODBC_expl.mdb;建立三个表,WareHouse、Vendor和Shipping;,第五章 Lingo高级功能,Lingo与数据库连接,例:ODBC数据源连接,三个表WareHouse、Vendor和Shipping的表结构如图所示。

7、注意这些表的ID字段也可没有; SET对应的字段类型为文本类型; DATA对应字段类型为数字类型。,特别注意,这里WAREHOUSES和WENDORS两个字段的名字一定要和LINKS( WAREHOUSES, VENDORS)括号里的名字相同!,第五章 Lingo高级功能,Lingo与数据库连接,例:ODBC数据源连接,三个表WareHouse、Vendor和Shipping的中的数据如图所示。,第五章 Lingo高级功能,Lingo与数据库连接,例:ODBC数据源连接,建立数据库文件后,就可以配置ODBC数据源。控制面板管理工具ODBC数据源;单击“Add”,第五章 Lingo高级功能,Li

8、ngo与数据库连接,例:ODBC数据源连接,Data Source Name处,键入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

9、; ENDSETS ! The objective;MIN = SUM( LINKS( I, J): COST( I, J) * VOLUME( I, J); ! The demand constraints;FOR( VENDORS( J): SUM( WAREHOUSES( I): VOLUME( I, J) = DEMAND( J); ! The capacity constraints;FOR( WAREHOUSES( I): SUM( VENDORS( J): VOLUME( I, J) = REQUIRED( J) ); END,Lingo与VC+连接举例:Staff Schedu

10、ling Problem,第五章 Lingo高级功能,Lingo与高级语言连接,MODEL: SETS:DAYS: REQUIRED, START; ENDSETSDATA:DAYS =POINTER(1);REQUIRED =POINTER(2); ENDDATAOBJECTIVE 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) = OBJECT

11、IVE;POINTER(5) = STATUS(); ENDDATA END,修改Lingo代码如下:,程序代码保存在C:exmp.lng中. 注意不要保存为lg4格式,因为take命令对字符要求很严格,用ASCii纯文本格式比较安全.,输出部分的Data要放在程序后部,否则解释时会不认识OBJECTIVE,第五章 Lingo高级功能,如有问题,可以查看VC工程目录中的“LINGO.log”进行debug,Lingo与高级语言连接,数据域中的 POINTER函数的功能是在Lingo求解器与调用的应用程序之间建立起直接的内存连接 。这样的基于内存的数据传输将是高效快捷的,避免了基于磁盘文件的数据

12、传输当外部程序调用Lingo的动态链接库时,将传递给Lingo一个内存指针列表。POINTER ( n) 表示指针列表中的第n个指针。 POINTER 函数仅在外部程序通过DLL接口方式访问模型时在模型的内部使用。当 POINTER函数出现在等式的右侧时,(如下所示)表示从外部程序传递的数据赋值给模型中的内容。 NEEDS = POINTER( 1); 反之,则是将模型内部的数据传递到外部程序中。POINTER函数采用双精度浮点指针格式读写所有的数据。 BASIC 以及 C/C+ 程序员可以采用 double 数据类型,而FORTRAN程序员 采用的数据类型为 REAL*8 或者 DOUBLE

13、 PRECISION.,第五章 Lingo高级功能,Lingo与高级语言连接,由于LINGO 假定程序员已经正确的分配了内存空间,因此在使用POINTER函数设置内存时,必须确认分配了适当的内存空间 。如果程序员没有分配足够的内存空间,将导致内存保护错误,或者出现没有警告的计算错误。 DATA:DAYS =POINTER(1);REQUIRED =POINTER(2); ENDDATA DATA:POINTER(3) = START;POINTER(4) = OBJECTIVE;POINTER(5) = STATUS(); ENDDATA注意START等属性排列的先后顺序。,第五章 Lingo

14、高级功能,Lingo与高级语言连接,LINGO 的动态链接库将输出若干个函数,它们在库文件LINGO8DLLLINGOD80.LIB中有列表,并可以将这些函数导入到Microsoft C或者FORTRAN中. Visual Basic用户可以通过在项目中包含模块文件导入 LINGO8DLLLINGOD80.BAS完成上述功能。 下面给出Lingo动态链接库的输出函数: (1):void LSclearPointersLng( pLSenvLINGO pL) 清除通过LSsetPointerLng()函数建立起来POINTER()内存区域 参数:pL 指向LScreateEnvLng()函数建立的内存区域 (2): int LScloseLogFileLng( pLSenvLINGO pL) 关闭由LSopenLogFileLng()函数打开的Lingo创建的LOG文件 参数:指向LScreateEnvLng()函数建立的内存区域 返回值:没有错误返回0,非零表示出错。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号