GAMS程序:ADMM算法-基于ADMM法的发电商竞标策略 本程序主要介绍ADMM算法在GAMS中的编写方式,模型基于发电商竞标策略进行编写,基本包含了文章中的模型,但并非完全复现,可作为参考程序自学使用,也可在程序的基础上进行修改使用。 需要的同学可根据以下图片研究是否为自己需要的程序进行。 也可提供ADMM部分程序。 程序包括两个,分别为解决战略投资问题的广义MILP制定的GAMS代码、基于提出的共识- admm算法解决战略投资问题的GAMS代码

在能源市场的博弈场里,发电商竞标策略就像打德州扑克——既要算自己的牌面,又要揣摩对手的出价套路。ADMM算法这时候就成了个趁手的工具,能把复杂的博弈拆成自己能算的小块。咱们今天不扯数学公式,直接扒拉GAMS代码里的门道。

先看MILP标准写法这段,核心变量定义挺有意思:

variables
    q(i)       发电量
    lambda     市场出清价格
    obj        目标函数;
binary variables
    y(i)       机组启停状态;

这里把机组启停做成二元变量,典型的启停成本建模。但注意目标函数里没直接耦合其他发电商变量,这就是ADMM能拆解问题的关键——各家发电商可以独立算自己的最优,最后再协调市场价格。

GAMS程序:ADMM算法-基于ADMM法的发电商竞标策略 本程序主要介绍ADMM算法在GAMS中的编写方式,模型基于发电商竞标策略进行编写,基本包含了文章中的模型,但并非完全复现,可作为参考程序自学使用,也可在程序的基础上进行修改使用。 需要的同学可根据以下图片研究是否为自己需要的程序进行。 也可提供ADMM部分程序。 程序包括两个,分别为解决战略投资问题的广义MILP制定的GAMS代码、基于提出的共识- admm算法解决战略投资问题的GAMS代码

ADMM版的代码多了个外层迭代循环,这才是精华:

set iter /iter1*iter50/;
parameters
    rho          '惩罚因子'     /100/
    primal_tol   '原问题收敛阈值' /1e-4/
    dual_tol     '对偶收敛阈值'   /1e-4/;

loop(iter,
    solve strategic_problem using milp minimizing obj;
    z_prev(i) = z(i);
    z(i) = q(i) + (lambda - lambda_prev)/rho;
    lambda_prev = lambda;
    if(sqrt(sum(i, sqr(z(i)-z_prev(i)))) < primal_tol 
       and rho*sqrt(sum(i, sqr(z(i)-z_prev(i)))) < dual_tol,
       break;
    );
);

这个循环结构藏着三个玄机:1)每家先独立解自己的strategic_problem;2)用拉格朗日乘子lambda协调发电量;3)动态调整的惩罚项rho。这里有个小技巧,rho参数要慢慢调,太大了容易震荡,太小了收敛慢,建议从50到200之间试。

对比两个版本的求解语句就能看出门道:

* 标准MILP版本
solve strategic_problem using milp minimizing obj;

* ADMM版本
solve local_problem(i) using lp minimizing sub_obj;

ADMM把大问题拆成了多个local_problem,能并行计算。但要注意耦合变量z的更新必须串行执行,这也是为什么实际应用中需要协调节点。

最后给想实操的同学划几个重点:

  1. 残差计算别直接用发电量差值,要标准化处理
  2. 对非凸问题可能需要加正则化项
  3. 市场出清价格更新步长可以动态调整
  4. 停机条件别只看原始残差,对偶残差也要监控

这套代码骨架能套用在电力市场、交通调度等资源分配场景。不过得提醒新手,ADMM在博弈问题中的收敛性不是百分百保证,遇到震荡不妨试试惯性项或者随机扰动,有时候玄学调参还真管用。

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐