欢迎光临
我们一直在努力

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

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)一段时间以便离线使用。

三条安装路径:

  • 访问码激活(推荐):许可以 36 位访问码交付,用 gamsgetkey 激活并直接写出许可文件:<sysdir>/gamsgetkey <access-code> -o gamslice.txt;省略 -o 时内容打到标准输出,需手工复制。
  • 离线激活:目标机不联网时,先用 gamsprobe -o device_data.json 采集设备数据,把该文件与访问码带到联网机器执行 gamsgetkey … -i device_data.json -o gamslice.txt,再把结果拷回目标机。两个工具必须来自同一 GAMS 发行版。
  • 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

    三条阅读纪律:

  • 默认只显示 echo print 与 include file summary,其余映射类区块都被抑制,需要用美元控制选项主动打开($onSymXRef、$onSymList、$onUELList、$onUELXRef、$onDollar)。第一个 .lst “看起来什么都没说”,往往就是因为没打开这些开关。
  • 编译错误的定位方式是"四星号 + 美元编号":出错行下方(或按 ErrMsg 设置集中到末尾)出现 **** $170,并在 echo print 结束时给出文字解释。
  • 求解结果必须同时看两个状态: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。

    赞(0)
    未经允许不得转载:171主机测评 » GAMS二次开发教程(02):环境搭建与 GAMS Studio——安装、许可、IDE 与第一个可运行工程
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址