teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

制約式が長いので大部分を省略しました。

2021/05/18 08:33

投稿

simpkins
simpkins

スコア5

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
- for i in range(1, T):
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
- prb += Bcap[i] == Bcap[i-1] + eff*Pb[i]
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
- prb += Csf[i] == rate_sf * Rev_hour_Emp * Psf[i] / demand_hour_Emp[i]
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)