LINGO与EXCEL之间的数据传递
前言
LINGO 作为非线性规划运算的专用软件,得出结果一般都是纯文本的一列数据,要想将数据呈现到论文当中,需要整理到 EXCEL 中,使用复制粘贴容易出错还费时,所以必须要动用函数来提高效率!
案例场景
有这样一个例子,求发电机厂一天7各时段对4台不同机型的发电机分配开启数量以及输出功率,用LINGO求解,最后需要将7*4=28的数量数据N,以及对应功率P,输出到EXCEL中。如下图所示:


这里的台数和功率都是7行4列的数据。
而利用LINGO算出来的纯文本导出数据长这样:

没错,就这种一路排到底的输出格式,如果是手动复制粘贴,岂不是眼睛都要瞎掉?不过这里值得注意的是,数据的输出是按行输出的,先是N(1,:),再是N(2,:)。
EXCEL 之定义名称
在EXCEL中,使用定义名称,可以将某一块的数据赋予一个指定的名字,这样就和程序里的数据初始化一样,比如定义一个数组,首先要给他一个名字,然后再被其他函数调用。在EXCEL里定义名称的数据可以被宏函数调用。而LINGO也可以通过函数来调用EXCEL中定义了名称的数据。
如何定义名称?
以前面的台数表格为例,框选对应的 7*4 的数据区域,CTRL + F3 ,会弹出窗口(如果没反应,就点击顶部功能栏"公式",找到"定义名称",一样可以弹出窗口),设置名称为NUM,确定。同理可以给功率命名为 POW。


命名完了之后,在表格的左上角下拉可以看到已经命名好的数据,包括了NUM和POW。

最后将表格保存为 Q1_Output.xls ,(或者.xlsx格式,.xls格式时,在调用时可以省去后缀,而.xlsx格式必须加上后缀)。保存好了后,把表格打开,放在一边,不要关闭,因为LINGO写入数据时,可能因为权限不够的原因,关闭状态下的EXCEL无法写入,而后台打开状态时可以写入。
LINGO 之 @OLE
LINGO自带的ole函数可以负责与EXCEL传递数据。语法如下:
!data为数据表,x为表格内标记为x名称的某块区域;
X = @ole('data.xls','x');!从EXCEL导入数据到LINGO;
@ole('data.xls','x') = X;!从LINGO导出数据到EXCEL;
所以为了导出我们的N、P数据,我们写如下代码到 data:里
@OLE('Q1_Output','NUM')=N;
@OLE('Q1_Output','POW')=P;
完整代码如下:
model:
sets:
A /1..7/: T, D ;
B /1..4/:N0,Pmax,Pmin,F,M,S;
U(A,B): N, P ;
endsets
data:
T = 6 3 3 2 4 4 2;
D = 11000 33000 25000 36000 25000 30000 18000;
N0 = 10 5 8 4;
Pmax=1800 1500 2000 3500;
Pmin= 800 1000 1200 1800;
F =2200 1800 3800 4600;
M = 2.7 2.2 1.8 3.6;
S =4000 1500 2500 1000;
@OLE('Q1_Output','NUM')=N;
@OLE('Q1_Output','POW')=P;
enddata
W1 =@sum(B(j):N(1,j)*S(j))+@sum(A(i)|i#ge#2:
@sum(B(j):(N(i,j)-N(i-1,j)+@abs(N(i,j)-N(i-1,j)))
/2*S(j)));
W2=@sum(A(i): @sum(B(j):N(i,j)*F(j)*T(i)));
W3=@sum(A(i): @sum(B(j):(P(i,j)-Pmin(j))*
N(i,j)*M(j)*T(i)));
min =W1+W2+W3;
@for(A(i): @sum(B(j):P(i,j)*N(i,j)) >=D(i));
@for(U(i,j):N(i,j)>=0);
@for(U(i,j):N(i,j)<=N0(j));
@for(U(i,j):@gin(N(i,j)));
@for(U(i,j):Pmin(j)<=P(i,j));
@for(U(i,j):P(i,j)<=Pmax(j));
end
一键导出数据
做好前面两步,即EXCEL数据输出区域命名,还有LINGO导出数据函数,最后把EXCEL打开放在屏幕左边,LINGO放右边,点击solve,坐等程序跑完,EXCEL中就惊现数据了,是不是很nice!?

LINGO与EXCEL之间的数据传递的更多相关文章
- ASP.NET MVC3中Controller与View之间的数据传递
在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一. Controller向Vie ...
- Activity之间的数据传递
最常用的Activity之间的数据传递. btnStartAty1.setOnClickListener(new View.OnClickListener() { @Override public v ...
- ASP.NET MVC 之控制器与视图之间的数据传递
今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...
- (转载)Javascript操作表单之间的数据传递
(转载)http://www.aspxhome.com/javascript/skills/200710/214825.htm 今天有朋友问我关于用JAVASCRIPT来进行页面各表单之间的数据传递的 ...
- iOS开发中视图控制器ViewControllers之间的数据传递
iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storybo ...
- React中父组件与子组件之间的数据传递和标准化的思考
React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异.在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用 ...
- Vue 爬坑之路(二)—— 组件之间的数据传递
Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据.必须使用特定的方法才能实现组件之间的数据传递. 首先用 vue-cli 创建一个项目,其中 App.vue 是父组件,com ...
- sqoop实现关系型数据库与hadoop之间的数据传递-import篇
由于业务数据量日益增长,计算量非常庞大,传统的数仓已经无法满足计算需求了,所以现在基本上都是将数据放到hadoop平台去实现逻辑计算,那么就涉及到如何将oracle数仓的数据迁移到hadoop平台的问 ...
- Activity之间的数据传递-android学习之旅(四十七)
activity之间的数据传递主要有两种,一种是直接发送数据,另一种接受新启动的activity返回的数据,本质是一样的 使用Bundle传递数据 Intent使用Bundle在activity之间传 ...
随机推荐
- 第1章 Spring的应用
一.Spring 的两种核心容器:BeanFactory 和 ApplicationContext(都通过xml加载Bean的) 二.通过ApplicationContext实例化: 1.通过Clas ...
- C# Chart 曲线(多曲线展示)
//绑定显示曲线数据(Chart控件名:) //X轴标题 this.CurveChart.ChartAreas["ChartArea1"].AxisX.Title = " ...
- MongoDB索引存储BTree与LSM树(转载)
1.为什么 MongoDB 使用B-树,而不是B+树 MongoDB 是一种 nosql,也存储在磁盘上,被设计用在数据模型简单,性能要求高的场合.性能要求高,我们看B-树与B+树的区别: B+树内节 ...
- Falcor 学习一基本使用
falcor 是netflix 公司为了解决自己api数据查询所开发的查询框架,很不错(尽管netflix 也在用graphql )以下是falcor 的 一个简单使用,基于express 框架,使用 ...
- planAhead的启动时间较长
发现Xilinx planAhead的启动时间约需10秒钟.
- python自动化测试学习目录
一.python学习目录 <1> ----python驱动 [python驱动]python进行selenium测试时GeckoDriver放在什么地方? python下浏览器静默运行驱动 ...
- java自动化配置工具 - autoconfig 简介
对于java程序员来说各种各样的配置文件是司空见惯的,比如spring的bean配置,struts的action配置等等.有些配置会随着运行环境的变化而各不相同,最典型的就是jdbc驱动的配置,在开发 ...
- SpringBoot:使用feign调用restful服务时地址栏传参
1.服务提供者(controller层) @GetMapping("/user/{id}") public ApiResult getById(@PathVariable(&quo ...
- Android Studio 之 Activity 的生命周期
翻转屏幕,会重新加载Activity package com.example.activitylivecycle; import android.os.Bundle; import android.u ...
- 修改Docker容器启动配置参数
有时候,我们创建容器时忘了添加参数 --restart=always ,当 Docker 重启时,容器未能自动启动, 现在要添加该参数怎么办呢,方法有二: 1.Docker 命令修改 docker c ...