lingo与电子表格的相互连接

来源:互联网 发布:微信公众营销软件 编辑:程序博客网 时间:2024/05/16 01:26

第九章  与电子表格的相互连接

 

导言

 

正如我们已经提到的, 在一个 LINGO 模型文件里维护数据可能是讨厌的和不实用的。当数据比较多时更是如此(大多数实际模型都是如此)。电子表格Excel善于处理小到中等数量的数据。 它在处理和显示模型产生的结果方面也是非常有用的工具。 因为这些理由,LINGO有一些连接函数,允许使用者输入来自电子表格的数据和输出解答到电子表格。 这些连接包括与Excel的实时对象连接和嵌入(OLEExcel的连接、OLE的自动连接(它可用于Excel宏驱动LINGO)、和内含的OLE连接(它允许输入LINGO的功能到Excel)。目前,所有的这些函数仅在 LINGO Windows版本之下有支援。

 

一、             从电子表格输入数据

 

LINGO 为输入来自电子表格的数据提供函数 @OLE  这个函数只在 LINGO Windows版本之下是可得的。  @OLE直接执行行在 LINGO Excel 之间的数据的对象连接与嵌入传输。

 

 

(1)       @OLE Excel 输入数据

@OLE 是一个接口函数,它使用 OLE 传输完成从 Excel 输入和输出数据的任务。  OLE 移动直接在内存进行,并不利用中间的文件。 当使用@OLE函数的时候,LINGO 装载 Excel 和被需要的电子表格,并指定请求的数据范围。 你一定要有 Excel 5 或稍后的版本才可以使用 @OLE 函数。@OLE 函数可以被用于数据段和初始段来输入数据。 

 

@ OLE 能阅读集合的成员和集合的属性,集合成员期望以本文的格式,而集合属性期望以数值的格式。原始集合需要为每个集合成员配备一次数据单元,也就是,每单元一个集合成员。你将需要 n 单元的值去初始化 n 维导出集合的每个集合成员,在第一个n单元包含第一个集合成员,第二个 n 单元包含第二个集合成员,等等。 

@OLE 能读出一维或并列的二维数组 (放于一个单页的数组), 但不能读出不连续的或三维的数组 (横贯超过单页的数组)

 

数组将从左到右、从上到下被读出。

 

 

(2)       在数据段和初始段用@OLE 输入数据

在数据段和初始段用@OLE 输入数据的句法都是:

 

object_list = @OLE(  'spreadsheet_file'[, range_name_list]);

 

Object_list 是一列模型目标,用逗号随意分开,它们将要由电子表格的数据初始化。Object_list 可以包含集合名字、集合属性和数值变量的任意组合。

 

参量 spreadsheet_file 是从中取回数据的 Excel 电子表格文件的名字。参量range_name_list 是电子表格中从中取回数据的命名的范围。范围必须完全地包含在 object_list中的每个成员的一个元素。如何指定范围有三种选择。首先,你可以完全地省略范围参量。 在这种情况, LINGO 默认使用与 object_list 中的目标名字完全相同一连串的范围名字。其次,你可以指定从中取回所有的数据的单一范围的名字。 在这种情况, 在object_list中的所有目标必须被定义在同一个集合上,而且 LINGO 读数据好像它是一个表格。当为多样的目标指定叙述一个单一的范围名字的时候,所有的目标必须是有相同的数据类型的。此外, 你可以混合集合成员 (本文) 和集合属性(数值的)。最后,你能为 object_list中的每一个目标指定一个范围名字。在这种情况,物体不须在同一集合上被定义和可能是不一致的数据类型。  使用@OLE的这三个方法的例子如下:

 

 

Example 1:      COST, CAPACITY = @OLE( 'SPECS.XLS');

 

没有范围名字被指定作为访问@OLE的部分,所以LINGO 缺省地使用模型的目标的名字。 于是,COST CAPACITY 由分别在Excel 文件SPECS.XLS 的范围COST CAPACITY 找到的值初始化。

 

Example 2:      COST, CAPACITY = @OLE( 'SPECS.XLS', 'DATATABLE');

 

在本例,我们指定单一的范围去初始化COST CAPACITY两者。假设DATABLE 范围有两列,LINGO 用第一列的数据初始化 COST,而用第二列的数据初始化CAPACITY。注意,为了使这种方法能工作,COST CAPACITY 两者必须定义在同意集合。此外,它们必须两者同是集合或集合属性,混合类型不允许用于该格式。

 

Example 3:      COST, CAPACITY = @OLE( 'SPECS.XLS', 'COST01', 'CAP01');

 

在本例,我们指定各别的范围去初始化COST CAPACITY两者。COST 将用在 COST01 范围的数据初始化,而 CAPACITY 将在 CAP01 范围获得数值。

 

(3)       在传输模型中用@OLE输入

现在我们用LINGOGetting Started一节引进的Wireless Widgets传输模型来更详细地显示函数@OLE的用法。模型复制如下,改动部分用黑体表示。

 

! A 6 Warehouse 8 Vendor Transportation Problem;

 

SETS:

! Import warehouses and vendors from Excel;

   WAREHOUSES: CAPACITY;

   VENDORS   : DEMAND;

   LINKS( WAREHOUSES, VENDORS): COST, VOLUME;

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))

     <= CAPACITY( I));

 

DATA:

! Import the data from Excel;

   WAREHOUSES, VENDORS, CAPACITY, DEMAND, COST =

    @OLE( 'C:/LINGO/SAMPLES/WIDGETS.XLS',

     'WAREHOUSES', 'VENDORS', 'CAPACITY',

      'DEMAND', 'COST');

ENDDATA

 

Model: WIDGETS3

 

代替在模型的原文详细地列出数据,我们现在完全从电子表格

WIDGETS.XLS 输入它们。下面是WIDGETS.XLS的显示: 

 

 

除了输入数据到这个表,我们还必须为cost, capacity, demand, vendor name warehouse name regions定义范围名字。特定地,我们定义下述范围名字:

 

Name      Range

Capacity  K5:K10

Cost C5:J10

Demand  C11:J11

Vendors   C4:J4

Warehouses    B5:B10

 

为在 Excel定义范围:

1.         按住鼠标的左键拖鼠标以选择范围,

2.    释放鼠标,

3.    选择 Insert|Name|Define 命令,

4.    输入想要的名字,

5.    单击 OK 按钮。

 

在模型的数据段我们用下面的@OLE函数的实例从Excel输入数据:

 

WAREHOUSES, VENDORS, CAPACITY, DEMAND, COST =

 @OLE( 'C:/LINGO/SAMPLES/WIDGETS.XLS',

  'WAREHOUSES', 'VENDORS', 'CAPACITY',

   'DEMAND', 'COST');

 

注意到因为模型的目标所有都是原始集合或集合属性,它们有如同它们对应的电子表格范围一样的名字, 我们应该可以放弃范围名字参量而采用同等的但较短的版本:

 

WAREHOUSES, VENDORS, CAPACITY, DEMAND, COST =

 @OLE( 'C:/LINGO/SAMPLES/WIDGETS.XLS');

 

顺便说明, 我们用了单一的 @OLE 函数去为这一个模型读所有的数据。然而,这不是必需的。为了更清楚,你可以选择使用多个 @OLE 函数,也许对每个模型目标各一个。

 

当我们解决这一个模型的时候, LINGO 将会装载 Excel( 假定它不是已经运行的),装载WIDGETS工作单, 然后从工作单中为CAPACITY, COST DEMAND的集合属性,连同WAREHOUSES VENDORS集合的成员一起输入数据。解答的摘录如下:

 

Optimal solution found at step:        16

Objective value:                 664.0000

        Variable      Value   Reduced Cost

VOLUME( WH1, V2)   19.00000      0.0000000

VOLUME( WH1, V5)   41.00000      0.0000000

VOLUME( WH2, V4)   32.00000      0.0000000

VOLUME( WH2, V8)   1.000000      0.0000000

VOLUME( WH3, V2)   12.00000      0.0000000

VOLUME( WH3, V3)   22.00000      0.0000000

VOLUME( WH3, V7)   17.00000      0.0000000

VOLUME( WH4, V6)   6.000000      0.0000000

VOLUME( WH4, V8)   37.00000      0.0000000

VOLUME( WH5, V1)   35.00000      0.0000000

VOLUME( WH5, V2)   6.000000      0.0000000

VOLUME( WH6, V6)   26.00000      0.0000000

VOLUME( WH6, V7)   26.00000      0.0000000