Dear GAMS experts,
I am trying to compile the code bellow, but the error message " 790 Symbolx D_discretev dimension mismatch" appears. I’ve cheked the dimentions of D_discretev and s_Demanda, but I did not find the problem. So, please, help me to handle it.
$Title Modelo - Dissertação - Daniel Sebastião da Silva - Rede de Distribuição de Água usando Programação Estocástica
Set
t 'estágios-(anos)' /2024*2030/
st(t) 'primeiro estágio' /2024/
s2t(t) 'estágios futuros' /2025*2030/
nd 'nós da rede de distribuição de água' /supply, reservatorioSOB, reservatorioITA, simples1*simples5, IPNiloCoelho, IPSalitre, IP1, IP2, IP3,IP4, ID1, ID2, ID3,
AH1, AH2, AH3, PISFNorteIP,PISFNorteAH, PISFLesteIP, PISFLesteAH, Piscicultura, outlet/;
Set
nsu(nd) 'oferta' /supply/
nr(nd) 'reservatórios' /reservatorioSOB, reservatorioITA/
nrs(nd) 'reservatório de Sobradinho' /reservatorioSOB/
nsi(nd) 'simples' /simples1*simples5/
nip(nd) 'irrigação perimetro' /IPNiloCoelho, IPSalitre, IP1, IP2, IP3, IP4/
nid(nd) 'irrigação difusa' /ID1, ID2, ID3/
nah(nd) 'abastecimento humano' /AH1, AH2, AH3/
npisf(nd) 'PISF' /PISFNorteIP, PISFNorteAH, PISFLesteIP, PISFLesteAH /
npisfnorte(nd) 'PISF-Eixo Norte' /PISFNorteIP, PISFNorteAH/
npisfleste(nd) 'PISF-Eixo Leste' /PISFLesteIP, PISFLesteAH/
npisc(nd) 'psicultura' /Piscicultura/
nus(nd) 'uso' /IPNiloCoelho, IPSalitre, IP1, IP2, IP3, IP4, ID1, ID2, ID3, AH1, AH2, AH3, PISFNorteIP, PISFNorteAH, PISFLesteIP, PISFLesteAH,
Piscicultura/;
Set
nsubm(nus) 'Submedio do Rio São Franscisco' /IPNiloCoelho, IPSalitre, IP1, IP2, IP3, IP4, ID1, ID2, ID3, AH1, AH2, AH3, Piscicultura/;
Set
ss 'cenários' /seco, normal, chuvoso/
scen 'cenários EMP' /s1*s729/;
Alias (nd, nd1);
Set nd_from_nd1 (nd, nd1) no n pega agua de n1
/reservatorioSOB.supply, simples1.reservatorioSOB, IPNiloCoelho.simples1, IPSalitre.simples1, simples2.simples1, simples2.IPNiloCoelho, simples2.IPSalitre,
ID1.simples2, AH1.simples2, simples3.simples2, simples3.ID1, simples3.AH1, IP1.simples3, simples4.simples3, simples4.IP1, AH2.simples4, IP2.simples4, ID2.simples4,
PISFNorteIP.simples4, PISFNorteAH.simples4, reservatorioITA.simples4, reservatorioITA.AH2, reservatorioITA.IP2, reservatorioITA.ID2, reservatorioITA.PISFNorteIP,
reservatorioITA.PISFNorteAH, AH3.reservatorioITA, ID3.reservatorioITA, IP3.reservatorioITA, PISFLesteIP.reservatorioITA, PISFLesteAH.reservatorioITA, simples5.reservatorioITA,
simples5.AH3, simples5.ID3, simples5.IP3, simples5.PISFLesteIP, simples5.PISFLesteAH, Piscicultura.simples5, IP4.simples5, outlet.simples5/;
Set nd_to_nd1 (nd, nd1) no n entrega para o no uso
/simples1.IPNiloCoelho, simples1.IPSalitre, simples2.ID1, simples2.AH1, simples3.IP1, simples4.ID2, simples4.AH2, simples4.IP2, simples4.PISFNorteIP, simples4.PISFNorteAH,
reservatorioITA.AH3, reservatorioITA.ID3, reservatorioITA.IP3, reservatorioITA.PISFLesteIP, reservatorioITA.PISFLesteAH, simples5.IP4, simples5.Piscicultura, simples5.outlet/;
Parameters
prob(ss) 'probabilidade em cada cenário de demanda'
/seco 0.25
normal 0.50
chuvoso 0.25/
p(t) 'Preço de venda por unidade de água em m³ ao usuário - Financeiro'
/2024 0.485
2025 0.510
2026 0.530
2027 0.550
2028 0.569
2029 0.588
2030 0.609/
Lambida(t) 'Preço de venda por unidade de água em m³ ao usuário - Economico'
/2024 0.134
2025 0.141
2026 0.144
2027 0.148
2028 0.152
2029 0.155
2030 0.159/
c(t) 'Custo de fornecimento por unidade de água em m³ para o usuário'
/2024 0.0474
2025 0.0497
2026 0.0517
2027 0.0535
2028 0.0554
2029 0.0573
2030 0.0595/
co(nsubm) 'Custo de fornecimento por unidade de água em m³ para o usuário'
/IPNiloCoelho 0.0497
IPSalitre 0.0200
IP1 0.0200
IP2 0.0200
IP3 0.0064
IP4 0.0093
ID1 0.0084
ID2 0.0023
ID3 0.0034
AH1 0.0023
AH2 0.0034
AH3 0.0045
Piscicultura 0.0034/
S_ini(nd) 'armazenamento do reservatório de Sobradinho (milhões de m3) no final do ano de 2024'
/reservatorioSOB 23477850000/;
Scalar
alfa 'coeficiente do preço financeiro ' /0.8/
gama 'coeficiente do preço economico' /0.2/
Limite_Norte 'valor máximo que xnorte pode assumir de acordo com a outorga' /510105600/
Limite_Leste 'valor máximo que xleste pode assumir de acordo com a outorga' /311040000/;
Table
O(nd,t) 'oferta de água em no cenário normal em m³'
2024 2025 2026 2027 2028 2029 2030
supply 2963952000 2981388066 2998824132 3007848066 3016872000 3025284132 3033696264;
Table
D(nd,t) 'demanda por água no cenário normal em m³'
2024 2025 2026 2027 2028 2029 2030
IPNiloCoelho 24737507 23941164 24028207 24138851 24249495 24482393 24715292
IPSalitre 84932539 78939304 79190283 79398541 79606800 80235696 80864592
IP1 706406520 651703011 646438377 651703011 656967644 665559802 674151960
IP2 237300014 235777142 237300014 239315822 241331630 243055901 244780173
IP3 120165792 119383128 120165792 121343421 122521050 122552002 122582953
IP4 94376980 92350325 92975105 93676043 94376980 95225231 96073481
ID1 353203260 325851505 323219189 325851506 328483822 332779901 337075980
ID2 118650007 117888571 118650007 119657911 120665815 121527951 122390087
ID3 60082896 59691564 60082896 60671711 61260525 61276001 61291477
AH1 41299227 37965026 38058976 38388540 38718103 39039940 39361778
AH2 6958894 6613166 6644826 6677423 6710019 6740894 6771769
AH3 5074618 4860000 4879596 4899502 4919409 4938538 4957667
PISFNorteIP 87569567 87569567 88254666 89580407 91055304 91889560 93304840
PISFNorteAH 519052201 487608805 490731592 493868136 497004680 499742278 502479876
PISFLesteIP 1921113 1889459 1895962 1908538 1921113 1940591 1960068
PISFLesteAH 302396100 281697099 283665503 285649286 287633068 289463069 291293070
Piscicultura 7816016 8442904 8386645 8330386 8274126 8215858 8157589
;
Table
Demanda(nus,ss,t) 'demanda por água e cada cenário em m³'
2024 2025 2026 2027 2028 2029 2030
IPNiloCoelho. seco 24737507 25544744 25651191 25789174 27548291 26175065 26692442
IPNiloCoelho. normal 24737507 23941164 24028207 24138851 24249495 24482393 24715292
IPNiloCoelho. chuvoso 24737507 22058633 22245029 22245029 22245029 22431424 22431424
IPSalitre. seco 84932539 85093334 86248881 88496107 90454179 91320571 93638606
IPSalitre. normal 84932539 78939304 79190283 79398541 79606800 80235696 80864592
IPSalitre. chuvoso 84932539 72168911 72342365 72342365 72342365 72515818 72515818
IP1. seco 706406520 706406520 716198681 734678421 750343371 757320743 775773685
IP1. normal 706406520 651703011 646438377 651703011 656967644 665559802 674151960
IP1. chuvoso 706406520 611469607 639382025 639382025 639382025 646438377 646438377
IP2. seco 237300014 251164225 253300489 256820271 258263132 258322474 266440248
IP2. normal 237300014 235777142 237300014 239315822 241331630 243055901 244780173
IP2. chuvoso 237300014 221337835 222774956 222774956 222774956 224212078 224212078
IP3. seco 120165792 125223298 125693322 126216272 127047312 127825427 130328134
IP3. normal 120165792 119383128 120165792 121343421 122521050 122552002 122582953
IP3. chuvoso 120165792 111480382 111771381 111771381 111771381 112062379 112062379
IP4. seco 94376980 97080295 97325153 98233910 99646435 100395058 102199838
IP4. normal 94376980 92350325 92975105 93676043 94376980 95225231 96073481
IP4. chuvoso 94376980 84405124 85317694 85317694 85317694 86230263 86230263
ID1. seco 353203260 353203260 358099341 367339211 375171686 378660372 387886843
ID1. normal 353203260 325851505 323219189 325851506 328483822 332779901 337075980
ID1. chuvoso 353203260 305734804 319691013 319691013 319691013 323219189 323219189
ID2. seco 118650007 125582112 126650245 128410136 129131566 129161237 133220124
ID2. normal 118650007 117888571 118650007 119657911 120665815 121527951 122390087
ID2. chuvoso 118650007 110668918 111387478 111387478 111387478 112106039 112106039
ID3. seco 60082896 62611649 62846661 63108136 63523656 63912714 65164067
ID3. normal 60082896 59691564 60082896 60671711 61260525 61276001 61291477
ID3. chuvoso 60082896 55740191 55885691 55885691 55885691 56031190 56031189
AH1. seco 41299227 41299227 41623295 42120986 42468605 42642600 42990962
AH1. normal 41299227 37965026 38058976 38388540 38718103 39039940 39361778
AH1. chuvoso 41299227 35607450 35902808 35902808 35902808 36198166 36198166
AH2. seco 6958894 6958894 6990707 7049131 7102665 7129589 7183126
AH2. normal 6958894 6613166 6644826 6677423 6710019 6740894 6771769
AH2. chuvoso 6958894 6199025 6240082 6240082 6240082 6281140 6281140
AH3. seco 5074618 5074618 5094213 5132316 5169485 5188148 5225161
AH3. normal 5074618 4860000 4879596 4899502 4919409 4938538 4957667
AH3. chuvoso 5074618 4543362 4577420 4577420 4577420 4611479 4611479
PISFNorteIP. seco 87569567 116028900 108669784 108669784 108669784 101310667 101310667
PISFNorteIP. normal 87569567 87569567 88254666 89580407 91055304 91889560 93304840
PISFNorteIP. chuvoso 87569567 85244408 84811386 85244408 85677430 85244408 85677430
PISFNorteAH. seco 519052201 519052201 521840241 526728480 530942638 533056596 537302853
PISFNorteAH. normal 519052201 487608805 490731592 493868136 497004680 499742278 502479876
PISFNorteAH. chuvoso 519052201 452883862 456593169 456593169 456593169 460302475 460302475
PISFLesteIP. seco 1921113 2020700 2034088 2059240 2080024 2089045 2117576
PISFLesteIP. normal 1921113 1889459 1895962 1908538 1921113 1940591 1960068
PISFLesteIP. chuvoso 1921113 1779066 1790829 1790829 1790829 1802592 1802592
PISFLesteAH. seco 302396100 302396100 304272235 307632363 310608036 312099718 315083080
PISFLesteAH. normal 302396100 281697099 283665503 285649286 287633068 289463069 291293070
PISFLesteAH. chuvoso 302396100 259306501 261613225 261613225 261613225 263919948 263919948
Piscicultura. seco 7816016 9829293 9710746 9710746 9710746 9592200 9592200
Piscicultura. normal 7816016 8442904 8386645 8330386 8274126 8215858 8157589
Piscicultura. chuvoso 7816016 7816016 7759756 7647238 7534719 7478460 7361923;
;
Table
Oferta(nd,ss,t) 'oferta de água em cada cenário em m³'
2025 2026 2027 2028 2029 2030
supply.seco 2191968000 2196396000 2196396000 2196396000 2200824000 2200824000
supply.normal 2981388066 2998824132 3007848066 3016872000 3025284132 3033696264
supply.chuvoso 4931928000 4681044000 4681044000 4681044000 4430160000 4430160000;
Parameter D_Discrete(nus,ss, t) 'Discrete realizations of D(nus, t) per scenario';
Parameter O_Discrete(nsu,ss, t) 'Discrete realizations of O(nus, t) per scenario';
Loop((nus, t, ss),
If (ord(t) > 0,
D_Discrete(nus,ss,t) = Demanda(nus, ss, t);
);
);
Loop((nsu, t, ss),
If (ord(t) > 0,
O_Discrete(nsu,ss,t) = Oferta(nsu, ss, t);
);
);
display D_Discrete, O_Discrete;
Parameters
D_discretev(nus,scen,t) 'demanda discreta para nós nus'
O_discretev(nsu,scen,t) 'demanda discreta para nós nus'
;
Positive Variables
xnorte(t) 'Quantidade de m³ comprados para o Eixo Norte nos estágios futuros'
xleste(t) 'Quantidade de m³ comprados para o Eixo Leste nos estágios futuros'
y(nd,t) 'Quantidade de água vendida em cada cenário em m³'
R(nd,t) 'liberacao de agua'
Q(nd,t) 'entrada de agua em cada no'
S(nd,t) 'volume do reservatorio';
Variables
z 'Lucro total';
Equations
obj 'Função objetivo: Maximizar lucro esperado'
rest_xnorte(t) 'restrição do valor máximo de xnorte nos estágios futuros'
rest_xnortestg1 'restrição do valor máximo de xnorte no primeiro estágio'
rest_xleste(t) 'restrição do valor máximo de xnorte nos estágios futuros'
rest_xlestestg1 'restrição do valor máximo de xnorte no primeiro estágio'
demand_rest(nus,t) 'm³ vendidos <= Demanda'
demand_rest1(nus,t) 'm³ vendidos <= Demanda (primeiro estágio)'
totalcompradoNorte_rest(nd,t) 'm³ vendidos do eixo norte <= m³ comprados do eixo norte'
totalcompradoLeste_rest(nd,t) 'm³ vendidos do eixo leste <= m³ comprados do eixo leste'
Eq_ns(nd,t) 'nos simples'
Eq_nsu(nd,t) 'nos oferta'
Eq_nsu1(nsu) 'nos oferta (primeiro estágio)'
Eq_nrs(nd,t) 'no reservatorio'
Q_nos(nd,t) 'quantidades que entram em cada no'
;
* Função objetivo
obj.. z =e= sum(t, sum(npisf, y(npisf,t)$s2t(t))*(alfa*p(t) + gama*Lambida(t))
- c(t)*(xnorte(t)+xleste(t)) ) ;
* - sum(nsubm, D_Discretev(nsubm,t) $ s2t(t) - y(nsubm,t) $ s2t(t) * co(nsubm) ) );
*Restrição do valor máximo que xnorte pode assumir no primeiro estágio
rest_xnortestg1.. xnorte('2024') =l= Limite_Norte;
*Restrição do valor máximo que xnorte pode assumir nos estágios futuros
rest_xnorte(t)$(s2t(t)).. xnorte(t) =l= Limite_Norte;
*Restrição do valor máximo que xleste pode assumir no primeiro estágio
rest_xlestestg1.. xleste('2024') =l= Limite_Leste;
*Restrição do valor máximo que xleste pode assumir
rest_xleste(t).. xleste(t) =l= Limite_Leste;
demand_rest1(nus,t).. y(nus,'2024') =l= D(nus, '2024');
demand_rest(nus,t)$(s2t(t)).. y(nus,t) =l= sum(scen, D_discretev(nus,scen,t));
*****
* Restrição: m³ vendidos <= Demanda (primeiro estágio)
**demand_rest1(nus,t).. y(nus,'2024') =l= sum(ss, prob(ss) * D_Discrete(nus, '2024', ss));
* Restrição: m³ vendidos <= Demanda (anos futuros)
**demand_rest(nus,t)$(s2t(t)).. y(nus,t) =l= sum(ss, prob(ss) * D_Discrete(nus, t, ss));
******
* Restrição Eixo Norte: m³ vendidos <= m³ comprados
totalcompradoNorte_rest(nd,t)$(npisfnorte(nd)).. sum(npisfnorte, y(npisfnorte,t)) =l= xnorte(t);
* Restrição Eixo Leste: m³ vendidos <= m³ comprados
totalcompradoLeste_rest(nd,t)$(npisfleste(nd)).. sum(npisfleste, y(npisfleste,t)) =l= xleste(t);
* Equações de rede
Q_nos(nd,t)$(s2t(t)).. Q(nd,t) =e= sum(nd1$(nd_from_nd1(nd,nd1)),R(nd1,t))- sum(nd1$(nd_to_nd1(nd,nd1)),y(nd1,t));
Eq_ns(nd,s2t)$(nsi(nd)).. R(nd,s2t) =e= Q(nd,s2t);
Eq_nsu1(nsu).. R(nsu,'2024') =e= O(nsu,'2024');
Eq_nsu(nsu,t)$(s2t(t)).. R(nsu,t) =e= sum(scen, O_discretev(nsu,scen,t));
Eq_nrs(nd,s2t)$(nrs(nd)).. S(nd,s2t) =e= S_ini(nd)$(ord(s2t) eq 1) + S(nd,s2t-1)$(ord(s2t) gt 1) + Q(nd,s2t) - R(nd,s2t);
Model rededissertacao /all/;
*$exit
* Step 1: Generate random values between 0 and 1
Parameters
rand(nus, scen, t) "Random uniform values (0,1)"
rand2(nsu, scen, t) "Random uniform values (0,1)" ;
Loop((nus, scen, t),
rand(nus, scen, t) = Uniform(0,1);
rand2(nsu, scen, t) = Uniform(0,1);
);
* Step 2: Assign demand values based on probability ranges
Loop((nus, scen, t),
D_discretev(nus, scen, t) = D_Discrete(nus, 'normal', t);
If (rand(nus, scen, t) <= 0.25,
D_discretev(nus, scen, t) = D_Discrete(nus, 'seco', t);
);
If ((rand(nus, scen, t) > 0.25) and (rand(nus, scen, t) <= 0.75),
D_discretev(nus, scen, t) = D_Discrete(nus, 'normal', t);
);
If (rand(nus, scen, t) > 0.75,
D_discretev(nus, scen, t) = D_Discrete(nus, 'chuvoso', t);
);
);
Loop((nsu, scen, t),
O_discretev(nsu, scen, t) = O_Discrete(nsu, 'normal', t);
If (rand2(nsu,scen, t) <= 0.25,
O_discretev(nsu, scen, t) = O_Discrete(nsu, 'seco', t);
);
If ((rand2(nsu, scen, t) > 0.25) and (rand2(nsu,scen, t) <= 0.75),
O_discretev(nsu, scen, t) = O_Discrete(nsu, 'normal', t);
);
If (rand2(nsu, scen, t) > 0.75,
O_discretev(nsu, scen, t) = O_Discrete(nsu, 'chuvoso', t);
);
);
*$exit
file emp / 'emp.info' /; put emp '* problem %gams.i%'/;
Loop((nsu, scen, t),
Put emp / 'randvar' ' ' O_discretev.tn(nsu, scen, t) ' ' 'discrete' 1 ' ' O_discretev(nsu, scen, t);
);
Loop((nus, scen, t),
Put emp ' ' / 'randvar' ' ' D_discretev.tn(nus, scen, t) ' ' 'discrete' 1 ' ' D_discretev(nus, scen, t);
);
put emp /;
** First stage
loop(t$st(t),
put emp / 'stage ' t.tl:0 ' ' xnorte.tn(t) ' ' xleste.tn(t) ' '
loop(nus, put emp demand_rest1.tn(nus, t) ' ' )
loop(nsu, put emp Eq_nsu1.tn(nsu) ' ' )
loop(nd, put emp y.tn(nd, t) ' ' R.tn(nd, t) ' ' Q.tn(nd, t) ' ' S.tn(nd, t) ' ' )
);
put emp "rest_xnortestg1 rest_xlestestg1" /;
**Multistage
loop(t$s2t(t),
put emp / 'stage ' t.tl:0 ' ' xnorte.tn(t) ' ' xleste.tn(t) ' ' rest_xnorte.tn(t) ' ' rest_xleste.tn(t) ' '
* loop(nus, put emp demand_rest.tn(nus, t) ' ' )
loop(nd,
put emp totalcompradoNorte_rest.tn(nd, t) ' '
totalcompradoLeste_rest.tn(nd, t) ' '
Eq_ns.tn(nd, t) ' '
Eq_nsu.tn(nd, t) ' '
Eq_nrs.tn(nd, t) ' '
Q_nos.tn(nd, t) ' '
y.tn(nd, t) ' '
R.tn(nd, t) ' '
Q.tn(nd, t) ' '
S.tn(nd, t) put emp /
)
);
PutClose;
Parameters
* scenario_map(scen, t, ss) 'mapeamento de cenários para cada período'
s_Demanda(nus,scen,t) "Realização da demanda por cenário"
s_Oferta(nsu,scen,t) "Realização da oferta por cenário"
s_xnorte(scen,t) "Quantidade de m³ comprados para o Eixo Norte por cenário"
s_xleste(scen,t) "Quantidade de m³ comprados para o Eixo Leste por cenário"
s_y(scen,nd,t) "Quantidade de água vendida em m³ por cenário"
s_R(scen,nd,t) "Liberação de água por cenário"
s_Q(scen,nd,t) "Entrada de água em cada nó por cenário"
s_S(scen,nd,t) "Volume do reservatório por cenário"
s_rep(scen,*) "Probabilidade de cada cenário";
;
*display D_Discrete, s_Demanda;
*$exit
*
Set dict /
scen .scenario .' '
D_Discretev .randvar .s_Demanda
O_Discretev .randvar .s_Oferta
xnorte .level .s_xnorte
xleste .level .s_xleste
y .level .s_y
R .level .s_R
Q .level .s_Q
S .level .s_S
' ' .opt .s_rep
/;
*put /;
putclose emp;
option emp = de;
Option LP = cplex;
option resLim = 20600;
option limrow = 1000, limcol = 1000;
execute 'type emp.info';
execute 'dir > directory_list.txt';
execute 'copy emp.info C:\GAMS\emp.info';
*abort$[not fileexist('emp.info')];
solve rededissertacao max z using emp scenario dict;
display Demanda, Oferta, scen, rand,rand2, D_discretev, O_discretev;
*$exit