前提・実現したいこと
pythonのpulpで変数のリストの最大値を目的関数に入れたいです。
記載したコードの中で目的関数の一番右の項を追加した結果、下記のようなエラーが発生しました。
変数のリストの最大値を目的関数に入れる方法がわかりません。
発生している問題・エラーメッセージ
TypeError: '>' not supported between instances of 'NoneType' and 'NoneType'というエラー-が出ました。
該当のソースコード
from __future__ import division from pulp import LpVariable, LpProblem, LpStatus, lpSum, value import random import openpyxl wb = openpyxl.load_workbook('実データの一部で練習.xlsx',data_only=True) ws = wb.worksheets[7] demand = [cell.value for cell in tuple(ws.columns)[1] ] Ppv5 = [cell.value for cell in tuple(ws.columns)[2] ] # 変数(連続)を宣言 T=24*7*3 #時間 Cbuy = 30.0 # 買電価格 (円/kWh) Csell = 8.0 # 売電価格 (円/kWh) PVinterest=(1+0.06)**(15)/15 #pv複利 Binterest=(1+0.06)**(4)/4 #蓄電池複利 # PV parameters Cpv_inv=15000 #PV年間投資コスト Ppv_rated =LpVariable('Ppv_rated', 0, 700) Ppv= [LpVariable('Ppv_{}'.format(i), 0, None) for i in range(T)] x =LpVariable('x', 1, 1000, 'Integer') #もとの定格出力にかける定数 # Battery parameters Bcap_max = LpVariable('Bcap_max', 0, 10000) Pb_max = LpVariable('Pb_max', 0, 10000) # 出力 (kW) eff=0.8 #効率 CCB_inv=10000 CPB_inv=25000 # Battery variables Bcap= [LpVariable('Bcap_{}'.format(i), 0, None) for i in range(T)] # バッテリーの残量 Pb= [LpVariable('Pb_{}'.format(i), None, None) for i in range(T)] # 充放電電力 (kW) Pgrid= [LpVariable('Pgrid_{}'.format(i), None, None) for i in range(T)] # total power (kW) Cp = [LpVariable('Cp_{}'.format(i), None, None) for i in range(T)] # power cost vPgrid=[value(Pgrid[i]) for i in range(T)] #print(vPgrid) # Optimisation problem 目的関数(最小化) prb = LpProblem('Battery Operation') # Objective 目的関数 prb += lpSum(Cp) +Binterest*(CCB_inv*Bcap_max+CPB_inv*Pb_max)*+PVinterest*Cpv_inv*Ppv_rated*+ Cbuy*max(vPgrid) #電気料金の合計 +蓄電池の投資+ pvの投資+pvと蓄電池の運用コスト # Constraints 制約 prb += Ppv_rated == 9*x for i in range(T): prb+= Ppv[i]== Ppv5[i]* x prb += max(demand) >= Pgrid[i] prb += Pgrid[i] == Pb[i] + demand[i] - Ppv[i] # total power prb += Cp[i] >= Cbuy * Pgrid[i] prb += Cp[i] >= Csell * Pgrid[i] prb += Bcap[i] <= Bcap_max # 容量を超えない prb += Pb[i] <= Pb_max #出力を超えない prb += Pb[i] >= (-1)*Pb_max #出力を超えない # Battery charge state constraints prb += Bcap[0] == 0.5*Bcap_max +eff*Pb[0] # 始まり prb += Bcap[503] == 0.5*Bcap_max for i in range(1, T): prb += Bcap[i] == Bcap[i-1] + eff*Pb[i] # 蓄電池残量 # Solve problem prb.solve()
試したこと
Pgridのリストの値をvPgridに保存して、vPgridのリストの中身を見るとすべてNoneになっていました。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
別の変数を定義して、
Pgrid_max = LpVariable('Pgrid_max')
目的関数の max(vPgrid) を Pgrid_max に変えて、制約条件のforループに
prb += Pgrid_max >= Pgrid[i]
を追加する、のではどうでしょうか?
(コードの詳細を理解してないので、質問者さんの意図と合ってなければ、すみません)
> Pgridのリストの値をvPgridに保存して、vPgridのリストの中身を見るとすべてNoneになっていました。
LpVariableで定義した変数は、solveを実行したら値が決まるものなので、solve実行前は値は入ってませんよね
回答ありがとうございます。
回答者様の意見を参考にして、最後にPgrid_maxの値とPgrid[i]の中の最大値を確認したところ値が一致しました。別の変数で定義すればよかったんですね。
制約条件の不等号だけだと、もちろんPgrid_maxはPgrid[i]の最大値よりも大きくなってもかまわないのですが、Pgrid_maxは最小値問題の目的関数に足されているので、目的関数をできるだけ最小にしようとしたらPgrid_maxは小さいほど良いのだから、結果的にPgrid[i]の最大値ピッタリになりますよね
なるほど、頭を柔らかくして目的関数と制約式を上手に使えば今回の問題もシンプルに解けるのですね。
大変勉強になりました。ありがとうございます。
回答1件
あなたの回答
tips
プレビュー