🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4633閲覧

pythonのpulpで変数のリストの最大値を目的関数に入れる

simpkins

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/11/28 01:48

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2020/11/28 04:57 編集

別の変数を定義して、 Pgrid_max = LpVariable('Pgrid_max') 目的関数の max(vPgrid) を Pgrid_max に変えて、制約条件のforループに prb += Pgrid_max >= Pgrid[i] を追加する、のではどうでしょうか? (コードの詳細を理解してないので、質問者さんの意図と合ってなければ、すみません)
jbpb0

2020/11/28 04:57

> Pgridのリストの値をvPgridに保存して、vPgridのリストの中身を見るとすべてNoneになっていました。 LpVariableで定義した変数は、solveを実行したら値が決まるものなので、solve実行前は値は入ってませんよね
simpkins

2020/11/28 06:46

回答ありがとうございます。 回答者様の意見を参考にして、最後にPgrid_maxの値とPgrid[i]の中の最大値を確認したところ値が一致しました。別の変数で定義すればよかったんですね。
jbpb0

2020/11/28 06:54

制約条件の不等号だけだと、もちろんPgrid_maxはPgrid[i]の最大値よりも大きくなってもかまわないのですが、Pgrid_maxは最小値問題の目的関数に足されているので、目的関数をできるだけ最小にしようとしたらPgrid_maxは小さいほど良いのだから、結果的にPgrid[i]の最大値ピッタリになりますよね
simpkins

2020/11/28 07:12

なるほど、頭を柔らかくして目的関数と制約式を上手に使えば今回の問題もシンプルに解けるのですね。 大変勉強になりました。ありがとうございます。
guest

回答1

0

自己解決

jbpb0さんの意見を参考に、別の変数、Pgrid_max = LpVariable('Pgrid_max',0,480)を定義して、目的関数の max(vPgrid) を Pgrid_max に変えて、制約条件のforループにprb += Pgrid_max >= Pgrid[i]を加えることで、最終的にPgrid_maxの値とPgrid[i]の中の最大値を確認したところ値が一致したため、目的を達成できました。

投稿2020/11/28 06:55

simpkins

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問