如何在 VSCode 中配置和编写 LINGO

LINGO 是用来解决优化问题的一个特别好用的软件,可以快速求解线性规划、非线性规划、线性和非线性方程组等规划问题。,LINGO 好处多多确实很方便,但是 LINGO 18.0 原生的 IDE 不能说依托答辩吧,只能说惨不忍睹:无论是冷战风格的远古界面还是一写注释就会混乱的代码高亮,以及兼容性奇差无比的富文本支持,都让我这种赛博颜狗感到满满的恶意。按照我的理解和猜测,包括我在内的很多人都会强势诉诸于其他的代码编辑器,比如 Visual Stdio Code。

但是与此同时,当你在网上一搜索,就会发现全互联网上找不出几个关于怎么在 VSCode 里面配置和使用 LINGO 的教程。毕竟,确实,真到了解决大型复杂工程学规划问题的时候有 MATLAB、GurobiSCIP 等一大众高级货色,再怎么也不会真拿 LINGO 去求解。没有办法,只能自己动手丰衣足食了。

本教程将教会你如何一步一步在 VSCode 中配置自己的 LINGO IDE。

安装 VSCode 扩展

首先,VSCode 上面确实有一个 Lingo language support 的扩展,而且根据我的尝试,所有的扩展里面只有这一个扩展是靠谱的。(其他的扩展不要安装。有些是 lingoJS 的扩展,有些半身不遂,会把文件高亮覆盖掉。)我们首先把这个扩展安装上。

安装好扩展之后,可以看到模型文件已经拥有了还算不错的高亮可以看。但是仍然不能一键运行求解模型。

对于代码的自动运行,我们需要安装 Code Runner 插件 并进行自动化配置。自动化配置的具体流程我们会在下面的文章里面跟大家介绍。

LINGO 脚本文件与 runlingo 命令

查阅 LINGO 的帮助文档可以发现 LINGO 的帮助文档里面提及了一个名为 RunLingo 的程序。找到这样一段描述,我翻译了一下:

LINGO的Windows版本包括一个名为RunLingo的实用程序。RunLingo可以用于处理LINGO脚本文件,但是,RunLingo不包括LINGO交互式版本中的前端图形界面。RunLingo是从命令行调用的,您可以在命令行中输入脚本文件名。RunLingo将其输出写入标准输出设备。RunLingo在生产环境中非常有用——如果您希望LINGO作为更大规划系统的一部分在后台安静地运行。

尝试在命令行终端中输入 runlingo 命令:

 $ runlingo

Enter "runlingo script_file_path" to execute the
LINGO command script in file script_file_path.

可以看见 runlingo 命令已经在 LINGO 安装时被添加到了环境变量,这个时候已经可以直接调用了,使用方法为:

runlingo <脚本文件名>.ltf

如果在程序安装的时候,出于某些原因 runlingo 没有被正常添加到环境变量导致命令无法执行,可能需要手动添加。手动添加环境变量的方法请自行在网上搜索。

LINGO 命令行交互和脚本文件

RunLingo 不能直接执行常见的 LINGO 模型文件(.lg4 或者 .lng 之类的)。相反,它直接运行的是 LINGO 的脚本文件 .ltf 格式。关于 .ltf 文件 LINGO 官方文档里面 [有相应的解释可以在这个链接里查看](LINGO 15 Online Users Manual。简单的来讲:.ltf 文件里面编写的是 LINGO 的交互命令。由于 LINGO 命令行交互对大多数人来讲都很陌生、很少使用,因此我们这里解释一下:

在 LINGO 主界面标签栏下依次点击 WindowCommand Window 可以打开命令行图窗,输入 COM 查看可用的命令:

: COM

 LINGO commands by category.  For information on a specific command, type:
'HELP command-name'. 1) Information
COM CAT HELP MEM 2) Input
MODEL TAKE RMPS FRMPS RMPI RLPF 3) Display
LOOK GEN PAUS HIDE STATS PICTURE DUAL XDETEQ SCENE
SHOWNL LISTFIX 4) File Output
DIV RVRT SAVE SMPS SMPI 5) Solution
GO SOLU NONZ RANGE DEBUG 6) Problem Editing
DEL EXT ALT 7) Quit
QUIT 8) System Parameters
PAGE TERS VERB WIDTH SET FREEZE DBUID DBPWD APISET 9) Miscellaneous
TIME

有一说一这个命令行交互相当的不好用,我的建议是没啥大事别瞎折腾……

输入 HELP <命令名称> 可以查看命令帮助提示。比如:

:HELP TAKE

  TAKE command:

  Allows  a  series  of commands to be taken from a file.  The
file contents should appear exactly as terminal input.
A file created with the "SAVE" command can be read with the
TAKE command.

与此同时,在 LINGO 安装的目录下的 Samples 文件夹里面有一个 LTF 脚本的示例文件 TEST.ltf,文件里面展示了 LTF 脚本的一些基本使用方法和常用的书写方法。如果用任意的文本编辑器打开,就可以看到里面的内容为:

! Input a small model
MODEL:
MAX = 20 * X + 30 * Y;
X <= 50;
Y <= 60;
X + 2 * Y <= 120;
END
! Terse output mode
SET TERSEO 1
! Solve the model
GO
! Open a file
DIVERT SOLU.TXT
! Send solution to the file
SOLUTION
! Close solution file
RVRT
! Quit LINGO
QUIT

同时,结尾处有一个文本编辑器没有办法识别的特殊字符。我在这里没有贴出来。关于这个特殊字符的问题,我们会在后面纠结。

简单的来讲,从 LINGO 的官方文档来看,官方文档鼓励用户将脚本和模型写在同一个文件里面。我个人认为,对于简单的模型来说,确实可以这样做,但是对于复杂模型来说,这样做会增加代码编写的负担。 我的建议是将用于运行模型的脚本,书写在一个独立的 .ltf 文件里,同时,将模型书写在另外一个 .lng 文件里。前者定义在命令行中运行模型的各项规则,而后者则是模型的直接定义,方便项目的迁移和管理。以下是一个 DEMO:

以下是 lingo.ltf 的内容:

! LINGO 用于执行模型的脚本;

! 读取模型到 runlingo;
take LP.lng ! 运行模型;
GO ! 输出模型结果到文件 `sulution.txt`
! 要求目录下存在 `sulution.txt`
! 即使注释掉内容模型还是会在终端输出结果
!;
DIVERT solution.txt
SOLUTION
RVRT ! 退出 LINGO;
QUIT

以下是 LP.lng 的内容:

! 规划模型的定义文件
!
! 工程项目投资问题
! ================
!
! 某公司有一批资金欲投资到5个工程项目中,
! 各工程项目的净收益(投入资金的百分比)见下表所示
! 工程项目 | A | B | C | D | E
! -------- | --- | --- | --- | --- | ---
! 收益 / % | 10 | 12 | 15 | 12 | 8
!
! 由于一些原因,公司决定用于项目A的投资不大于其他各项投资之和,
! 而用于项目B和项目D的投资要大于项目C和项目E的投资。
!
! 试确定投资分配方案,使该公司收益最大。
!; MODEL: SETS:
Pro / 1..5 / : x;
ENDSETS DATA:
ENDDATA max = 0.10 * x(1) + 0.12 * x(2) + 0.15 * x(3) + 0.12 * x(4) + 0.08 * x(5); x(1) - x(2) - x(3) - x(4) - x(5) <= 0;
x(2) - x(3) + x(4) - x(5) >= 0; @sum(
Pro(i):x(i)
)=1; @for(
Pro(i):x(i)>=0
);
END

这些内容都可以直接在 Visual Stdio Code 中编写。

配置 Visual Stdio Code 的设置

至此我们可以开始配置 VSCode。

配置 LTF 文件的代码高亮

LINGO 的扩展默认不支持 LTF 文件的高亮。我们可以在 VSCode 的设置框中搜索 files.Associations,可以找到下面的设置。我们在 Files: Associations 中将 *.lng*.ltf 格式的文件关联到 lingo 语言(由于已经安装了 LINGO 语言的扩展,因此 lingo 的 Value 已经可以被识别。)

接下来我们在搜索框里输入 code-runner,在设置里找到 Executor Map,点击 Edit in setting.json

像图中这样,在接下来立即打开的 .json 文件中找到如下的项:

"code-runner.executorMap":{
...
}

2024 年 5 月 6 日更新: 出于不明原因上面的 JSON 项 code-runner.executorMap 不起效了。现在应该换成 code-runner.executorMapByFileExtension,道理是一样的,就是追加到下面去。

    "code-runner.executorMapByFileExtension": {
/* 由扩展插件定义的各项编程语言源文件的运行命令 */
".vb": "cd $dir && vbc /nologo $fileName && $dir$fileNameWithoutExt",
".vbs": "cscript //Nologo",
".scala": "scala",
".jl": "julia",
".cr": "crystal", ... }

"code-runner.executorMap" 保存了由用户自行定义的、后缀名为 .* 的文件在按下一件运行之后执行的终端命令。对于 .ltf 文件,我们可以定义如下的规则:

    "code-runner.executorMap":{
/* 由用户定义的各项编程语言源文件的运行命令 */
".ltf" : "runlingo $fileName"
},

至此为止,配置已经基本完成。其余的各项,可以根据个人需求的不同自行配制。

关于文件兼容的一些小问题

  1. LINGO 默认的 .lg4 文件实际上是二进制文件格式,无法直接用文本编辑器打开。需要另存为 .lng 的纯文本格式。

  2. .lng 格式如果出现乱码,尤其是中文注释乱码,请在 VSCode 右下角找到编码格式按钮,重新通过 GB2312 编码格式打开。

  3. 对于 .lng 文件,由于我们现在用 RunLingo 命令从 LTF 调用,因此应当在文本开头用和末尾用 MODEL: ... END 关键字包裹全文,SETSDATA 的定义也要包含在内。防止出现不必要的各种问题。

  4. 不知道为什么,LINGO 会默认在 .lng 格式的纯文本文件末尾添加一个文本编辑器无法识别的字符。如下图所示。目前看来直接删掉这个字符对求解没有影响。

如何在 VSCode 中配置和编写 LINGO的更多相关文章

  1. 【vscode】如何在vscode 中配置:TypeScript开发node环境

    入门流程,大神绕行. 安装环境 这就不多说了,安装开发的环境. 安装vscode 下载地址:https://code.visualstudio.com/ 安装Nodejs 下载地址:https://n ...

  2. VScode中配置C++运行环境

    目录 VScode中配置C++运行环境 1. 哪些插件 2. 配置开始 3. 编写代码并运行 VScode中配置C++运行环境 关于安装mingw的教程,网络上已经有很多了,这里不再赘述,下面就看VS ...

  3. 如何在 VSCODE 中高效使用 R 语言

    VSCODE 配置 R 一.功能特性展示 之前一直在用 Rstudio 来编写 R,也尝试用过 Pycharm 配置 R 环境. 但是由于现在需求要同时满足 Python,R 和网站要同时开发,为了避 ...

  4. 如何在sharepoint2010中配置Google Anlytics 分析服务

      简介 Google Analytics(分析)不仅可以帮助您衡量销售与转化情况,而且能为您提供新鲜的深入信息,帮助您了解访问者如何使用您的网站,他们如何到达您的网站,以及您可以如何吸引他们不断回访 ...

  5. 如何在Eclipse中配置Tomcat(免安装版)

    如何在Eclipse中配置Tomcat(免安装版) 2013-10-09 23:19wgelgrsh | 分类:JAVA相关 | 浏览642次 分享到:   2013-10-10 17:10提问者采纳 ...

  6. 如何在appconfig中配置服务的ip

    开发了一个WindowsService消息服务器,刚开始一直都是在代码中把IP地址写死,所以每次只要是更换了新的IP地址后,都需要重新编译项目.所以考虑把ip配置到config文件中, 这样做的好处是 ...

  7. vscode中配置php的xdebug

    vscode中配置php的xdebug vscode配置php的xdebug,步骤如下: 1. 安装phpdebug插件: PHP Debug 2.网上下载php的xdebug扩展(注意根据自己的ph ...

  8. 在VSCode中配置Eslint格式化

    在VSCode中配置Eslint 格式化时使代码保持Eslint语法规范 安装Eslint以及prettier美化插件 在VSCode配置设置项中添加如下代码 { "workbench.co ...

  9. 如何在IAR中配置CRC参数(转)

    源:如何在IAR中配置CRC参数 前言 STM32全系列产品都具有CRC外设,对CRC的计算提供硬件支持,为应用程序节省了代码空间.CRC校验值可以用于数据传输中的数据正确性的验证,也可用于数据存储时 ...

  10. vscode中配置git

    vscode中配置git vscode 报错 未找到Git.请安装Git,或在"git.path" 设置中配置 第一步安装git git安装方法自行解决,提供git下载连接! gi ...

随机推荐

  1. 2019-8-31-PowerShell-使用-WMI-获取信息

    title author date CreateTime categories PowerShell 使用 WMI 获取信息 lindexi 2019-08-31 16:55:58 +0800 201 ...

  2. Solution Set - CDQ分治&整体二分

    A[洛谷P2163].给定平面上若干个点,多次询问给定矩形内的点数. B[洛谷P3810].给定若干个三元组,对所有\(k\),求这样三元组的个数:恰有\(k\)个三元组,满足其每个分量都不超过它的相 ...

  3. 【爬虫+情感判定+饼图+Top10高频词+词云图】"王心凌"热门弹幕python舆情分析

    目录 一.背景介绍 二.代码讲解-爬虫部分 2.1 分析弹幕接口 2.2 讲解爬虫代码 三.代码讲解-情感分析部分 3.1 整体思路 3.2 情感分析打标 3.3 统计top10高频词 3.4 绘制词 ...

  4. 【Oracle】Oracle数据库多实例安装

    需求:因为需要从RAC的多实例迁移至单虚拟机的多实例.因此,简要概述一下,如何安装数据库的多实例. 不管是Oracle 11g还是10g的多实例,其基本思路都是一致的. 1.调用dbca 在root账 ...

  5. GDB 中内存打印命令

    GDB 中使用 "x" 命令来打印内存的值,格式为 "x/nfu addr".含义为以 f 格式打印从 addr 开始的 n 个长度单元为 u 的内存值.参数具 ...

  6. SQL中常用的字符串REPLACE函数和LEN函数详解!

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...

  7. neo4j的安装部署

    Linux下载neo4j 直接在服务器上使用命令下载: curl -O http://dist.neo4j.org/neo4j-community-3.4.5-unix.tar.gz 安装Neo4j ...

  8. 一种利用光电容积描记(PPG)信号和深度学习模型对高血压分类的新方法

    具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI 据世界心脏联合会统计,截至 2022 年,全球有 13 亿人被诊断患有高血压,每年约有 1000 万人死 ...

  9. (图形界面)Dbever连接MySQL8 报错mysql8 安装The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone.

    问题原因是没有设置时区,这个在Mysql8中会有 解决方式: 在这个位置加上UTC时区就可以了. IDEA添加方式 设置Advanced的allowPublicKeyRetrieval为true 同时 ...

  10. Android 11(R) MultiMedia(十五)MediaCodec同步模式实现一个简易播放器

    这一节是实践,学习android原生SimplePlayer并自己码一遍,果然学到很多. MyPlayer.h #include <media/stagefright/foundation/AH ...