前言
最近这段时间,出于一些个人的原因,我无法使用自己的电脑。而我手里现在正在使用的这台电脑只是办公机,不允许安装我的个人软件。然而我又想把一些闲暇的碎片时间整合利用起来,自学运筹学,写写博客之类的。于是我就在思考:如何在没有编辑器、没有 IDE、没有求解器的电脑上搞运筹优化建模呢?
按照我的理解,一个基于现有的商业求解器的运筹优化流程包含以下的几个步骤[1]:
- 根据实际问题,建立一个运筹优化模型,构思并写出模型的数学表述形式;
- 使用规划建模语言,描述你建立好的运筹优化模型,将代码保存到模型文件。
- 使用求解器读取文件,运行模型求解并查看结果。
对于前两个步骤其实都很好实现,对于步骤 1 只要有一张纸一支笔就可以开始推导数学公式了。对于步骤 2,现在有很多的云代码环境,都能允许你在线编写代码,例如我所使用的就是这个 Visual Studio Code for the Web,可以登陆微软账号迁移配置,还可以安装插件。
现在最关键的问题就在于,我需要一个 无需安装、开箱即用、可在线使用的数学规划求解器,而且最好还是免费的。你别说,还真有这种东西,叫做 NEOS Server。网站集成了多种商业或开源的求解器,支持不同类型的文件格式,是真正意义上的零配置的云端方案,十分地良心。
关于 NEOS Server
根据官网上的介绍:“NEOS 服务器是一项基于互联网的免费服务,用于解决数值优化问题。该服务器由威斯康星大学麦迪逊分校的威斯康星发现研究所托管,提供访问十几个优化类别中的 60 多种最先进求解器。由威斯康星大学麦迪逊分校托管的求解器运行在由 HTCondor 软件支持的分布式高性能计算机群上;远程求解器则运行在亚利桑那州立大学、奥地利克拉根福大学以及葡萄牙米尼奥大学的设备上。”
简单地来讲,用户可以通过网页填写表单上传、调用服务器 API 或者发送电子邮件的方式,将自己构建的运筹优化模型上传至 NEOS 的服务器。由服务器求解模型后,返送回求解结果。关于如何使用电子邮件发送模型或者如何调用 API 的问题,还请用户自行摸索。本文主要讲解如何在网页上操作提交模型的表单。
[!note] 经笔者实测发现,NEOS Server 的网站在国内是可以直接流畅访问的。 NEOS Server 的使用步骤
注册账号
使用的第一步当然是注册账号,我觉得这没什么好说的。我们访问 NEOS Server 的网站 (https://neos-server.org/neos/),点击页面右上角的 Sign Up 按钮,然后根据提示填写就好了。填写完表单之后点击 Submit 发送注册申请,然后在你的注册邮箱中验证账号即可。
注册完账号之后,点击网页右上角的 Sign In,即可登陆你的用户账号。
选择求解器
NEOS Server 这个项目当然是非常的好,但是不知道为什么它的网页交互特别反直觉,入口有亿点点隐蔽。我也是找了半个多小时才找到选择求解器的按钮在什么地方。如果读者们实在是找不到入口,可以直接点击本文提供的这个链接:NEOS Server - Solvers。但是我们还是简单讲一讲如何在官网上找到入口。
首先,用户在登录完之后,官网首页并不会跳转,还是用户们现在看到的这个样子,如下图所示,我们点击下图中被红色笔记圈出来的“NEOS Optimization Guide”这个位置。
接下来弹出的界面是一个指南,告诉你运筹优化的步骤。这些都可以不用管。我们直接下拉菜单到最底下,可以看到如下图所示的一段内容。我们点击这里被标蓝的链接文本“problem type and solver name”。
接下来弹出的这个菜单就是在列举各种优化问题形式以及其形式相应的可用的求解器,求解器名称后面紧跟着的这些是支持的文件格式。我这里使用的是 SCIP 求解器 + SCIP Optimization Suite 原生的 Zimpl 规划建模语言,问题形式是线性混合整数规划 (Mixed Integer Linear Programming)。读者们根据自己的实际需求选择就好。
[!note] 我注意到这些文件格式大部分都是 AMPL、CPLEX 这类的。本文的读者当中应该有许多人在自己的电脑上本地使用求解器的时候都是直接调用求解器相关的编程语言 API (例如 gurobipy 这样的 Python Libs) 的,我们不能直接上传源码文件,而是需要将我们在代码中写好的文件另存为网站上所示的这些文件类型。尽管这类 API 我用得不多,但是如果不出意外的话,都是可以直接导出为这些常见格式的。(至少我肯定 Pyomo 有这样的功能。)
上传模型文件
接下来弹出的界面是表单填写界面,界面最顶上有关于你选择的求解器的说明和各种实用细则,读者们自行阅读即可。
我这里求解的模型是 《Zimpl Users' Guide》第 6.4 章中的一个八皇后问题的示例,这个文件我已经提前写好,放在一个 model.zpl 文件里面了。我们直接在这个表单填写界面选择文件上传。
我的模型内容比较简单,如下所示。- param columns := 8; set C := { 1 .. columns }; set CxC := C * C; set TABU[ in CxC] := { in CxC with (m != i or n != j) and (m == i or n == j or abs(m - i) == abs(n - j)) }; var x[CxC] binary; maximize queens: sum in CxC : x[i,j]; subto c1: forall in CxC do vif x[i,j] == 1 then sum in TABU[i,j] : x[m,n] <= 0 end;
复制代码 除此之外,网站还支持上传求解器的求解选项配置文件,如上图所示的 SCIP 求解器的表单提交界面,就可以上传 Paramater file,定义一些诸如最大迭代次数和可接受的最小相对间隙之类的求解条件。配置文件的写法我们可以在求解器的手册里面找到,比如我这里使用的是 SCIP 求解器,官网手册里面的 List of all SCIP parameters 就有对此的详细说明。我这里就不再赘述了。
查看求解结果
动态日志
我们提交表单之后,网页上就会立即弹出求解器的求解日志。里面的内容和本地求解时的求解器日志是一样的。比如我刚才上传的那个模型返回的求解器日志就是下面这样的内容,这里直接就能看到每个皇后的位置。
电子邮箱结果留存
NEOS Server 会将包含最求解结果的求解器日志直接发送到你的电子邮箱。你只需要保存电子邮件就能直接留存结果了。
查看历史求解记录
你的每一次求解,在 NEOS Server 平台上被称为一个“Job”。点击界面右上角的个人用户名,在弹出的下拉菜单中下选择“My Jobs”,即可查看历史求解记录列表。在这里点击小文件夹图标,就可以查看我们以前求结果的模型日志了。
总结
初试 NEOS Server 平台,给我的第一印象很不错。除了确实找不到界面按钮之外,其他的方方面面都还是很不错的。但是我在网上大致搜索了一圈发现国内互联网上这个平台的知名度不高,有很多博客文章都提到过,但是教程却很少 (这也是我为什么找不到运行求解的入口按钮的原因之一)。出于这样的原因,我写了这篇随笔的内容。这样或许能有更多人看到并且用起来,如果能帮助到一些人就更好了。
文章是临时写的,比较草率。后续我看还有什么重要的问题,再回来这里补充。
- 关于为什么会有这些流程步骤的问题,可以参阅我的上一期博客:一篇文章给你讲清楚运筹优化到底怎么学!基于 SCIP Optimization Suite 的运筹优化入坑教程。 ↩︎
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |