初めまして。Pythonを用いて最適化を行いたいのですが、普通なら変数を連続変数: x = LpVariable(変数名, lowBound=0)などと指定して解が制約内で帰ってくると思います。しかし今回構造の問題であり使用できる部材の断面積が4つのなかから選択する方式なのですが、変数にこの4つの中から選ぶみたいな指定はできますか?やり方を教えてください。
#pulp
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
PuLPの変数は連続か離散かバイナリの3種類しかないので一工夫が必要です。
部材の断面積を変数にするのではなく、各部材の数を離散変数に置いて、式の中に定数を埋めてみてはいかがでしょうか:
python:
1import pulp 2 3problem = pulp.LpProblem('test', pulp.LpMaximize) 4parts = pulp.LpVariable.dicts('part', ['A','B','C','D'], 0, 20, "Integer") 5problem += parts['A']*4 + parts['B']*9 + parts['C']*16 + parts['D']*25 # 各部材の断面積 6problem += parts['A'] + parts['B'] + parts['C'] + parts['D'] <= 15 7problem.solve() 8print([parts[key].value() for key in ['A','B','C','D']])
追記 面積を返す式をLpAffineExpression で作ってみました。
python
1import pulp 2 3problem = pulp.LpProblem('test', pulp.LpMaximize) 4parts = pulp.LpVariable.dicts('part_X', ['A','B','C','D'], 0, 1, "Binary") 5part_X_area = pulp.LpAffineExpression(zip(parts.values(), [4, 9, 16, 25])) 6part_X_count = pulp.LpAffineExpression(zip(parts.values(), [1, 1, 1, 1])) 7part_X_constraints = pulp.LpConstraint(part_X_count, 0, 'part_X', 1) 8problem += part_X_area 9problem += part_X_constraints
投稿2019/10/20 06:24
編集2019/10/20 08:03総合スコア2493
0
4つの中から選択するなら、数字入力させて1から4で判断するとか
投稿2019/10/20 04:59
編集2019/10/20 05:00総合スコア88038
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/20 07:10
2019/10/20 08:11
2019/10/20 08:16 編集
2019/10/20 08:14
2019/10/20 08:46
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/20 07:04
2019/10/20 08:00
2019/10/20 08:11