質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

Q&A

0回答

663閲覧

最適化問題の目的関数がうまく作れない【Python3.7.6】

Niniad

総合スコア5

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

0グッド

0クリップ

投稿2020/04/26 03:24

編集2020/04/26 14:36

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

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

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

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

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

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

magichan

2020/04/27 00:20 編集

> Net profit > 10000 かつ、Profit factor > 1.3 かつWining Percent > 50のすべてを満たすStrategyを選び、そのResultの値の合計 これは条件でフィルタをかけて残った値の合計を求めるだけなので、最適化ソルバー使うまでもなく一意に定まるのではないですか?(Resultが負値のものだけを省けばよいので)
Niniad

2020/04/27 23:04

1000,1.3,50はあくまで説明のために入れた仮の値です。 これらの値を変数として、最適化したいと思っています
magichan

2020/04/30 03:48

なるほど、理解しました。 ただ、pulp の目的関数に pandas のフィルター使っての条件式って使えるんでしょうか? 少なくとも私はこのような記述を見たことがありません。
Niniad

2020/04/30 04:10

全くの素人でその辺りもわかりませんでした やり方に拘らず、この最適化問題の解き方が分かれば良いのですが、、、 エクセルソルバーではSUMIFなど駆使して一応条件指定できたのですが、計算が途中で終わってしまう、遅いなどの問題がありました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問