lingo问题,对专业的人来说很简单的。
发布网友
发布时间:2022-05-02 15:59
我来回答
共2个回答
热心网友
时间:2022-06-20 18:51
语法上没有问题啊。
然后是 data1txt文件应该放在lingo的安装目录下面。例如你是安装在D盘,那么只需要将data1txt文件放在相应的文件夹里面就是了。对于程序是不需要修改的。
下面是我找的关于@FILE语句的用法:
@file函数
该函数用从外部文件中输入数据,可以放在模型中任何地方。该函数的语法格式为@file(’filename’)。这里filename是文件名,可以采用相对路径和绝对路径两种表示方式。@file函数对同一文件的两种表示方式的处理和对两个不同的文件处理是一样的,这一点必须注意。
例4.14 以例1.2来讲解@file函数的用法。
注意到在例1.2的编码中有两处涉及到数据。第一个地方是集部分的6个warehouses集成员和8个vendors集成员;第二个地方是数据部分的capacity,demand和cost数据。
为了使数据和我们的模型完全分开,我们把它们移到外部的文本文件中。修改模型代码以便于用@file函数把数据从文本文件中拖到模型中来。修改后(修改处代码黑体加粗)的模型代码如下:
model:
!6发点8收点运输问题;
sets:
warehouses/ @file('1_2.txt') /: capacity;
vendors/ @file('1_2.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_2.txt') ;
demand = @file('1_2.txt') ;
cost = @file('1_2.txt') ;
enddata
end
模型的所有数据来自于1_2.txt文件。其内容如下:
!warehouses成员;
WH1 WH2 WH3 WH4 WH5 WH6 ~
!vendors成员;
V1 V2 V3 V4 V5 V6 V7 V8 ~
!产量;
60 55 51 43 41 52 ~
!销量;
35 37 22 32 41 32 43 38 ~
!单位运输费用矩阵;
6 2 6 7 4 2 5 9
4 9 5 3 8 5 8 2
5 2 1 9 7 4 3 3
7 6 7 3 9 2 7 1
2 3 9 5 7 2 6 5
5 5 2 2 8 1 4 3
把记录结束标记(~)之间的数据文件部分称为记录。如果数据文件中没有记录结束标记,那么整个文件被看作单个记录。注意到除了记录结束标记外,模型的文本和数据同它们直接放在模型里是一样的。
我们来看一下在数据文件中的记录结束标记连同模型中@file函数调用是如何工作的。当在模型中第一次调用@file函数时,LINGO打开数据文件,然后读取第一个记录;第二次调用@file函数时,LINGO读取第二个记录等等。文件的最后一条记录可以没有记录结束标记,当遇到文件结束标记时,LINGO会读取最后一条记录,然后关闭文件。如果最后一条记录也有记录结束标记,那么直到LINGO求解完当前模型后才关闭该文件。如果多个文件保持打开状态,可能就会导致一些问题,因为这会使同时打开的文件总数超过允许同时打开文件的上限16。
当使用@file函数时,可把记录的内容(除了一些记录结束标记外)看作是替代模型中@file(’filename’)位置的文本。这也就是说,一条记录可以是声明的一部分,整个声明,或一系列声明。在数据文件中注释被忽略。注意在LINGO中不允许嵌套调用@file函数。
热心网友
时间:2022-06-20 18:52
这是我改的:
MODEL :
SETS: ! 集合段;
XYI/ @FILE(′data1.txt′) / :
x ,y ,r ; ! 定义变量;
ENDSETS
MIN = R1 - R2 ; ! 目标函数;
! 下面是约束;
R1 = @MAX(XYI(J) :r (J)) ; ! 找出半径的最大值;
R2 = @MIN(XYI(J) :r (J)) ; !
找出半径的最小值;
@for(XYI:@BND(x0LOW ,x0 ,x0HIGH)); ! x0 的范围;
@FOR(XYI:@BND(y0LOW ,y0 ,Y0HIGH)); ! y0 的范围;
@FOR(XYI(I):r(I)=((x(I) - x0(I))*3(x (I)-x0(I)+(y(I)-y0(I))*3(y(I)-y0(I))^(1/2)); ! 计算第i 点处的半径ri ;
DATA : ! 数据段;
x = @FILE(′data1.txt′) ;
y = @FILE(′data1.txt′) ; ! 读入测量点的坐标值;
x0LOW = @FILE(′data1.txt′) ;
x0HIGH = @FILE(′data1.txt′) ; ! 读入x0 的上下界;
y0LOW = @FILE(′data1.txt′) ;
Y0HIGH = @FILE(′data1.txt′) ; ! 读入y0 的上下界;
ENDDATA
END
你的程序中少了很多的“;”,这个符号,记住是英文状态下输入的,你说的txt文档,你放在桌面就可以了!不过你要lingo读的几组数据之间要加入“~”符号,并且lingo读数据的顺序是跟你的语言顺序是一样的!