lingo入门教程之三 --- 文件数据处理

有时候我们想输入的数据是在一个Excel表格或者其他什么形式中,或者说这里数据是实时变化的并不利于直接在程序中输入,耳而应该在程序之外将数据存储,实现数据与程序的分离存储,这个时候就涉及到程序与数据之间的传递

下面简要介绍一个如何进行数据与程序之间的传递

下面的讲解都是基于如下的问题模型

有个城市都需要采购一定量的物品,但每个城市只允许在自身所在的城市采购,城市i的最低需求量为need(i),最大供应量为supply(i),单件采购成本为cost(i),如何采购总成本最小?

模型:设order(i)为城市i的采购量,则问题的数学模型为

lingo入门教程之三 --- 文件数据处理_第1张图片

1.直接粘贴复制

开始的程序

model:
sets:
cities/!待输入的数据个数;/:cost,need,supply,order;
endsets
min=@sum(cities:cost*order);
@for(cities:need<=order;order<=supply);
data:
cost,need,supply=!待输入的数据值;;
enddata
end

直接利用把存储在Excel或者其他什么地方的数据复制粘贴过来,这里需要注意lingo里面的复制是按列进行的(这里在前面已经讲过),不注意的话可能会发生数据赋值的错乱

粘贴的选项

lingo入门教程之三 --- 文件数据处理_第2张图片

可以依次试一下上面的不同粘贴格式的效果

下面是我直接在Excel中Ctrl+C与Ctrl+V实现的

model:
sets:
cities/
Seattle	
Detroit	
Chicago	
Denver	

/:cost,need,supply,order;
endsets
min=@sum(cities:cost*order);
@for(cities:need<=order;order<=supply);
data:
cost,need,supply=
12	1600	1700	
28	1800	1900	
15	1200	1300	
20	1000	1100	

;
enddata
end

2.读取ldt数据文件:@file(数据文件名);
这里默认数据文件与程序文件在同一子目录下面,否则找不到数据文件而报错
model:
sets:
cities/@file(数据文件.ldt)/:@file(数据文件.ldt);
endsets
min=@sum(cities:cost*order);
@for(cities:need<=order;order<=supply);
data:
cost=@file(数据文件.ldt);
need=@file(数据文件.ldt);
supply=@file(数据文件.ldt);
enddata
end

如果路径不一致,也可以手动添加,Edit --> insert new object...

lingo入门教程之三 --- 文件数据处理_第3张图片


应当注意此时的文件类型的ldt格式,

具体里面内容:Seattle,Detroit,Chicago,Denver~cost,need,supply,order~12,28,15,20~1600,1800,1200,1000~1700,1900,1300,1100 注意中间的不同赋值用~间隔


3.存取Excel数据文件:@ole(文件名,元素名);

model:
sets:
cities/@ole('原始数据1.xls','cities')/:cost,need,supply,order;
endsets
min=@sum(cities:cost*order);
@for(cities:need<=order;order<=supply);
data:
cost,need,supply=@ole('原始数据1.xls'); !读取数据文件
@ole('原始数据1.xls','order')=order; !将计算结果存入表格中
enddata
end

对于路径不一致的情况解决方式与上述一样



你可能感兴趣的:(lingo)