/
LibObjFunct.py
173 lines (127 loc) · 6.47 KB
/
LibObjFunct.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# -*- codgenng: utf-8 -*-
"""
Created on Thu Dec 7 19:45:15 2017
@author: delikars
"""
import gurobipy as gb
import defaults
import pandas as pd
def _build_objective_StochElecDA(self):
var = self.variables
#generators = self.edata.generators
gfpp = self.edata.gfpp
nongfpp = self.edata.nongfpp
gendata = self.edata.generatorinfo
HR=self.edata.generatorinfo.HR
gaspriceda = self.edata.GasPriceDA
gaspriceRT = self.edata.GasPriceRT
SCdata = self.edata.SCdata
swingcontr = self.edata.swingcontracts
time = self.edata.time
Map_Eg2Gn=self.edata.Map_Eg2Gn
scenarios = self.edata.scenarios
m = self.model
scenarioprob={}
scenarioprob = {s: self.edata.scen_wgp[s][2] for s in self.edata.scen_wgp.keys()}
scengprt = {s: self.edata.scen_wgp[s][0] for s in self.edata.scen_wgp.keys()}
#scenarioprob = self.data.scenprob['Probability'].to_dict()
P_up=defaults.RESERVES_UP_PREMIUM
P_dn=defaults.RESERVES_DN_PREMIUM
# !NB Re-dispatch cost = Day-ahead energy cost (No premium)
m.setObjective(
# Day-ahead energy cost
# Non Gas Generators
gb.quicksum(gendata.lincost[gen]*var.Pgen[gen,t] for gen in nongfpp for t in time) +
# Gas Generators = Nodal Gas Price * HR * Power Output
gb.quicksum( gaspriceda[t][Map_Eg2Gn[gen]] *HR[gen]*var.Pgen[gen,t] for gen in gfpp for t in time) +
# Gas Generators with Contracts
gb.quicksum(SCdata.lambdaC[sc,gen]*HR[gen]*var.PgenSC[gen,t] for gen in gfpp for sc in swingcontr for t in time) +
# Real-time redispatch cost
# Probability
gb.quicksum(scenarioprob[s] * (
# Non Gas Generators
gb.quicksum(gendata.lincost[gen]*(P_up*var.RUp[gen,s,t]-P_dn*var.RDn[gen,s,t]) for gen in nongfpp for t in time) +
# Gas Generators
gb.quicksum(gaspriceRT[t][Map_Eg2Gn[gen]][scengprt[s]]*HR[gen]*(P_up*var.RUp[gen,s,t]-P_dn*var.RDn[gen,s,t]) for gen in gfpp for t in time) +
# Gas Generators with Contracts
gb.quicksum(SCdata.lambdaC[sc,gen]*HR[gen]*(P_up*var.RUpSC[gen,s,t]-P_dn*var.RDnSC[gen,s,t]) for gen in gfpp for sc in swingcontr for t in time) +
# Load Shedding Penalty
gb.quicksum(defaults.VOLL * var.Lshed[s,t] for t in time)) for s in scenarios),
gb.GRB.MINIMIZE)
def _build_objective_gasDA(self):
m = self.model
var = self.variables
time = self.gdata.time
wdata = self.gdata.wellsinfo
wells = self.gdata.wells
pipes = self.gdata.pplineorder
gsdata = self.gdata.gstorageinfo
gstorage = self.gdata.gstorage
k_obj = ['k0','k1','k2'] # Optimize for 'central case' k0
print('\n\n Objective function altered to remove degeneracy\n\n')
Cost=pd.DataFrame(index=time,columns=wells)
for w in wells:
for t in time:
Cost[w][t]=wdata.Cost[w]+int(t[1:])
m.setObjective(gb.quicksum(Cost[gw][t]*var.gprod[gw,k,t] for gw in wells for k in k_obj for t in time)+
gb.quicksum( self.gdata.EPS*(var.pr[pl[0],k,t]-var.pr[pl[1],k,t]) for t in time for k in k_obj for pl in pipes)+
gb.quicksum(gsdata.Cost[gs]*(var.gsin[gs,k,t]+var.gsout[gs,k,t]) for gs in gstorage for k in k_obj for t in time),
gb.GRB.MINIMIZE)
# NB! Gas storage costs NOT included in the objective function
#
#
#
def _build_objective_ElecRT(self):
var = self.variables
gfpp = self.edata.gfpp
nongfpp = self.edata.nongfpp
gendata = self.edata.generatorinfo
gaspriceRT = self.edata.GasPriceRT
HR=self.edata.generatorinfo.HR
SCdata = self.edata.SCdata
swingcontr = self.edata.swingcontracts
time = self.edata.time
Map_Eg2Gn=self.edata.Map_Eg2Gn
scenarios = self.edata.windscen_index # Only wind power scenarios
scenarioprob=self.edata.windscenprob
m = self.model
# !NB Re-dispatch cost = Day-ahead energy cost (No premium)
m.setObjective(
# Real-time redispatch cost
gb.quicksum(scenarioprob[s] * (
# Non Gas Generators
gb.quicksum(gendata.lincost[gen]*(var.RUp[gen,s,t]-var.RDn[gen,s,t]) for gen in nongfpp for t in time) +
# Gas Generators (No Contract)
gb.quicksum(gaspriceRT[t][Map_Eg2Gn[gen]]['spm']*HR[gen]*(defaults.RESERVES_UP_PREMIUM*var.RUp[gen,s,t]-defaults.RESERVES_DN_PREMIUM*var.RDn[gen,s,t]) for gen in gfpp for t in time) +
# Gas Generators with Contracts
gb.quicksum(SCdata.lambdaC[sc,gen]*HR[gen]*(defaults.RESERVES_UP_PREMIUM*var.RUpSC[gen,s,t]-defaults.RESERVES_DN_PREMIUM*var.RDnSC[gen,s,t]) for gen in gfpp for sc in swingcontr for t in time) +
# Load Shedding Penalty
gb.quicksum(defaults.VOLL * var.Lshed[s,t] for t in time)) for s in scenarios),
gb.GRB.MINIMIZE)
def _build_objective_gasRT(self):
m = self.model
var = self.variables
time = self.gdata.time
scenarios = self.gdata.scenarios
# To be PROPERLY defined, assume equi-likely for now
scenarioprob=self.gdata.scenprob # To be defined...
wdata = self.gdata.wellsinfo
wells = self.gdata.wells
gnodes = self.gdata.gnodes
pipes = self.gdata.pplineorder
print('\n\n Objective function altered to remove degeneracy\n\n')
Cost=pd.DataFrame(index=time,columns=wells)
for w in wells:
for t in time:
Cost[w][t]=wdata.Cost[w]+int(t[1:])
m.setObjective(gb.quicksum(scenarioprob[s] * (
gb.quicksum(Cost[w][t]*(defaults.RESERVES_UP_PREMIUM*var.gprodUp[gw,s,t] - defaults.RESERVES_DN_PREMIUM*var.gprodDn[gw,s,t] ) for gw in wells for t in time)
+gb.quicksum(defaults.VOLL * var.gshed_rt[gn,s,t] for gn in gnodes for t in time)
+gb.quicksum( self.gdata.EPS*(var.pr_rt[pl[0],s,t]-var.pr_rt[pl[1],s,t]) for t in time for pl in pipes)
) for s in scenarios),
gb.GRB.MINIMIZE)
# NB! Gas storage costs NOT included in the objective function
# Dummy objective function if solving optimization problem as CP
def _build_objective_dummy_complementarity(self):
m = self.model
m.setObjective(self.variables.z+1.0, gb.GRB.MINIMIZE)