好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

Lingo与外部文件之间的数据传递.doc

11页
  • 卖家[上传人]:cl****1
  • 文档编号:484332229
  • 上传时间:2022-11-12
  • 文档格式:DOC
  • 文档大小:223KB
  • / 11 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • LINGO与外部文件之间的数据传递一、通过 Windows剪贴板传递数据有时侯实际问题的数据在 Word或Excel文件中(通常出现在表格中),在编 写LINGO程序时可以通过剪贴板把表格连同数据传递到 LINGO中下面用实 例来说明具体操作方法例:水资源分配问题某水库可分配的水资源量为7个单位,分配给3个用 户,各用户在分配一定单位水资源以后产生的效益如下表所示, 求最优分配方案用户分配一定水资源量以后的效益水资源量1234567用户151540809095100用户25154060707375用户34264045505153解:用5表示图所示的效益矩阵,引入决策矩阵 X表示水资源分配情况,其中1 用户i分配j单位水资源 X ij _ j 不分配则目标函数是分配方案的总效益最大,约束条件有两条:① 水资源总量7个单位;7② 每个用户得到的水资源数量只能是 0到7共8个数字中的一个,即7 Xij <1j d于是,本问题的数学模型为:3 7max f = C ij X iji妊j ±「7送 Xij 兰 1,i =1,2,3jm3 7丿送瓦j Xij =7i z± j ztXij =0或 1,i =1,2,3, j =1,2,…,7要想通过 Windows的剪贴板把数据传入 LINGO程序的数据段,应当先在Word或Excel中用鼠标选中表格中的数据块,点击菜单中的复制,然后在LINGO中点击Edit菜单中的Paste则数据连同表格一起出现在 LINGO程序中,如下所示:model :sets :user/1..3/;wa/1..7/:sl;fp(user,wa):c,x;en dsetsdata :c=5154080909510051540607073754264045505153;!以上数据从Word中剪贴过来;sl=1 2 3 4 5 6 7 ;!水资源数量等级;en ddatamax = @sum(fp:c*x); !目标函数;@for (fp: @bin (x)); !0-1 变量;@sum(fp(i,j):x(i,j)*sl(j))=7; !水资源总量为 7;@for (user(i): @sum(fp(i,j):x(i,j))<=1); !每个用户最多得到一种水资源数量等级;end程序运行结果:枠阳静E'p平#「:-舉迥生#iterat ion:120.0000Global optimal solucion found atObjective value:VariableValueReduced Cost5L( 1)000000000000SL ( 2}2*000000□.□00000SL t纠3.0000000.OOOOOOSL(即4.000000□.OOOOOOSL ( 5)5・000000□・OOOOOOSL ( 6)GOOOOOO□・000000SL ( 7}7*000000□.OOOOOO二、LINGO与文本文件之间的数据传递1 •从文本文件读取数据函数@file的功能是从文件读取信息,使用格式为:@file (fname);该语句通常放在数据段, 其中参数 fname 是存放数据的文件名, 文件名可以 包含目录路径, 如果不含目录路径, 则默认在当前目录, 该文件必须是纯文本文 件,可以用 Windows 附件中的写字板或记事本创建,文件中可以包含不同的数 据段,数据段之间用“ ~”分开,数据段内的多个数据之间用逗号或空格分开,数据结束时不要加“; ”号,举例如下:model :!6 发点 8 收点运输问题 ;sets :warehouses/ @file ('1.txt') /: capacity;vendors/ @file ('1.txt') /: demand;links(warehouses,vendors): cost, volume;endsets! 目标函数 ;min = @sum(links: cost*volume);! 需求约束 ;@for (vendors(J):@sum(warehouses(I): volume(I,J))=demand(J));! 产量约束 ;@for (warehouses(I):@sum(vendors(J): volume(I,J))<=capacity(I));! 这里是数据 ;data :capacity = @file ('1.txt') ;demand = @file ('1.txt') ;cost = @file ('1.txt') ;enddataend模型的所有数据来自于 1.txt 文件。

      其内容如下:!warehouses 成员 ;WH1 WH2 WH3 WH4 WH5 WH6 ~!vendors 成员 ;V1 V2 V3 V4 V5 V6 V7 V8 ~I 、、广 *■ 1=^.! 产量 ;60 55 51 43 41 52 ~! 销量 ;35 37 22 32 41 32 43 38 ~! 单位运输费用矩阵 ;6 2 6 7 4 2 5 94 9 5 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 5把记录结束标记( ~)之间的数据文件部分称为 记录 如果数据文件中没有 记录结束标记, 那么整个文件被看作单个记录 注意到除了记录结束标记外, 模 型的文本和数据同它们直接放在模型里是一样的我们来看一下在数据文件中的记录结束标记连同模型中 @file 函数调用是如 何工作的当在模型中第一次调用 @file函数时,LINGO打开数据文件,然后读 取第一个记录;第二次调用 @file函数时,LINGO读取第二个记录等等文件的 最后一条记录可以没有记录结束标记,当遇到文件结束标记时, LINGO会读取最后一条记录,然后关闭文件。

      如果最后一条记录也有记录结束标记,那么直到 LINGO求解完当前模型后才关闭该文件如果多个文件保持打开状态,可能就会 导致一些问题,因为这会使同时打开的文件总数超过允许同时打开文件的上限 162.把数据(计算结果)写入文本文件用函数@text可以把计算结果写入文本文件,使用格式是:@text ('jg.txt')= 变量名 ;该语句通常放在数据段,其中参数'jg.txt' 是文件名,它可以由用户按自己的意愿随意起名字, 如果文件不存在, 则在当前目录下生成这个文件, 如果文 件已经存在, 则其中的内容将会被覆盖 文件名可以包含完整的目录路径名, 如 果没有指定路径,则默认路径是 LINGO的当前目录例:职员时序安排模型 一项工作一周 7 天都需要有人(比如护士工作) , 每天(周一至周日)所需的最少职员数为 20、16、13、16、19、14和 12,并要求每个职员一周连续工作 5 天,试求每周所需最少职员数, 并给出安排 注意这 里我们考虑稳定后的情况model :sets :days/mon..sun/: required,start;endsetsdata :! 每天所需的最少职员数 ;required = 20 16 13 16 19 14 12;@text('d:\out.txt')=days ' 至少需要的职员数为 ' start;enddata! 最小化每周所需职员数 ;min = @sum(days: start);@for (days(J):@sum(days(I) | I #le# 5:start( @wrap(J+I+2,7))) >= required(J));end三、LINGO与Excel文件之间的数据传递LINGO通过@ole函数实现与Excel文件传递数据,使用 @ole函数既可以从 Excel 文件中导入数据,也能把计算结果写入 Excel 文件。

      1.从 Excel 文件中导入数据@ole 函数只能用在模型的集合定义段、数据段和初始段,使用格式可以分 成以下几种类型:(1)变量名 1, 变量名 2=@ole(' 文件名',' 数据块名称 1',' 数据块名称 2');从指定的Excel文件读取数据,文件名可以包括扩展名(.xls),还可以包含 完整的路径目录名称,如果没有指定路径,则默认路径是 LINGO 的当前工作目 录该文件中定义了两个数据块, 其中的数据分别用来对变量 1和变量 2初始化 如果变量名是集合, 则对应数据块应该是文本格式表示的集合成员名, 如果变量 名是集合的属性, 则对应数据块应该是一系列数字, 并且, 若变量是初始集合的 属性,则对应的数据块应当是一列数据, 若变量是二维衍生集合的属性, 则对应 数据块应当是二维矩形数据区域 @ole函数无法读取三维数据区域2) 变量名 1, 变量名 2=@ole(' 文件名 ',' 数据块名称 ');左边的两个变量必须定义在同一个集合中, @ole 的参数仅指定一个数据块 名称,该数据块应当包含类型相同的两列数据,第 1列赋值给变量 1,第 2列赋 值给变量 23) 变量名 1, 变量名 2=@ole(' 文件名 ');没有指定数据块名称,默认使用 Excel 文件中与变量名同名的数据块。

      2 •将计算结果导出到Excel文件中使用@ole函数能把计算结果写入 Excel文件,使用格式也有以下三种:( 1) @ole(' 文件名 ',' 数据块名称 1',' 数据块名称 2')= 变量名 1, 变量 名2;将两个变量的内容分别写入指定文件的两个预先已经定义了名称的数据块, 数据块的长度(大小)不应小于变量所包含的数据,如果数据块原来有数据,则 @ole写入语句运行后原来的数据将被新的数据覆盖2) @ole ('文件名',’数据块名称')=变量名1,变量名2;两个变量的数据写入同一数据块(不止 1列),先写变量1,变量2写入另外1列3) @ole ('文件名')=变量名1,变量名2;不指定数据块的名称,默认使用 Exce l文件中与变量名同名的数据块例:投资组合问题某三种股票(A,B,C)12年(1998~2009)的投资收益率R,i =1,2,3)如下表所示(表中还列出各年度500种股票的指数供参考)假设你在2010年有一笔 资金打算投资这三种股票,希望年收益率达到1.15,试给出风险最小的投资方案表 三种股票1998~2009年的收益率年份股票A股票B股票C股票指数19981.31.2251.1491.25899719991.1031.291.261.19752620001.2161.2161.4191.36436120010.9540.7280.92290.91928720020.9291.1441.16491.05708020031.0561.1070.9651.0550。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.