☰
GAMS二次开发教程(02):环境搭建与 GAMS Studio——安装、许可、IDE 与第一个可运行工程
2026/10/9 12:58:11 网站建设 项目流程

GAMS二次开发教程(02):环境搭建与 GAMS Studio——安装、许可、IDE 与第一个可运行工程

版本与许可声明

  • 工具/软件:GAMS(版本号以官方发行说明为准,检索期 53 与 54 分发的文档页面并存);GAMS Studio 为官方 IDE(跨平台,随 GAMS 一起安装并被设为默认编辑器)。
  • 语言/环境:GAMS 语言 + GAMS Studio;命令行示例在 Windows PowerShell 下给出,Unix/macOS 只需替换路径分隔符与可执行名。
  • 本文目标:把一台裸机变成"能编译、能求解、能读.lst"的 GAMS 工作机,并交付一个含数据层与唯一入口的可运行工程。
  • 许可边界:安装与编译不需要求解许可,求解 GAMS 模型需要许可;许可安装有三条路径(访问码激活、离线激活、Studio 许可对话框),demo license 的规模上限以官方许可说明为准。

一句话结论:GAMS 环境搭建的三个真正难点不是"装不上",而是许可文件要落在 GAMS 会搜索的标准位置里(可用gamsinst -listdirs打印这些目录,许可文件名通常是gamslice.txt)、GAMS Studio 执行的是被标为 main file 的文件而不是你正在编辑的文件(explorer 里带绿色三角)、以及所有调试判断都必须回到.lst的五大区块(编译输出 / 执行输出 / 模型生成输出 / 解报告 / 收尾)。

〇、本篇要解决的认知问题

  • Q1:三平台安装后,GAMS 到底把哪些目录当"自己的家"?为什么升级版本不用搬文件?
  • Q2:许可有哪几种类型、三条安装路径分别怎么走?许可文件应该放在哪?
  • Q3:GAMS Studio 的界面由哪几块组成,“main file"机制为什么会让你"改了代码却没生效”?
  • Q4:命令行gams xxx.gms与 Studio 的运行键是同一件事吗?常用命令行参数有哪些?
  • Q5:.lst文件从第一行到最后一行,区块顺序与各自用途是什么?

一、机制解析

1.1 安装:程序装在一个地方,"你的东西"放在标准位置

GAMS 的设计把两类文件分开管理:

  • GAMS 系统目录(system directory,例如 Windows 上的C:\GAMS\<version>):程序本体、求解器子系统与工具族(gamsinst、gamsgetkey、gamsprobe、GDX 工具等)。升级版本就是装一个新目录,旧版本原地保留。
  • 标准位置(standard locations):与安装目录无关的用户级/系统级目录,GAMS 在这里找那些"不该随版本搬家"的文件——最重要的是许可文件(通常是gamslice.txt)。

标准位置分两组,官方文档的定义很清楚:

组别放什么典型文件
配置目录(configuration directories)GAMS 的配置gamsconfig.yaml
数据目录(data directories)数据与许可gamslice.txt

Windows 上数据目录的搜索顺序(官方示例)大致是:用户目录下的Documents\GAMS→ 用户目录下的AppData\Roaming\GAMS→C:\ProgramData\GAMS→ GAMS 系统目录下的data→ GAMS 系统目录下的data\GAMS→ GAMS 系统目录。配置目录则是:GAMS 系统目录 →C:\ProgramData\GAMS→ 用户目录下的AppData\Local\GAMS→ 用户目录下的Documents\GAMS。macOS 与 Unix 各有自己的顺序(macOS 走$HOME/Library/...,Unix 受XDG_CONFIG_HOME/XDG_CONFIG_DIRS/XDG_DATA_HOME/XDG_DATA_DIRS影响)。

不要背这张表——GAMS 提供了专门命令直接打印它:

gamsinst -listdirs

铁律 9(工程化目录纪律):把"程序目录"和"项目目录"分开是工程化的第一步。永远不要把模型、数据或自建脚本写进 GAMS 系统目录:升级会覆盖、重装会丢失,而且你的文件与官方文件混在一起,无法用版本控制区分。项目文件放你自己的仓库,程序放系统目录,两者之间只通过标准位置与命令行参数通信。

<sysdir> GAMS 系统目录(示例:Windows 的 C:\GAMS\<version>) ├── gams / gams.exe 主程序(编译 + 执行 + 调度求解器) ├── gamsinst 工具:-listdirs 打印全部标准位置 ├── gamsgetkey 许可:用访问码激活许可 ├── gamsprobe 许可:无网络时采集设备数据 ├── <solver> 求解器子系统(CPLEX/GUROBI/HiGHS/CONOPT/...) └── gdxdump / gdxxrw / ... GDX 与 Excel 工具族 myproject/ 你的项目目录 ├── myproject.gsp GAMS Studio 项目文件(记录文件清单与运行选项) ├── ch02_proj_main.gms 唯一入口(Studio 里带绿色三角的 main file) ├── ch02_proj_data.gms 被 $include 的数据层 ├── ch02_proj_main.lst 运行产生的 listing(调试的唯一真相源) └── *.gdx 运行产生的数据交换文件

1.2 许可:三种类型、三条路径、一个落点

先分清许可的类型与安装路径——这是两件事。

类型(官方文档口径):**本地许可(local license)**面向单机、可离线运行,可能带核数上限、内存上限、并发 GAMS 作业数上限、可实例化节点 ID 数上限、用户 ID 匹配等属性;网络许可(network license)由许可服务器集中管理,按活跃节点数、总核数与内存、活跃用户数、每节点核数/内存上限计,且作业全程需要与服务器保持连接(会话定期续期,超时会被服务器回收),也可以手工"签出"(checkout)一段时间以便离线使用。

三条安装路径:

  1. 访问码激活(推荐):许可以 36 位访问码交付,用gamsgetkey激活并直接写出许可文件:<sysdir>/gamsgetkey <access-code> -o gamslice.txt;省略-o时内容打到标准输出,需手工复制。
  2. 离线激活:目标机不联网时,先用gamsprobe -o device_data.json采集设备数据,把该文件与访问码带到联网机器执行gamsgetkey ... -i device_data.json -o gamslice.txt,再把结果拷回目标机。两个工具必须来自同一 GAMS 发行版。
  3. GAMS Studio 许可对话框:官方把 Studio 许可对话框列为最简单的安装方式;Windows 安装器也会自动装许可。网络许可的签出(checkout)同样在此完成。

一个落点:无论走哪条路径,最终都必须有一个gamslice.txt落在GAMS 会搜索的标准位置里。多用户共享一台机器时,把许可放到系统目录下(<sysdir>/gamslice.txt)并保证所有用户可读,是一个典型做法。另有一条优先级规则要记住:若gamsconfig.yaml里配置了许可相关选项,该设置优先于默认搜索位置。

铁律 2(许可先讲清):写下任何"能跑多大、能不能并行"的结论前,先回答两个问题——这台机器是本地许可还是网络许可?许可里有没有核数/内存/并发作业数限制?官方文档明确指出:使用求解器进程的异步求解(装订到solveLink=3,4)在并发作业数受限时会触发许可错误,而使用求解器库的异步求解(solveLink=6,7)可以正常工作。这条差异不搞清楚,你的并行方案会在生产环境里无声失败。

1.3 GAMS Studio:界面分区与"main file"机制

GAMS Studio 是官方 IDE(C++/Qt,跨平台,Windows/macOS/Linux),随 GAMS 安装并被设为默认编辑器。官方文档描述的界面要素包括:Explorer(项目树)(用绿色三角标出 main file)、编辑器(语法着色、括号匹配、代码折叠、书签、代码补全、查找替换)、Process Log(进程窗口)、.lst视图(与编辑器分屏)、LXI 窗口(.lst的结构化导航)、Reference File Viewer(按全部符号 / 集合 / 参数 / 文件用途 / 未使用项分页列出符号)、GDX Viewer、Solver Option Editor与Debugger。

Process Log 的行颜色是一套导航约定(官方教程给出的对照):蓝行双击跳到.lst对应位置;红行是错误,单击跳到源码出错位置、Control 单击跳到.lst出错位置;绿行表示本次运行产生的文件(如 GDX、PUT、REF),双击直接打开。

然后是那条最容易踩的坑:GAMS Studio 不执行你正在编辑的文件,而是执行被标为 main file 的那个文件。如果绿色三角不在你期望的文件上,就右键该文件选择Set as main file,三角才会移动。这解释了一个经典现象——“我明明改了代码,为什么结果没变?”

1.4 命令行与 Studio:同一件事的两个入口

Studio 的运行键(或 F9)与命令行gams走的是同一套内核,结果应完全一致;官方教程给出的最朴素调用就是在命令行输入gams加输入文件名。常用附加写法:

gams ch02_min.gms o=ch02_min.lst // 显式指定 listing 文件名 gams ch02_min.gms ErrMsg=0 // 把错误消息集中列在 echo print 末尾 gams ch02_min.gms limrow=0 limcol=0 // 关闭方程清单与列清单(安静模式)

o=(Output)控制 listing 文件名,默认与输入文件同名(只换扩展名),显式指定是工程习惯:一次运行一个.lst,不会互相覆盖。ErrMsg控制错误消息位置:默认 1 表示错误下方直接显示、0表示集中列在 echo print 末尾、2表示在.lst中抑制。这些参数都可写进gamsconfig.yaml(配置目录)作为默认值,也可在 Windows 的gmsprmnt.txt/ Unix 的gmsprmun.txt里改系统级默认。

最佳实践:把常用运行参数固化到gamsconfig.yaml,而不是每次手敲。但"隐式默认值"是可复现性的敌人:交付给别人时,要么在项目里附一份说明,要么在命令行显式写出参数——否则"我这能跑、他那报错"几乎必然发生。

1.5.lst的五大区块地图

.lst(listing file)是 GAMS 全部诊断信息的载体,也是本系列反复强调的"唯一真相源"。官方文档把它的内容组织成五大块:

foo.lst ────────────────────────────────────────────────── ① Compilation(编译输出) · Echo Print of the input file ← 带行号的源码回显,出错行插 **** · Symbol Reference Map ← $onSymXRef 打开 · Symbol Listing Map ← $onSymList 打开 · Unique Element Listing ← $onUELList / $onUELXRef 打开 · Include File Summary ← 默认就会显示 ② Execution(执行输出) · display 语句的结果 · 执行期错误:**** Exec Error at line N: ... ③ Model Generation(模型生成输出) · Equation Listing ← option limrow 控制 · Column Listing ← option limcol 控制 · Range Statistics · Model Statistics ← 模型的块数/行数/列数/非零元 ④ Solution Report(解报告) · Solve Summary ← SOLVER STATUS / MODEL STATUS / OBJECTIVE VALUE · Solver Report ← 求解器自己的迭代日志 · Solution Listing ← 变量与方程的 level / marginal · Report Summary ← INFEASIBLE / UNBOUNDED / ERRORS 计数 ⑤ Post-Solution(收尾) · Final Execution Summary、File Summary

三条阅读纪律:

  1. 默认只显示 echo print 与 include file summary,其余映射类区块都被抑制,需要用美元控制选项主动打开($onSymXRef、$onSymList、$onUELList、$onUELXRef、$onDollar)。第一个.lst“看起来什么都没说”,往往就是因为没打开这些开关。
  2. 编译错误的定位方式是"四星号 + 美元编号":出错行下方(或按ErrMsg设置集中到末尾)出现**** $170,并在 echo print 结束时给出文字解释。
  3. 求解结果必须同时看两个状态:SOLVER STATUS(求解器视角)与MODEL STATUS(模型视角)。只看一个会误判——求解器因迭代上限中断时,SOLVER STATUS报中断而MODEL STATUS可能报"可行解"。

经验法则:.lst里的行号永远指物理行号(输入文件里的行),不是逻辑语句号;一条语句跨 5 行,报错行号就会指向其中某一行。配合 Studio 的 Process Log 红行单击跳源码,定位速度会快一个数量级。

二、完整代码与逐行剖析

代码 2-1:ch02_min.gms—— 最小可运行工程(完整可运行)

$title ch02_min - 第一个可运行工程:声明、赋值、显示 * 适用分发口径:以 gams.com/latest/docs 当前分发为准;版本号以官方发行说明为准 * 求解许可:本段不调用 SOLVE,只需要 GAMS 能启动(无需求解器许可) * 平台:纯 GAMS 语句,三平台通用 * 让 display 输出保留两位小数,便于人工核对(取值语义以官方 option 页为准) option decimals = 2 ; * 声明一个集合作为索引 Set p "products" / p1, p2, p3 / ; * 用列表式录入数据:集合的每个元素对应一个数值 Parameter price(p) "unit price per unit" / p1 10, p2 20, p3 15 / ; * 标量:没有域的参数 Scalar budget "available budget" / 100 / ; * 执行期赋值:由已有数据算出新数据(这一步不在编译期发生) Parameter afford(p) "affordable quantity" ; afford(p) = budget / price(p) ; * 把结果打进 listing 文件 Display price, afford, budget ;

逐行剖析:$title把 listing 文件的头部从默认的General Algebraic Modeling System换成你写的文字——.lst一多,这一行是救命稻草;option decimals = 2 ;只影响display的小数位,不影响内部计算精度;Set p "products" / p1, p2, p3 / ;同时完成"声明"与"赋元素",注意GAMS 语句末尾的分号可以省略——前提是下一行以 GAMS 关键字开头,为可读性与安全本系列一律写分号;afford(p) = budget / price(p) ;是一条执行期赋值语句,放在这里是为了让你亲眼看到"编译期只做声明与检查,真正算数是执行期";Display是零成本的输出方式——不要急着上put或execute_unload,先用display确认数据对不对。

代码 2-2:ch02_lst.gms—— 把.lst的地图开关全部打开(完整可运行)

$title ch02_lst - 打开 listing 的全部映射区块,并演示清单长度的控制 * 适用分发口径:$onSymXRef/$onSymList/$onUELList/$onUELXRef/$onDollar 以官方 Dollar Control Options 文档为准 * 求解许可:末尾有 SOLVE,需要有效 GAMS 许可;LP 模型 * 平台:GAMS 语句通用 $onSymXRef $onSymList $onUELList $onUELXRef $onDollar * 方程清单与列清单的长度控制: * 默认每个方程块只列前几条;设为 0 会完全关闭该类清单; * 要全量查看就把值设成不小于该块的条数。取值语义以官方 option 页为准 option limrow = 0 ; option limcol = 0 ; Set p "products" / p1, p2, p3 / ; Parameter price(p) "unit price per unit" / p1 10, p2 20, p3 15 / ; Variables q(p) "production quantity" profit "total profit" ; Positive Variable q ; Equations obj "total revenue" cap "shared capacity limit" ; obj.. profit =e= sum(p, price(p)*q(p)) ; cap.. sum(p, q(p)) =l= 10 ; Model m / all / ; Solve m using lp maximizing profit ; Display profit.l, q.l ;

逐行剖析:$onSymXRef打开符号交叉参考映射(按字母序列出每个标识符、标明其数据类型简写与在哪些行被声明/定义/赋值/引用/作控制索引),是接手别人模型时最省时间的一页;$onSymList打开符号清单映射(按数据类型分组并带上 text)——你写 text 的质量在这里立刻得到回报;$onUELList打开唯一元素表,先按"进入顺序"再按字典序列出全部标签;$onUELXRef再为每个标签附上引用行号;$onDollar让美元控制选项行本身也被回显(默认不列出,这解释了很多"我明明写了$include却看不出它生效了"的困惑);option limrow = 0 ; option limcol = 0 ;是"安静模式",注意这不是默认值——默认会各列前几条,要全量查看就把值设大,取值语义以官方 option 页为准。

代码 2-3:两层文件工程 ——ch02_proj_data.gms+ch02_proj_main.gms(完整可运行)

第一个文件是数据层,只有数据、没有模型:

* ch02_proj_data.gms —— 数据层:被入口文件用 $include 引入 * 这个文件不独立运行,因此不写 $title,也不写 SOLVE * 数据一律在此集中,便于与模型层解耦(后续用 GDX 替换它即可) Set p "products" / p1, p2, p3 / ; Parameter price(p) "unit price per unit" / p1 10, p2 20, p3 15 / ; Scalar budget "available budget" / 100 / ;

第二个文件是唯一入口:

$title ch02_proj_main - 项目唯一入口:先 include 数据层,再算与显示 * 适用分发口径:$include 以官方 Dollar Control Options 文档为准 * 求解许可:本段不调用 SOLVE,无需求解器许可 * 平台:GAMS 语句通用;$include 的相对路径以入口文件所在目录为基准 * 铁律 9:全项目只保留一个入口。数据、模型、求解、输出分层,靠 $include 组装 $include ch02_proj_data.gms * 下游层可以直接使用被引入文件中声明的一切符号 Parameter afford(p) "affordable quantity" ; afford(p) = budget / price(p) ; Display price, afford, budget ;

逐行剖析:数据层文件里故意不写$title、不写SOLVE——它不是可独立运行的模型而是"被组装件",误点运行时你会立刻发现"这个文件没有求解语句",而不是拿到一份看似正常实则缺模型的输出;$include ch02_proj_data.gms是原地展开,被引入文件里的声明直接进入入口文件的符号表,因此入口必须先 include 数据层,再使用其中的符号;Studio 的书签功能可以跳进 include 的文件;这套"入口 + 数据层"结构会在后续长成"入口 + 数据 + 模型 + 求解 + 输出",现在就按这个结构组织目录,比事后重构便宜得多。

代码 2-4:ch02_run.ps1—— 命令行运行与客观校验(PowerShell)

# ch02_run.ps1 —— 命令行运行 GAMS 并做客观校验# 适用:Windows PowerShell;Unix/macOS 把路径分隔符与可执行名换成对应版本即可$ErrorActionPreference='Stop'# 铁律 8 的姿态:出错即停,不允许"带着错误继续"# 1) 先看清 GAMS 会搜索哪些标准位置(配置目录与数据目录)gamsinst-listdirs# 2) 用显式输出名运行,一次运行一个 .lst,避免互相覆盖gams ch02_min.gms o=ch02_min.lst# 3) 客观判据一:listing 文件是否真的生成if(-not(Test-Path'ch02_min.lst')){throw'listing 文件未生成,运行未成功'}# 4) 客观判据二:从 .lst 里抓运行状态行,而不是靠"看起来没报错"Select-String-Path'ch02_min.lst'-Pattern'Status:'|ForEach-Object{$_.Line}# 5) 客观判据三:看一下影响本次运行的关键默认值来自哪里Get-ChildItem-Path.-Filter'gamsconfig.yaml'-Recurse-ErrorAction SilentlyContinue|ForEach-Object{$_.FullName}

逐行剖析:$ErrorActionPreference = 'Stop'让脚本在第一个命令失败时立即停止——验证脚本最忌讳"前面失败了后面还在跑",最后给出一个误导性的成功结论;gamsinst -listdirs是排查许可问题的第一步,直接打印 GAMS 实际搜索的目录;o=ch02_min.lst显式命名输出(默认是"输入文件同名的.lst",多脚本并行时极易互相覆盖);Test-Path是"文件是否生成"的硬判据,Select-String 'Status:'是"运行是否正常结束"的硬判据(正常完成为Status: Normal completion),以它作为自动化门禁比看人工输出可靠得多;最后一步找gamsconfig.yaml,目的是让"隐式默认值"变得可见。

三、常见报错与排查

报错 3-1:没有找到许可文件。现象:启动或Solve时报"许可文件不存在"类错误。根因:标准位置里没有任何gamslice.txt。解法:先跑gamsinst -listdirs打印搜索目录,再任选一条安装路径(gamsgetkey激活、离线gamsprobe加gamsgetkey、或 Studio 许可对话框),最后确认文件落在某个数据目录中且当前用户有读权限。

报错 3-2:License File Invalid or Corrupted。现象:找到许可文件但被判无效。根因:文件被编辑器改坏(多空行、换行符被转换)、手工复制时截断、或激活未完成。解法:重新用gamsgetkey生成,不要用文本编辑器手改许可文件;离线激活时确认gamsgetkey与gamsprobe来自同一发行版。

报错 3-3:License File too old for this Version of GAMS/ 许可已过期。现象:升级到新分发后旧许可被拒,或运行中途报许可过期。根因:分发编号与 License Check Date 不匹配。解法:用官方发行说明确认许可覆盖的校验期;注意网络许可若在作业运行期间过期,作业会以许可错误失败。

报错 3-4:**** $140 Unknown symbol而代码"看起来完全正确"。现象:入口文件里引用的符号报未声明。根因:$include的数据层没被真正引入(文件名拼错、路径不对,或$include写在使用语句之后)。解法:用$onDollar让美元控制选项行出现在 echo print 里,确认$include存在且位置在使用之前。而"改了代码结果没变"另有根因——Studio 执行的是被标为main file的文件:右键目标文件选Set as main file确认绿色三角位置,并用o=指定输出名后核对.lst头部的$title。

报错 3-5:并发作业触发许可错误。现象:单跑正常,一上并行就报错。根因:许可里的并发 GAMS 作业数属性——官方说明用求解器进程的异步求解(solveLink=3,4)在并发受限时会失败,而用求解器库的异步求解(solveLink=6,7)可以正常工作。解法:先确认并发限制再决定求解模式。

四、动手练习

  • 练习 1(标准位置体检):运行gamsinst -listdirs,抄下配置目录与数据目录,并找出实际生效的gamslice.txt。判定:能指出该许可位于用户级还是系统级目录,并说明原因。
  • 练习 2(最小运行):运行代码 2-1。判定:工作目录出现ch02_min.lst;Select-String 'Status:'有正常完成状态行;Display段落中afford的 p1 项等于 10(预算 100 ÷ 单价 10)。
  • 练习 3(listing 地图):运行代码 2-2,在.lst中依次定位 echo print、符号交叉参考映射、符号清单映射、唯一元素表、SOLVE SUMMARY、Report Summary。判定:能说出每一处属于官方定义的哪个大区块,并指出SOLVER STATUS与MODEL STATUS的位置。
  • 练习 4(清单长度控制):把代码 2-2 的limrow/limcol分别设为 0 与一个较大值各跑一次,比较 Equation Listing 与 Column Listing 的长度变化。判定:能说清"默认显示几条、设为 0 意味着什么、设大意味着什么",并承认取值语义以官方 option 页为准。
  • 练习 5(两层工程):把代码 2-3 的两个文件放同一目录,只用入口运行。判定:(a) 入口能读到数据层的price与budget;(b) 故意把$include的文件名写错一位能复现$140类错误并说出根因;© 恢复后正常,且.lst数量与运行次数一致。

五、小结与下一篇预告

本篇交付的是一台"可工作的机器"与三条可复用的判据:安装看标准位置(gamsinst -listdirs,程序在系统目录、许可与配置在标准位置)、运行看 main file 与输出名(Studio 的绿色三角、命令行的o=)、判断看.lst五大区块(编译输出 / 执行输出 / 模型生成输出 / 解报告 / 收尾)。同时把两条纪律钉死:工程化目录纪律(铁律 9:入口与数据分层,程序目录与项目目录分离)、许可先讲清(铁律 2:先问许可类型与资源上限,再谈并行与规模)。

第 03 篇《第一个优化模型》把环境变成理解力:从 GAMS 官方教程的运输模型trnsport出发,逐行拆解SETS/PARAMETERS/TABLES/VARIABLES/EQUATIONS/MODEL/SOLVE的写法,讲清关系符=e=/=l=/=g=、方程定义符..、sum((i,j), ...)的双层括号,以及display x.l, x.m的输出该怎么读。

本篇认知问题回显(FAQ)

Q1:三平台安装后,GAMS 把哪些目录当"自己的家"?为什么升级不用搬文件?
A:分两类。GAMS 系统目录(如 Windows 的C:\GAMS\<version>)放程序本体、求解器子系统与工具族(gamsinst、gamsgetkey、gamsprobe、GDX 工具);标准位置与安装目录无关,分配置目录(放gamsconfig.yaml)与数据目录(放gamslice.txt,也包括 LibInclude 文件、外部方程库、extrinsic function 库)。官方按平台给出搜索顺序:Windows 数据目录从用户Documents\GAMS、AppData\Roaming\GAMS、C:\ProgramData\GAMS到系统目录下的data等;Unix 受XDG_DATA_HOME/XDG_DATA_DIRS影响;macOS 走 Library 下路径。因为许可与配置放在标准位置,升级只需安装新版本目录。用gamsinst -listdirs可直接打印全部搜索目录。

Q2:许可有哪些类型、三条安装路径怎么走、文件放哪?
A:类型上分本地许可(单机、可离线,可能带核数、内存、并发作业数、节点 ID 数、用户 ID 等限制)与网络许可(由许可服务器集中管理,按活跃节点数、总核数与内存、活跃用户数计,作业全程需保持连接,可通过签出在一段时间内离线使用,存在并发限制时不能签出)。三条安装路径:一是用 36 位访问码执行gamsgetkey <code> -o gamslice.txt(省略-o则内容打到标准输出需手工复制);二是无网络时先用gamsprobe -o device_data.json采集设备数据,在联网机上执行gamsgetkey ... -i device_data.json -o gamslice.txt再拷回(两个工具须同一发行版);三是使用 GAMS Studio 的许可对话框或 Windows 安装器。最终必须让gamslice.txt落在 GAMS 搜索的标准位置里,多用户共享时可放到<sysdir>/gamslice.txt并保证可读;若gamsconfig.yaml配置了许可选项,该设置优先于默认搜索位置。

Q3:GAMS Studio 有哪些界面分区,main file 机制为什么会导致"改了没生效"?
A:界面要素包括 Explorer 项目树(绿色三角标出 main file)、带语法着色与括号匹配、代码折叠、书签、代码补全的编辑器、Process Log 进程窗口、.lst视图与 LXI 导航窗口、Reference File Viewer(按全部符号 / 集合 / 参数 / 文件用途 / 未使用项分页)、GDX Viewer、Solver Option Editor 与 Debugger。Process Log 用颜色导航:蓝行双击跳.lst对应位置,红行单击跳源码出错位置、Control 单击跳.lst出错位置,绿行双击打开本次运行生成的文件。Studio 执行的是被标为 main file 的文件而不是当前编辑的标签页,绿色三角不在目标文件上时运行键其实在跑另一个文件;右键选 Set as main file 可移动三角。项目定位还决定文件默认保存位置与执行时的文件搜索目录。

Q4:命令行 gams 与 Studio 运行键是同一件事吗?常用参数有哪些?
A:是同一套内核的两个入口,结果应完全一致;官方教程给出的最朴素调用是在命令行输入gams加输入文件名。常用写法:o=显式指定 listing 文件名(默认与输入文件同名只换扩展名);ErrMsg控制错误消息位置,默认 1 表示显示在出错行下方,0 表示集中列在 echo print 末尾,2 表示在.lst中抑制;limrow与limcol控制方程清单与列清单的条数,0 表示关闭;reslim、iterlim控制时间与迭代上限;domlim控制允许的函数求值错误数(默认 0)。这些参数也可写入配置目录下的gamsconfig.yaml,或在 Windows 的gmsprmnt.txt/ Unix 的gmsprmun.txt中改系统级默认。

Q5:.lst 从第一行到最后一行,区块顺序与用途是什么?
A:官方分五块。Compilation 编译输出:echo print(带行号,出错行插****与$编号)、符号交叉参考映射($onSymXRef)、符号清单映射($onSymList)、唯一元素表($onUELList/$onUELXRef)与 include file summary,默认只显示 echo print 与 include file summary,$onDollar可让美元控制选项行本身也被回显。Execution 执行输出:display 结果与**** Exec Error at line N: ...形式的执行期错误。Model Generation 模型生成输出:Equation Listing(受limrow控制)、Column Listing(受limcol控制)、Range Statistics、Model Statistics。Solution Report 解报告:Solve Summary(SOLVER STATUS与MODEL STATUS)、Solver Report、Solution Listing、Report Summary(含 INFEASIBLE / UNBOUNDED / ERRORS 计数)。Post-Solution 收尾:Final Execution Summary 与 File Summary。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询