質問編集履歴
1
制約式が長いので大部分を省略しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -135,36 +135,135 @@
|
|
135
135
|
R_dem_OA = 0.2
|
136
136
|
|
137
137
|
#関数
|
138
|
+
def monte():
|
139
|
+
x = random.randrange(31, 61, 5)
|
140
|
+
Bcap_max = random.randrange(26, 176, 25)
|
141
|
+
Pb_max = random.randrange(17, 167, 25)
|
142
|
+
|
143
|
+
df=csv.resample('H').mean()
|
144
|
+
df = df.reset_index()
|
145
|
+
df['weekday'] =df['時間'].dt.weekday
|
146
|
+
df = df.set_index("時間")
|
147
|
+
df.loc[df['weekday'] < 5 , 'weekday'] = 1
|
148
|
+
df.loc[df['weekday'] >= 5, 'weekday'] = 0
|
138
149
|
|
150
|
+
def shuffle_days(df_month):
|
151
|
+
groups = [df for _, df in df_month.groupby('D')]
|
152
|
+
random.shuffle(groups)
|
153
|
+
return pd.concat(groups).reset_index(drop=True)
|
154
|
+
|
139
|
-
|
155
|
+
df = df.reset_index()
|
156
|
+
df['Y'] = df['時間'].dt.year
|
157
|
+
df['M'] = df['時間'].dt.month
|
158
|
+
df['D'] = df['時間'].dt.day
|
159
|
+
df = df.groupby(['Y', 'M','weekday']).apply(shuffle_days)
|
160
|
+
df = df.drop(['Y', 'M', 'D','weekday'], axis=1).reset_index(drop=True)
|
161
|
+
|
162
|
+
demand = list(df['demand'])
|
140
|
-
|
163
|
+
Ppv5 = list(df['pv_5'])
|
164
|
+
Cbuy = 15
|
165
|
+
d_term = [1,2,3]
|
166
|
+
tt = random.choice(d_term)
|
141
167
|
|
168
|
+
TT = 24 * tt
|
169
|
+
BBcap = [LpVariable('BBcap_{}'.format(i), None, None) for i in range(TT)]
|
170
|
+
PPb = [LpVariable('PPb_{}'.format(i), None, None) for i in range(TT)]
|
171
|
+
ddemand = [LpVariable('ddemand_{}'.format(i), 0, None) for i in range(TT)]
|
172
|
+
Psf = [LpVariable('Psf_{}'.format(i), None, None) for i in range(TT)]
|
173
|
+
|
174
|
+
Cbd = [LpVariable('Cbd_{}'.format(i), None, None) for i in range(TT)]
|
175
|
+
Csf = [LpVariable('Csf_{}'.format(i), None, None) for i in range(TT)]
|
176
|
+
|
177
|
+
Emp = [LpVariable('Emp_{}'.format(i), None, None) for i in range(TT)]
|
178
|
+
Eva = 10 #避難者数(Evacuee)
|
179
|
+
)
|
180
|
+
x0 = [LpVariable('x0_{}'.format(i), 0, None) for i in range(TT)]
|
181
|
+
x1 = [LpVariable('x1_{}'.format(i), 0, None) for i in range(TT)]
|
182
|
+
x2 = [LpVariable('x2_{}'.format(i), 0, None) for i in range(TT)]
|
183
|
+
x3 = [LpVariable('x3_{}'.format(i), 0, None) for i in range(TT)]
|
184
|
+
|
185
|
+
SoC0_before = [0,0,0,0,0,0,0,0,0,0,0,0,0,0.3551,16.572,0,0,0,0,0,0,0,0,0]
|
186
|
+
SoC0_after = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,47.3011,50.3314,49.4792,0,0,0,0,0,0,0]
|
187
|
+
|
188
|
+
Rev_year = 4000000000
|
189
|
+
Cbuy = 15
|
190
|
+
Cp_end = LpVariable('Cp_end',None,None)
|
191
|
+
C0_before = 0.1
|
192
|
+
C0_after = 0
|
193
|
+
C1 = 0.5
|
194
|
+
C2 = 1
|
195
|
+
C3_before = 2
|
196
|
+
C3_after = 2.1
|
197
|
+
|
198
|
+
X0_before = 0.3
|
199
|
+
X0_after = 0.6 #コロナ禍
|
200
|
+
X1_before = 0.4
|
201
|
+
X1_after = 0.2 #コロナ禍
|
202
|
+
X2_before = 0.2
|
203
|
+
X2_after = 0.1 #コロナ禍
|
204
|
+
X3 = 0.1
|
205
|
+
rate_sf = 7
|
206
|
+
R_dem_OA = 0.2
|
207
|
+
date = random.randint(1, 365)
|
208
|
+
s = date * 24 + blackout_start_time
|
209
|
+
ddf2 = ddf[s:s+TT]
|
210
|
+
|
211
|
+
demand_usual_before = list(ddf2['demand_usual'])
|
212
|
+
demand_usual_after = list(ddf2['demand_usual_covid_19'])
|
213
|
+
|
214
|
+
PPpv5 = list(ddf2['pv_5'])
|
215
|
+
PPpv = [n * x for n in PPpv5] #PV発電量
|
216
|
+
|
217
|
+
demand_hour_Emp = list(ddf2['demand_hour_Emp'])
|
218
|
+
Emp_usual_before = list(ddf2['Emp_usual'])
|
219
|
+
Emp_usual_after = list(ddf2['Emp_usual_covid_19'])
|
220
|
+
PPpv = [n * x for n in PPpv5]
|
221
|
+
|
222
|
+
BL = list(ddf2['Base'])
|
223
|
+
Emp_total = sum(ddf['Emp_usual'])
|
224
|
+
Rev_hour_Emp = Rev_year / Emp_total #
|
225
|
+
|
226
|
+
if covid_19 == 0
|
227
|
+
demand_usual = demand_usual_before
|
228
|
+
Emp_usual = Emp_usual_before
|
229
|
+
SoC0 = SoC0_before[blackout_start_time] / 100
|
230
|
+
C0 = C0_before
|
231
|
+
C3 = C3_before
|
232
|
+
X0 = X0_before
|
233
|
+
X1 = X1_before
|
234
|
+
X2 = X2_before
|
235
|
+
else:
|
236
|
+
demand_usual = demand_usual_after
|
237
|
+
Emp_usual = Emp_usual_after
|
238
|
+
SoC0 = SoC0_after[blackout_start_time] / 100
|
239
|
+
C0 = C0_after
|
240
|
+
C3 = C3_after
|
241
|
+
X0 = X0_after
|
242
|
+
X1 = X1_after
|
243
|
+
X2 = X2_after
|
244
|
+
|
245
|
+
CX_elec = C0 * X0 + C1 * X1 + C2 * X2 + C3 * X3
|
246
|
+
# Optimisation problem 目的関数(最小化)
|
247
|
+
prb = LpProblem('Battery Operation')
|
248
|
+
# Objective 目的関数
|
249
|
+
objective1= lpSum(Cp) +Binterest*(CCB_inv*Bcap_max+CPB_inv*Pb_max)+PVinterest*Cpv_inv*Ppv_rated +1700*12*Pgrid_max
|
250
|
+
objective2 = Cp_end + lpSum(Cbd) + lpSum(Csf)
|
251
|
+
prb += objective1 + objective2
|
252
|
+
# Constraints 制約
|
253
|
+
prb += Ppv_rated == 9*x
|
254
|
+
for i in range(T):
|
255
|
+
if Pgrid[i]>=0:
|
256
|
+
Cp[i] == Cbuy * Pgrid[i]
|
257
|
+
else:
|
258
|
+
Cp[i] == Csell * Pgrid[i]
|
259
|
+
|
260
|
+
prb+= Ppv[i]== Ppv5[i]* x
|
142
261
|
###ここからは災害の制約
|
143
262
|
for i in range(TT):
|
144
263
|
|
145
264
|
prb += Cbd[i] == Rev_hour_Emp * Emp_usual_before[i] * (CX_elec - (C0 * x0[i])\
|
146
265
|
- (C1 * x1[i]) - (C2 * x2[i]) - (C3 * x3[i]))
|
147
|
-
|
148
|
-
|
266
|
+
|
149
|
-
prb += 0 <= x0[i] <= X0
|
150
|
-
prb += 0 <= x1[i] <= X1
|
151
|
-
prb += 0 <= x2[i] <= X2
|
152
|
-
prb += 0 <= x3[i] <= X3
|
153
|
-
prb += Emp[i] == Emp_usual_before[i] * (x0[i] + x1[i] + x2[i] + x3[i])
|
154
|
-
|
155
|
-
prb += ddemand[i] == BL[i] + demand_hour_Emp[i] * (Emp[i] + (1 - R_dem_OA) * Eva)
|
156
|
-
prb += BBcap[i] <= Bcap_max
|
157
|
-
prb += BBcap[i] >= 0
|
158
|
-
prb += PPb[i] <= Pb_max
|
159
|
-
prb += PPb[i] >= (-1) * Pb_max
|
160
|
-
prb += Psf[i] >= 0
|
161
|
-
prb += PPb[i] <= PPpv[i] + Psf[i] - ddemand[i]
|
162
|
-
if i == 0:
|
163
|
-
prb += BBcap[0] == SoC0 * Bcap_max + eff * PPb[0]
|
164
|
-
else:
|
165
|
-
prb += BBcap[i] == BBcap[i-1] + eff * PPb[i]
|
166
|
-
|
167
|
-
prb += Cp_end == Cbuy * (SoC0 * Bcap_max - BBcap[TT-1])
|
168
267
|
prb.solve()
|
169
268
|
|
170
269
|
cost = pulp.value(objective1)
|