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

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

新規登録して質問してみよう
ただいま回答率
85.45%
最適化

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

Python

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

Q&A

解決済

1回答

1590閲覧

pythonのpulpの最適化変数を用いた0,1のswitch文が作成ができません

robocat

総合スコア4

最適化

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

Python

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

0グッド

1クリップ

投稿2021/10/22 09:41

前提・実現したいこと

pythonのpulpを用いて以下の画像の例のような制約条件の作成を試みております。
ポイントとしましては、最適化変数の総和で0,1のスイッチを作成したいです。
(申し訳ないのですが、モデルは簡略化しております。)

イメージ説明

試したことの概要

step1:zeros()関数でyの0行列を作成する
step2:事前に最適化変数xの総和を行う。

image

1sum_x=0 2for j in [0,2,3]: 3 sum_x+=pulp.value(x[1][j])

step3:総和が0になる場合と1以上になる場合でif関数を用いて場合分けをする。(yはゼロ行列のため、必要に応じて要素を1に変更する。)

image

1if sum_x>0: 2 y[1]=1 3elif sum_x==0: 4 continue

結果:しかし、実行した時点では最適化変数に値は入っておらず(実際にはNoneが入り)、適切に総和、及び場合分けがされませんでした。
(※pulpの勉強不足でした。)

他にも異なるパターンを試してみたのですが、上記と同様に最適化変数がNoneとなり(最適化変数が最適化変数として機能しておらず)、うまくいきませんでした。

ざっくりとした説明で恐れ入りますが、もし上記のpythonプログラムの作成方法を知っておりましたらご教授いただけますと幸いです。

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

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

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

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

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

meg_

2021/10/22 20:59

> しかし、実行した時点では最適化変数に値は入っておらず(実際にはNoneが入り) どの時点で値が決まるのですか?
robocat

2021/10/23 02:37

ご連絡下さりありがとうございます。 私はpulpに関してきちんと勉強したわけではないので、経験則からご返事させていただきます。 結論を先に申し上げますと、【(pulpを使用した際の数理最適化問題を解くプログラムである)“problem.solve()”の実行終了後】だと考えております。 私の試したこと欄に記載させていただいたプログラム(image)は、最適化変数の設定のプログラムと上記の最適化問題を解くプログラム“problem.solve()”の間の制約条件を定義する段階に記述しておりました。 その状態で実行すると、制約条件を定義する段階ではあくまで定義していないためかsum_x+=pulp.value(x[1][j])のpulp.value(x[1][j])にはNoneしか入りませんでした。 (最適化問題を問題なく解ききることができることが事前に確認できているプログラムを実行した後、imageのプログラムをPython shellに入力すると問題なく最適化変数であり、バイナリ変数xの総和を計算してくれました。そのため、imageのプログラムは誤っていなかったことと、“problem.solve()”を実行終了後であれば最適化変数xには基本的には0,1が入ることもわかりました。(もちろん、あえて計算をしないプログラムをかけば0,1ではなく、Noneが入ります。)) 蛇足ではありますが、制約条件の段階ではpulp.value(x[1][j])にはNoneしか入らないことは、image以外のプログラムでも検証しました。 以下に検証した際の制約条件のプログラムの簡略版を添付させていただきます。 (末尾のif pulp.value(x[1][j]==1)を外すと、問題なく制約条件が最適化問題の解に反映されることを事前に確認した上で検証を行いました。) problem += pulp.lpSum(x[1][j] for j in [0,2,3] if pulp.value(x[1][j])==1) <= 4 実行後、Python shellにproblemと入力したところ、上記のプログラムの部分には以下の式が記載されていました。 __dummy <= 4 また、制約自体も最適化問題の解に反映されておりませんでした。 次にif pulp.value(x[1][j])==0に変更し実行したところ同様の結果となりました。 一方で、if pulp.value(x[1][j])==Noneに変更したところ、if pulp.value(x[1][j])==Noneを外した時と同様の正しい結果が出力されました。 実行後、Python shellにproblemと入力したところ、先程と異なり、以下の式のような式が記載されていました。(恐れ入りますが、以下は実際のものを真似て記載したイメージです。) x_1_0 + x_1_2 + x_1_3 <= 4 このことからも最適化問題を解くプログラム“problem.solve()”を実行完了するまではpulp.value(x[1][j])にはNoneが入ることがわかります。 最後になりますが、pulp.value(x)はドキュメントによると【Returns the value of the variable/expression x, or x if it is a number.】とのことなので、“problem.solve()”を実行完了してない時点ではNoneなのかもしれません。 参考(Pulp classes — PuLP v1.4.6 documentation - COIN-OR):https://www.coin-or.org/PuLP/pulp.html 長文を失礼致しました。
guest

回答1

0

自己解決

私の別の質問投稿ページの回答に基づいて、本質問を回答することができました。
回答者様に感謝申し上げます。
参考にした質問投稿ページのリンクを以下に貼らせていただきます。

URL: https://teratail.com/questions/367902

別の質問投稿ページの回答に基づいて作成した回答(本質問の制約式(画像)のプログラム)は以下の通りです。

image

1problem += M*y_i >= Σx_ij 2problem += y_i <= Σx_ij

exam

1problem += M * y[1] - (x[1][0] + x[1][2] + x[1][3]) >= 0 2problem += y[1] - (x[1][0] + x[1][2] + x[1][3]) <= 0

ここで、Mは十分に大きな値です。
今回3つのxの要素を総和することからM=3で問題ないのかと思います。

何かありましたらご意見いただけますと幸いです。

投稿2021/11/11 05:17

編集2021/11/11 05:27
robocat

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問