Pythonで最適化問題を解こうとしていますが行き詰っています。
【環境】
Jupyter notebook
Python3.7.6
【状況】
コード、もしくは添付画像にある表のように、1~1,000までのStrategyとそのパラメーター(Net profit,Profit factor,Wining Percent)、さらにその結果列(Result)をインポートしています。
最適化の変数(x1,x2,x3)はそれぞれNet profit, Profit factor, Wining Percentへのフィルターです。
例えば
x1 = 10000
x2 = 1.3
x3 = 50
であれば、
Net profit > 10000 かつ、
Profit factor > 1.3 かつ
Wining Percent > 50
のすべてを満たすStrategyを選び、そのResultの値の合計を最大化できるような変数(x1,x2,x3)を探しています。
【質問】
2点質問です。
①以下のコードで最適化計算を行いましたが、結果がNoneとなります。目的関数の書き方が間違っているのでしょうか?正しい書き方をご教授いただきたいです。
②今は例としてパラメーターが3つ(Net profit,Profit factor, Wining Percent)しかありませんが、本来は10~20列のパラメーターと変数を並べて、すべてのフィルターをクリアしたResultの値を求めたいと思っています。また、Resultも合計だけでなく、プラスの個数/マイナスの個数(勝率)も出したいと考えています。
今のコードの書き方(&でつなげる記法)では限界があるので、リストやループなどを使ってスマートに書きたいのですがうまくいきません。
ご教授いただけますでしょうか。
version Python3.7.6
Python
1# データインポート 2[IN] 3import pandas as pd 4 5df = pd.read_csv("Optimize_QA.csv",index_col=0) 6print(len(df)) 7df.head() 8 9[OUT] 101000 11 Net profit Profit factor Winning Percent Result 12Strategy Name 13Strategy 1 1214.79 1.33 45.52 -38.13 14Strategy 2 1171.42 1.47 41.18 29.16 15Strategy 3 11325.80 1.32 70.08 -133.20 16Strategy 4 5929.30 1.32 43.37 189.60 17Strategy 5 495.26 1.34 48.51 -16.83 18 19#最適化 20[IN] 21from pulp import * 22 23# 数理最適化問題(最大化)を宣言 24m = LpProblem(sense=LpMaximize) 25 26# 変数を宣言 27x1 = LpVariable('x1', lowBound=0.0) 28x2 = LpVariable('x2', lowBound=0.0) 29x3 = LpVariable('x3', lowBound=0.0) 30 31# 目的関数 32m += df.loc[(df["Net profit"] >= x1) & (df["Profit factor"] >= x2) & (df["Winning Percent"] >= x3), "Result"].sum() 33 34# ソルバーの実行 35m.solve() 36 37# 結果出力 38print(value(x1),value(x2),value(x3)) 39print(value(m.objective)) 40print(LpStatus[m.status]) 41 42[OUT] 43None None None 44None 45Optimal
あなたの回答
tips
プレビュー