LINGO与外部文件之间的数据传递一、通过Windows剪贴板传递数据有时侯实际问题的数据在Word或Excel文件中(通常出现在表格中),在编写LINGO程序时可以通过剪贴板把表格连同数据传递到LINGO中下面用实例来说明具体操作方法例:水资源分配问题某水库可分配的水资源量为7个单位,分配给3个用户,各用户在分配一定单位水资源以后产生的效益如下表所示,求最优分配方案用户分配一定水资源量以后的效益水资源量1234567用户151540809095100用户25154060707375用户34264045505153解:用C表示图所示的效益矩阵,引入决策矩阵x表示水资源分配情况,其中ij,1用户i分配j单位水资源X»ij€0不分配则目标函数是分配方案的总效益最大,约束条件有两条:①水资源总量7个单位;②每个用户得到的水资源数量只能是0到7共8个数字中的一个,即…X„1ijj=1于是,本问题的数学模型为:max…3…7CXijiji=1j=1…X„1,i=1,2,3ijj=1《乙乙j-X=7iji=1j=1X=0或1,i=1,2,3,j=1,2,€,7ij要想通过Windows的剪贴板把数据传入LINGO程序的数据段,应当先在Word或Excel中用鼠标选中表格中的数据块,点击菜单中的复制,然后在LINGO中点击Edit菜单中的Paste,则数据连同表格一起出现在LINGO程序中,如下所示:model:sets:user/1..3/;wa/1..7/:sl;fp(user,wa):c,x;endsetsdata:c=5154080909510051540607073754264045505153;!以上数据从Word中剪贴过来;sl=1234567;!水资源数量等级;enddatamax=@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程序运行结果:SolutionReport-水資源分配问题Glulua1opt.irna1solutionfounciatCtoiect.ivevalue:it.已匸曰匸匚口门:120・匚1匚1匚1匚1Vb匸i曰上i丄已ValueReducedCostSL(1)1・nrinn□□匚i・oorinnoSL(2)2・OOUULlOCi・00Ou00SL(3)3・OOUULlOCi・00OU00SL(4)4・OOUULlO匚I・oorinnoSL(5)5.OOUULlOCi・00OU00SL(6)6.OOUULlOCi・00OU00SLI:7)7・OOUULlO匚I・oorinno二、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模型的所有数据来自于文件。
其内容如下:成员成员产量销量单位运输费用矩阵把记录结束标记(~)之间的数据文件部分称为记录如果数据文件中没有记录结束标记,那么整个文件被看作单个记录注意到除了记录结束标记外,模型的文本和数据同它们直接放在模型里是一样的我们来看一下在数据文件中的记录结束标记连同模型中函数调用是如何工作的当在模型中第一次调用函数时,打开数据文件,然后读取第一个记录;第二次调用函数时,读取第二个记录等等文件的最后一条记录可以没有记录结束标记,当遇到文件结束标记时,会读取最后一条记录,然后关闭文件如果最后一条记录也有记录结束标记,那么直到求解完当前模型后才关闭该文件如果多个文件保持打开状态,可能就会导致一些问题,因为这会使同时打开的文件总数超过允许同时打开文件的上限2.把数据(计算结果)写入文本文件用函数@text可以把计算结果写入文本文件,使用格式是:@text('jg.txt')=变量名;该语句通常放在数据段,其中参数'jg.txt'是文件名,它可以由用户按自己的意愿随意起名字,如果文件不存在,则在当前目录下生成这个文件,如果文件已经存在,则其中的内容将会被覆盖文件名可以包含完整的目录路径名,如果没有指定路径,则默认路径是的当前目录。
例:职员时序安排模型一项工作一周7天都需要有人(比如护士工作),每天(周一至周日)所需的最少职员数为2、016、1、316、1、914和1,2并要求每个职员一周连续工作5天,试求每周所需最少职员数,并给出安排注意这里我们考虑稳定后的情况model:sets:days/mon..sun/:required,start;endsetsdata:!每天所需的最少职员数;required=20161316191412;@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三、与文件之间的数据传递通过函数实现与文件传递数据,使用函数既可以从文件中导入数据,也能把计算结果写入文件1从文件中导入数据函数只能用在模型的集合定义段、数据段和初始段,使用格式可以分成以下几种类型:()变量名1,变量名2=@ole('文件名','数据块名称1','数据块名称2');从指定的Excel文件读取数据,文件名可以包括扩展名(.xls),还可以包含完整的路径目录名称,如果没有指定路径,则默认路径是LINGO的当前工作目录。
该文件中定义了两个数据块,其中的数据分别用来对变量1和变量2初始化如果变量名是集合,则对应数据块应该是文本格式表示的集合成员名,如果变量名是集合的属性,则对应数据块应该是一系列数字,并且,若变量是初始集合的属性,则对应的数据块应当是一列数据,若变量是二维衍生集合的属性,则对应数据块应当是二维矩形数据区域函数无法读取三维数据区域)变量名1,变量名2=@ole('文件名','数据块名称');左边的两个变量必须定义在同一个集合中,的参数仅指定一个数据块名称,该数据块应当包含类型相同的两列数据,第1列赋值给变量1,第2列赋值给变量)变量名1,变量名2=@ole('文件名');没有指定数据块名称,默认使用Excel文件中与变量名同名的数据块2.将计算结果导出到Excel文件中使用函数能把计算结果写入Excel文件,使用格式也有以下三种:()@ole('文件名','数据块名称1','数据块名称2')=变量名1,变量5名2;将两个变量的内容分别写入指定文件的两个预先已经定义了名称的数据块,数据块的长度(大小)不应小于变量所包含的数据,如果数据块原来有数据,则写入语句运行后原来的数据将被新的数据覆盖@ole('文件名','数据块名称')=变量名1,变量名2;两个变量的数据写入同一数据块(不止1列),先写变量1,变量2写入另外1列。
@ole('文件名')=变量名1,变量名2;不指定数据块的名称,默认使用Excel文件中与变量名同名的数据块例:投资组合问题某三种股票(A,B,C)12年(1998〜2009)的投资收益率r(i=1,2,3)如下i表所示(表中还列出各年度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.05501220041.0381.3211.1331.18792520051.0891.3051.7321.31713020061.091.1951.0211.24016420071.0831.391.13191.18367520081.0350.9281.0061.25899720091.1761.7151.9081.526236分析:设投资三种股票的资金份额分别为x(i=1,2,3),则有i60,x,1,€x=1iii=1投资的年收益率为Y=€xR,其中R是第i种股票的年收益率,它是随机变量,iiii=1可以用每种股票12年的平均收益率R代表该股票年收益率的数学期望E(R),ii则Y的数学期望为EY=€xR,投资者希望年收益率达到1.15,数学表达式为iii=1€xR>1.15iii=1用什么来衡量投资的风险呢?建议用收益率的方差或标准差来衡量,即方差越大则风险越大,反之则风险小。
按概率论知识,Y的方差为DY=D(€xR)=iii=1€x2D(R)„2xxcov(R,R)„2xxcov(R,R)„2xxcov(R,R)ii121213132323i=1上式可以写成DYxxcov(R,R)ijij。