考虑系统的不确定下,一般可能会用到随机优化,
随机优化面临一个重要的概念就是 场景缩减
网上没有找到 场景缩减的例子 ,这里我就推荐一点学习的资料吧。
就是用这些资料,完成了场景缩减的编程,大家也可以尝试一下呦。
目录
1,官网文档资料
2,官网编程实例
3,带飞重要知识点
help -> doc -> solvers -> SCENRED
就是这个文档,不多,20多页。
放一下,一些比较重要的点,就是程序中重点关注的地方,文档会解释是什么意义。
ClearLake.gms //这个程序 ,这个程序看懂,基本编程就可以了。为了大家容易看懂,对程序作了精简,去除了模型相关的内容。
当然,secnred.pdf这个文件中,还推荐了另外两个gams,程序,也是不错的(这里不写了,大家看文档找找吧!!!(皮一下还是很开心的。。))
放一下代码,怎么说呢,按照这个格式去写,就行了。(照葫芦画瓢)
SET p Precipitation levels in each month /low, normal, high/
t Time periods /dec,jan,feb,mar,apr/
baset(t) / dec /
w Weather conditions /wet, dry/;
SET tw(t,w) relates months to weather conditions /
(jan,feb).wet
(mar,apr).dry
/;
SET n nodes / n1 * n121 /;
ALIAS (n,parent,child);
SET root(n) root node / n1 /
tn(t,n) map nodes to time periods
anc(child,parent) ancestor mapping
np(n,p) maps nodes to precipitation level
leaf(n);
np(n,p)$[mod(ord(n)-2,card(p)) eq ord(p)-1] = yes;
np(root,p) = no;
display np;
scalar tmp1, tmp2;
tmp1 = 0;
loop {t,
tmp2 = (power[card(p), ord(t)]) / (card(p)-1);
tn(t,n)$[ord(n) ge tmp1 and ord(n) lt tmp2] = yes;
tmp1 = tmp2;
};
display tn;
anc(child,parent)$[floor((ord(child)+1)/card(p)) eq ord(parent)] = yes;
display anc;
leaf(n)$[ord(n) gt (power[card(p), card(t)-1] - 1) / (card(p)-1)] = yes;
display leaf;
TABLE delta(w,p) Changes in reservoir level for each season
low normal high
dry -50 100 250
wet 50 150 350 ;
PARAMETER pr(p) Probability distribution /
low 0.25,
normal 0.50,
high 0.25
/;
PARAMETER nprob(n) probability of being at any node;
nprob(root) = 1;
loop {anc(child,parent),
nprob(child) = sum {np(child,p), pr(p)} * nprob(parent);
};
display nprob;
* ndelta required for current scenRed implementation
PARAMETER ndelta(n) water delta at each node;
ndelta(n) = sum {(tw(t,w), np(n,p))$[tn(t,n)], delta(w,p)};
display ndelta;
tmp1 = sum {leaf, nprob(leaf)};
abort$[abs(tmp1-1) gt 1e-8] "Error in tree: leaf probabilities do not sum to 1";
SET nn(n) nodes in reduced tree
sanc(child,parent) ancestor mapping for reduced tree
canc(child,parent) computed ancestor mapping for reduced tree;
PARAMETER snprob(n) probabilities for reduced tree;
$if set noscenred $goto noscenreduction
* now let's shrink the node set
$libinclude scenred.gms
ScenRedParms('num_leaves') = sum {leaf, 1};
ScenRedParms('num_random') = 1;
ScenRedParms('num_nodes') = card(n);
ScenRedParms('num_time_steps') = card(t);
* typically, one of the following two parameters is set
ScenRedParms('red_percentage') = 0.5;
* optional SCENRED input parameters: defaults are commented
* ScenRedParms('num_stages') = ScenRedParms('num_time_steps');
* ScenRedParms('reduction_method') = 0;
* ScenRedParms('where_random') = 10;
* ScenRedParms('report_level') = 0;
ScenRedParms('run_time_limit') = 60;
execute_unload 'lakein.gdx', ScenRedParms, n, anc, nprob, ndelta;
execute 'rm -f lakeout.gdx';
file opts / 'scenred.opt' /;
putclose opts 'log_file = lakelog.txt'
/ 'input_gdx lakein.gdx'
/ 'output_gdx = lakeout.gdx';
execute 'scenred scenred.opt %system.redirlog%';
execute_load 'lakeout.gdx', ScenRedReport, snprob=red_prob,
sanc=red_ancestor;
display ScenRedReport;
display snprob;
nn(n) = snprob(n);
display nn;
execute_unload 'lakein.gdx', ScenRedParms, n, anc, nprob, ndelta;
看懂这句,几乎就成了,就是scenred 需要的输入的一些参数(初学者这个地方可能很迷)
非常重要。。。其他程序都是围绕这句来写的。。
其他程序就是, 对ScenRedParms 赋值
n, 节点
anc, 节点之间的连接关系,也就是tree
nprob, 节点概率
ndelta; 节点的值
好了,原来没有看到过网上有分享,GAMS场景缩减程序的,希望大家能快点入手呦。
搜索“GAMS系列分享”,关注“GAMS”在电力系统(综合能源)中的应用。
搜索“GAMS系列分享”,关注“GAMS”在电力系统(综合能源)中的应用。
搜索“GAMS系列分享”,关注“GAMS”在电力系统(综合能源)中的应用。
大家一间三连呦!!!(*...*)