END
例1.7.2;
MODEL: SETS:
cutfa/1,2,3/:X; buj/1..4/:L,NEED; SHUL(cutfa,buj):N; ENDSETS DATA:
L=4 5 6 8;
NEED=50 10 20 15; ZL=19; ENDDATA
MIN=@SUM(cutfa:x);
@FOR(buj(J):@sum(cutfa(I):N(I,J)*X(I))>=NEED(J)); @FOR(cutfa(I):@SUM(buj(J):N(I,J)*L(J))<=ZL); @FOR(cutfa(I):@SUM(buj(J):N(I,J)*L(J))>=16); @FOR(SHUL:@GIN(N)); @FOR(cutfa:@GIN(X)); END
例1.7.3;
MODEL: SETS:
SHC/A1..A6/:AI,X; YF/B1..B5/:BJ; JIAGE(SHC,YF):C; ENDSETS DATA:
AI=2,1,1.8,1.2,2.0,1.2; BJ=6,125,12500,345,5; C=0.45,20,415,22,0.3 0.45,28,4065,5,0.35 0.65,40,850,43,0.6 0.4,25,75,27,0.2 0.5,26,76,48,0.4 0.5,75,235,8,0.6; ENDDATA
MIN=@SUM(SHC:AI*X);
@FOR(SHC(I):@GIN(X(I))); @FOR(SHC(I):X(I)>=1); @SUM(SHC(I):X(I))=14; X(2)<=3;
页 第46
X(4)<=2;
@FOR(SHC(I)|I #NE# 2 #AND# I#NE# 4:X(I)<=4); @FOR(YF(J):@SUM(SHC(I):X(I)*C(I,J))>=BJ(J)); END
例1.7.4(1);
MODEL: SETS:
gd/1..6/:x,y,d; lch/A,B/:px,py,e; links(gd,lch):c; ENDSETS DATA:
X=1.25 8.75 0.5 5.75 3 7.25; Y=1.25 0.75 4.75 5 6.5 7.75; d=3,5,4,7,6,11; px=5,2; py=1,7; e=20,20; ENDDATA
MIN=@sum(links(i,j):c(i,j)*((px(j)-x(i))^2+(py(j)-y(i))^2)^(1/2)); @for(gd(i):@sum(lch(j):c(i,j))=d(i)); @for(lch(j):@sum(gd(i):c(i,j))<=e(j)); END
例1.7.4(2);
MODEL: SETS:
gd/1..6/:x,y,d; lch/A,B/:px,py,e; links(gd,lch):c; ENDSETS DATA:
X=1.25 8.75 0.5 5.75 3 7.25; Y=1.25 0.75 4.75 5 6.5 7.75; d=3,5,4,7,6,11; e=20,20; ENDDATA
MIN=@sum(links(i,j):c(i,j)*((px(j)-x(i))^2+(py(j)-y(i))^2)^(1/2)); @for(gd(i):@sum(lch(j):c(i,j))=d(i)); @for(lch(j):@sum(gd(i):c(i,j))<=e(j)); END
例1.7.5; MODEL: SETS:
页 第47
WORKER/W1..W5/; JOB/J1..J5/;
LINKS(WORKER,JOB):C,X; ENDSETS DATA:
C=8,6,10,9,12, 9,12,7,11,9, 7,4,3,5,8, 9,5,8,11,8, 4,6,7,5,11; ENDDATA
MIN=@SUM(LINKS:C*X);
@FOR(WORKER(I):@SUM(JOB(J):X(I,J))=1); @FOR(JOB(J):@SUM(WORKER(I):X(I,J))=1); @FOR(LINKS:@BIN(X)); END
例1.7.6;
model:
max=1.12*x41+1.18*x32+1.26*x23+1.05*x54; x11+x14=100;
x21+x23+x24=1.05*x14;
x31+x32+x34=1.12*x11+1.05*x24; x41+x44=1.12*x21+1.05*x34; x54=1.12*x31+1.05*x44; x23<=30; x32<=40; end
八、 LINGO与外部文件之间的数据传输
有时候实际问题的数据在WORD、EXCEL或ACCESS等文件中,在编写LINGO程序时,为了避免逐个输入的麻烦,可以采用以下几种方式进行数据传输。 8.1通过Windows剪贴板传递数据
可以通过剪贴板把表格连同数据传递到LINGO中,下面分别用实例来说明具体的操作。 例:1.7.3a(复制粘贴文本文件内容); 例:1.7.3cut&paste(复制粘贴EXCEL内容) 8.2通过文件传输函数
输入和输出函数可以把模型和外部数据比如文本文件、数据库和电子表格等连接起来。 1.@file函数
使用格式为:@file(filename)
页 第48
该函数的功能是从外部文件读取信息,可以放在模型中任何地方,要求文件必须是纯文本文件,比如写字板或记事本文件。这里filename存放数据的文件名,文件名可以包含目录路径,如果不含目录路径,则默认为在当前目录。文件之中可以包含不同的数据段,数据段之间用“~”分开,数据段内的多个数据之间用逗号或空格分开,数据结束时不要加“;”号。
例:1.7.3inputtxt;
MODEL: SETS:
SHC/A1..A6/:AI,X; YF/B1..B5/:BJ; JIAGE(SHC,YF):C; ENDSETS DATA:
AI=@FILE(C:\\Documents and Settings\\Administrator\\桌面\\LINGO\\lingo培训课件\\173data.txt);
BJ=@file(C:\\Documents and Settings\\Administrator\\桌面\\LINGO\\lingo培训课件\\173data.txt);
C=@file(C:\\Documents and Settings\\Administrator\\桌面\\LINGO\\lingo培训课件\\173data.txt); ENDDATA
MIN=@SUM(SHC:AI*X);
@FOR(SHC(I):@GIN(X(I))); @FOR(SHC(I):X(I)>=1); @SUM(SHC(I):X(I))=14; X(2)<=3; X(4)<=2;
@FOR(SHC(I)|I #NE# 2 #AND# I#NE# 4:X(I)<=4); @FOR(YF(J):@SUM(SHC(I):X(I)*C(I,J))>=BJ(J)); END
模型的数据来自于173data.txt文件。其内容如下: 2,1,1.8,1.2,2.0,1.2~ 6,125,12500,345,5~ 0.45,20,415,22,0.3 0.45,28,4065,5,0.35 0.65,40,850,43,0.6 0.4,25,75,27,0.2 0.5,26,76,48,0.4 0.5,75,235,8,0.6
我们来看一下在数据文件中的数据同模型中@file函数调用是如何工作的。当在模型中第一次调用@file函数时,LINGO打开数据文件,然后读取第一个数据段;第二次调用@file函
页 第49
数时,LINGO读取第二个数据段等。文件的最后一个数据段可以没有结束标记“~”,当遇到文件结束标记时,LINGO会读取最后一条数据,然后关闭文件。如果最后一条数据段也有结束标记,那么直到LINGO求解完当前模型后才关闭该文件。
当使用@file函数时,可把数据段的内容(除了一些数据段结束标记外)看作是替代模型中@file(filename)位置的文本。注意在LINGO中不允许嵌套调用@file函数。
2.@text函数
语法为:@text(‘filename’)=变量名
该函数被用在数据部分用来把解输出至文本文件中。它可以输出集成员和集属性值。 这里filename是文件名,可以采用相对路径和绝对路径两种表示方式。如果忽略filename,那么数据就被输出到标准输出设备(大多数情形都是屏幕)。@text函数仅能出现在模型数据部分的一条语句的左边,右边是集名(用来输出该集的所有成员名)或集属性名(用来输出该集属性的值)。该语句通常放在数据段,其中参数‘filename’是文件名,它可以由用户按自己的意愿随意起个名字,如果文件不存在,则在当前目录下生成这个文件,如果文件已经存在,则其中的内容将会被覆盖,文件名可以包含完整的目录路径名,如果没有指定路径,则默认路径是LINGO的当前工作目录。
例:1.7.3outputtxt
MODEL: SETS:
SHC/A1..A6/:AI,X; YF/B1..B5/:BJ; JIAGE(SHC,YF):C; ENDSETS DATA:
AI=2,1,1.8,1.2,2.0,1.2; BJ=6,125,12500,345,5; C=0.45,20,415,22,0.3 0.45,28,4065,5,0.35 0.65,40,850,43,0.6 0.4,25,75,27,0.2 0.5,26,76,48,0.4 0.5,75,235,8,0.6;
@text('output.txt')=c; ENDDATA
MIN=@SUM(SHC:AI*X);
@FOR(SHC(I):@GIN(X(I))); @FOR(SHC(I):X(I)>=1); @SUM(SHC(I):X(I))=14;
页 第50