GAMS中如何编写含时间求和的最大化目标函数代码
GAMS目标函数编写方案
针对你提出的0到2020年时序求和的最大化目标,按GAMS语法规则分模块编写即可,完整实现逻辑如下:
- 定义时间索引集合
首先声明覆盖0-2020范围的时间集合,作为时序求和的索引基础:
Set t 时间周期 /0*2020/;
- 定义常量与时变参数
pusage、busage为固定常量,用标量类型声明;Vusage(t)为随t递增的时变参数,可根据你实际的递增规则赋值:
* 声明常量,括号内替换为实际取值 Scalar pusage usage对应单价参数 /填入实际数值/ busage usage对应折减系数 /填入实际数值/; * 声明时变参数Vusage(t) Parameter Vusage(t) 随时间递增的usage规模; * 以下为Vusage赋值示例,可替换为你实际使用的递增函数 * 示例1:线性递增,t=0时初始值为V0,每年固定增量delta Scalar V0 初始规模 /填入实际初始值/ delta 年固定增量 /填入实际增量/; Vusage(t) = V0 + delta*t.val; * 示例2:指数递增,年增长率为growth_rate * Scalar growth_rate 年增长率 /填入实际增长率/; * Vusage(t) = V0*(1+growth_rate)**t.val;
- 定义目标变量与方程
GAMS需要先声明变量、方程,再编写方程对应的代数关系,注意给1-busage加括号避免运算优先级错误:
* 声明目标变量,存储最大化的总目标值 Variable z 总目标值; * 声明目标方程 Equation obj 目标函数方程; * 编写目标方程的具体逻辑 obj.. z =e= sum(t, Vusage(t)*pusage*(1-busage));
- 模型配置与求解
将方程纳入模型后,指定求解方向为最大化即可:
* 构建包含所有已声明方程的模型 Model calc_model /all/; * 调用求解器,以最大化z为目标求解 Solve calc_model using lp maximizing z;
注意事项:
- 代码中所有占位的参数值需要替换为你模型实际使用的数值,Vusage的赋值规则可根据你实际的时变函数灵活调整,不影响目标函数本身的写法
- 原公式中
1-busage必须加括号,否则GAMS会按运算优先级先计算Vusage(t)*pusage*1再减去busage,和你预期的计算逻辑不一致- 如果模型包含其他约束,正常声明方程、编写约束关系后纳入模型即可,不会和该目标函数冲突
内容的提问来源于stack exchange,提问作者Koussay Abdouli
相关产品推荐
相关产品推荐

