GAMS模型编写与求解(入门)

  • 背景
  • 1 编写流程
    • 1.1 集合声明
    • 1.2 参数赋值
      • 1.2.1 标量声明
      • 1.2.2 一维向量声明
      • 1.2.3 二维向量声明
    • 1.3 变量声明
      • 1.3.1 变量关键字
      • 1.3.2 举例
    • 1.4 约束
      • 1.4.1 约束声明
      • 1.4.2 约束编写
    • 1.5 模型建立及求解说明
    • 1.6 模型代码
  • 2 特别注意点
    • 2.1 *和$的使用
      • 2.1.1 *的使用
      • 2.1.2 $的使用
    • 2.2 下标有限制范围的约束表达
      • 2.2.1 举例1
      • 2.2.2 举例2
      • 2.2.3 举例3
  • 3 模型求解
    • 3.1 解决方案
    • 3.2 求解结果
  • 4 总结

背景

完成软件的安装后,需要进行模型的编写。本篇将结合自己的学习心得,介绍一个简单模型的编写。

1 编写流程

参考材料链接link,材料里面包括“软件介绍、基本语法及案例分析”,提供的帮助很大;此处提出一个百度云链接link,提取码:b8wg。
下面将结合材料中提供的“案例二”,进行简明扼要地讲述,具体语法细节可参考上述材料。

1.1 集合声明

结构注意点:Sets是关键字,引领集合的声明;最后一个集合声明过后需要有分号结束,但集合之间不要分号。
语法注意点:i是集合名;goods是对集合的一个解释,可有可无;/ /之间内容是属性,其中BRD和MIL是属性名,中间以“,”隔开,;bread和milk是对属性的一个解释,可有可无。

Sets
i goods  /BRD bread, MLK milk/
h factors  /CAP capital, LAB labor/
;

1.2 参数赋值

1.2.1 标量声明

结构注意点:Scalars是关键字,引领标量的赋值;最后一个标量赋值过后需要有分号结束,但标量之间不要分号。
语法注意点:M1是标量名;maximum value是对标量的一个解释,可有可无;/ /之间内容是标量的数值。
PS:代码仅是举例方便理解,非本模型内容。

Scalars
M1       maximum value   /1E8/
M2       minimum value      /1/
;

1.2.2 一维向量声明

结构注意点:Parameters是关键字,引领一维向量的赋值;最后一个一维向量赋值过后需要有分号结束,但一维向量之间不要分号。
语法注意点:alpha是一维向量名;(i)是一维向量的下标;xxx是对一维向量的一个解释,可有可无;/ /之间内容是向量值,中间以“,”隔开,其中BRD和MIL是属性名,对应着此前声明的 i 集合。

Parameters
alpha(i)    xxx     /BRD 0.2, MLK 0.8/
px(i)   xxx    /BRD 1, MLK 2/
pz(h)  /CAP 2, LAB 1/
z(h)  /CAP 10, LAB 20/
;

1.2.3 二维向量声明

结构注意点:Table是关键字,引领二维向量的赋值;二维向量暂时知道的是仅能一个一个声明;声明完后,需要以分号结尾。
语法注意点:A是二维向量名;xxx是对二维向量的一个解释,可有可无;G1 F1等是向量的下标,需要有相应的集合声明以对应。
PS:代码仅是举例方便理解,非本模型内容。

Table A xxxF1      F2     F3      F4      F5
G1       1        2        3        4        5
G2       6        7        8        9       10
G3      11      12      13      14      15
G4      16      17      18      19      20 ;

1.3 变量声明

注意:目标值只能设置成Free类型。

1.3.1 变量关键字

1.3.2 举例

声明的是变量UU和正变量X(i)。

Variable
UUPositive Variable
X(i)

1.4 约束

1.4.1 约束声明

在编写约束之前,需要声明约束。
Equations是关键字,引领约束的声明;eqt是约束名称,ffggf是对eqt的描述,可有可无。

Equations
eqt   ffggf
obj   fgjg
;

1.4.2 约束编写

约束编写时,格式如下。编写中所需要的函数以及符号如下图所示。注:每个约束编写完成后均需要以分号结尾。

eqt..  sum(i, px(i)*X(i)) =e= sum(h, pz(h)*z(h));
obj..  UU =e= prod(i, X(i)**alpha(i));


1.5 模型建立及求解说明

分别通过如下两句语言实现。分别表示“将所建立的模型命名为HHmax”、“通过使用NLP模型求解器求解HHmax模型以得到UU的最大值”。

*Defining the model
Model HHmax /all/;*Sloving the model
Solve HHmax maximazing UU using NLP;

1.6 模型代码

* Definition of the Index Sets
Sets
i goods  /BRD bread, MLK milk/
h factors  /CAP capital, LAB labor/
;* Definition of Parameters
Parameters
alpha(i)  /BRD 0.2, MLK 0.8/
px(i)  /BRD 1, MLK 2/
pz(h)  /CAP 2, LAB 1/
z(h)  /CAP 10, LAB 20/
;* Definition of variables
Positive Variables
X(i)
;Variable
UU
;Equations
eqt   ffggf
obj   fgjg
;*Specification of equations
eqt..  sum(i, px(i)*X(i)) =e= sum(h, pz(h)*z(h));
obj..  UU =e= prod(i, X(i)**alpha(i));*Defining the model
Model HHmax /all/;*Sloving the model
Solve HHmax maximazing UU using NLP;

2 特别注意点

2.1 *和$的使用

2.1.1 *的使用

(1)以下两段代码等价,大家可以看到使用*的方便之处,具体可参考上面提供的文档。
PS:代码仅是举例方便理解,非本模型内容。

I      GG     /I1,I2,I3,I4,I5/
I      GG     /I1*I5/

(2)星号还有注释作用,可以看到1.6部分中以 ‘*’开头的语句,均为备注语句。

2.1.2 $的使用

$用于条件语句的表达。如下的语句表示“a在b大于1.5条件成立的情况下等于2”,如果条件不满足,则不赋值。
PS:代码仅是举例方便理解,非本模型内容。

a$(b>1.5)=2;

2.2 下标有限制范围的约束表达

2.2.1 举例1

注意:若约束表示多个式子,比如下图,其实这个约束表示K*I个式子,所以在声明时需要附上(K,I)。

* Definition of variables
Equations
Con1(K,I)     for example
;
*Specification of equations
Con1(K,I)..      S(K,I)=e=W(K,I);

2.2.2 举例2

注意:若有加和符号,则用sum语句,格式为sum((下标),变量)。

* Definition of variables
Equations
Con1 for example
;
*Specification of equations
Con1..      S=e=sum((K,I),W(K,I));

2.2.3 举例3

特别注意:对于这种有多个下标,但是只有一个下标有范围的,有三个注意事项。
第一个注意事项:类似于2.2.1,在声明时需要附上(K,I);
第二个注意事项:由于i和i1共用同一个集合I,因此需要加上ALIAS,相当于复制I;
第三个注意事项:sum((下标),变量)加和时,需要在下标后附上对i1的限制。
具体见代码。

Set I;
ALIAS(I,IL);
* Definition of variables
Equations
Con1(K,I) for example
;
*Specification of equations
Con1(K,I)..      S(K,I)=e=sum((K,IL)$(ord(IL) ge ord(I)),W(K,IL));

此处引出两个额外符号,ord()和ge,其中ord(I)的意思“得到此时的I在集合中的排序”,ge的意思是“大于等于”,因此“ord(IL) ge ord(I)”的意思就是“在集合中,排序大于I的IL”。

3 模型求解

3.1 解决方案

模型的求解当然要利用求解器了(需要购买)。首先通过“File——Options——Slovers”,可以看到自己可使用求解器情况,如下图。“Demo”表示可以使用,“Full”则表示能够完全使用。

对于没有许可证的同学,此处提供一个贴吧里的解决方法,链接link,通过下载链接中的文档,获得许可证,并且在修改完自己系统时间后,通过“File——Options——Licenses”选择许可证,即可使用。(PS:本人未尝试,仅贴出来一种可能的解决方案)。

3.2 求解结果

本文算例求解结果如图所示,x(1)=8,x(2)=16,目标值UU=13.929。

4 总结

至此,利用GAMS进行模型的编写及求解已完成。

【整理不易,转载请注明出处和相关链接,否则必究!】

GAMS模型编写与求解(入门)相关推荐

  1. MATLAB编写遗传算法求解vrp问题

    MATLAB编写遗传算法求解vrp问题 vrp问题是有载重限制的物流配送线路优化问题,详细可表述为:有1个配送中心,向m个客户点送货,从配送中心出发,货物不足时回配送中心装货,配送完成后回到配送中心. ...

  2. R语言广义加性模型(GAMs:Generalized Additive Model)建模:数据加载、划分数据、并分别构建线性回归模型和广义线性加性模型GAMs、并比较线性模型和GAMs模型的性能

    R语言广义加性模型(GAMs:Generalized Additive Model)建模:数据加载.划分数据.并分别构建线性回归模型和广义线性加性模型GAMs.并比较线性模型和GAMs模型的性能 目录

  3. python网络爬虫的基本步骤-黑客基础 编写Python爬虫入门步骤

    原标题:黑客基础 编写Python爬虫入门步骤 信息时代,数据就是宝藏.数据的背后隐含着无穷的宝藏,这些宝藏也许就是信息量所带来的商业价值,而大数据本身也将成为桌面上的筹码. 黑客花无涯 带你走进黑客 ...

  4. 0729------Linux网络编程----------使用 select 、poll 和 epoll 模型 编写客户端程序

    1.select 模型 1.1 select 函数原型如下,其中 nfds 表示的描述符的最大值加1(因为这里是左闭右开区间),中间三个参数分别表示要监听的不同类型描述符的集合,timeout用来表示 ...

  5. Algorithm:数学建模大赛之数学建模基础(经验/技巧)、流程(模型准备/模型假设/建模/求解/分析/优化/预测/评价)、论文写作(意义/摘要/关键词/问题重述和模型假设/建模/文献)之详细攻略

    Algorithm:数学建模大赛之数学建模基础(经验/技巧).流程(模型准备/模型假设/建模/求解/分析/优化/预测/评价).论文写作(意义/摘要/关键词/问题重述和模型假设/建模/求解/结论/参考文 ...

  6. 弹性碰撞后速度方向_找准模型,快速求解碰撞类问题

    找准模型,快速求解碰撞类问题 正式开讲之前,扯一会儿废话!很多小伙伴可能根本不会看下去,想想动量守恒,有什么好看的呢?人需要自信,但也不能太自信,有时候,明明大家知识点掌握的都一样,却有人能考高分,而 ...

  7. python爬虫步骤-黑客基础 编写Python爬虫入门步骤

    原标题:黑客基础 编写Python爬虫入门步骤 信息时代,数据就是宝藏.数据的背后隐含着无穷的宝藏,这些宝藏也许就是信息量所带来的商业价值,而大数据本身也将成为桌面上的筹码. 黑客花无涯 带你走进黑客 ...

  8. matlab 双层规划求解,双层规划模型的遗传算法求解的Matlab源码

    双层规划模型的遗传算法求解的Matlab源码 双层规划模型的遗传算法求解的Matlab源码 function [BESTX,BESTY,ALLX,ALLY]=GAU (KU,KD,NU,ND,PmU, ...

  9. swift android界面,使用 Swift 语言编写 Android 应用入门

    原标题:使用 Swift 语言编写 Android 应用入门 Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码.本文解释了如何在你的安卓手机上运行一个简单 ...

最新文章

  1. vmware克隆centos修改linux mac地址
  2. 毕业设计-基于SSM实现在线考试及题库管理系统
  3. REST中的PUT与POST
  4. 同步IO、异步IO的区别
  5. STM32 基础系列教程 14 - IIC
  6. 绝望的力量:美术创作者的晋级之路
  7. java9默认收集器_Oracle提议将G1作为Java9的默认垃圾收集器
  8. 让服务器突破性能极限 阿里云神龙论文入选计算机顶会ASPLOS
  9. order by case when then end
  10. 《CoderXiaoban》第九次团队作业:Beta冲刺与验收准备1
  11. CPU cache侧信道攻击
  12. linux终端快捷键(持续更新)
  13. 网站标签页如何添加左边的小图标
  14. 学计算机的 1加1,如何用“一加一等于几”解析人生
  15. 数据结构应用题大题笔记
  16. 神鬼世界更新完了为什么显示与服务器断开连接,全新服务器构架 神鬼世界6月23日数据互通公告...
  17. 神经网络学习(3)————BP神经网络以及python实现
  18. 美国征信巨头Equifax遭黑客入侵,1.43亿公民身份数据泄漏
  19. 聚焦行业,2022巨杉客户案例及产品荣获多项殊荣
  20. 35岁以后软测就没有出路了吗?听听京东10年测开的经验分析

热门文章

  1. 【社区图书馆】与 csdn 的结缘
  2. 联想v470装linux系统,V470 上曲折的Windows7 和Ubuntu双系统安装
  3. 加密解密软件VMProtect入门使用教程(二):分析、破解和保护软件
  4. Java算法题:有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛
  5. html可视化数学公式编辑,所见即所得的jQuery数学公式编辑器插件
  6. 如何从亚马逊搞来一台免费一年的服务器
  7. HTML5、CSS3实现旋转特效
  8. UCenter登录没反映
  9. 深度学习方面的学术交流平台?
  10. C# 像素和毫米转换