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

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

新規登録して質問してみよう
ただいま回答率
85.44%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

Q&A

解決済

1回答

522閲覧

数理最適化問題のパターンをすべて算出したい

minami_min

総合スコア3

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

0グッド

0クリップ

投稿2023/03/02 14:26

年間売上目標100万円を超えるためには、各会員が何人いれば達成できるかの、KPIを作成したい。
総会員見込み人数は200人なので、どの会員ランクに何人いれば達成できるのかの最低ラインパターンをすべて算出したいです。
ゴールド会員:10,000円、シルバー会員:4,000円、ブロンズ会員:2,000円、一般会員:0円

該当のソースコード

python

1from pulp import * 2 3m = LpProblem(sense=LpMaximize) 4 5x1 = LpVariable("x1",cat=LpBinary) 6x2 = LpVariable("x2",cat=LpBinary) 7x3 = LpVariable("x3",cat=LpBinary) 8x4 = LpVariable("x4",cat=LpBinary) 9 10#目的関数 11m+= 10000 * x1 + 4000 * x2 + 2000 * x3 + 0 * x4 ==1000000 12 13#条件 14m += x1 + x2 + x3 + x4 == 200 15 16status = m.solve() 17print("Status", LpStatus[status]) 18 19print('x1',x1.value()) 20print('x2',x2.value()) 21print('x3',x3.value()) 22print('x4',x4.value())

python

1Status Infeasible 2x1 1.0 3x2 1.0 4x3 493.0 5x4 -295.0

補足情報(FW/ツールのバージョンなど)

pulpを使ってみましたが、そもそもこのような状況に数理最適化を用いるべきか、から悩んでいます。
また、今回の手法で解決できる場合、上記のように試したのですが、負の値がでてしまう、
また、条件を満たす全てのパターンを算出できないことで困っています。

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

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

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

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

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

melian

2023/03/02 14:45 編集

category は LpInteger で、lowBound に 1 を指定してみてください。 x1 = LpVariable("x1", lowBound = 1, cat=LpInteger) x2 = LpVariable("x2", lowBound = 1, cat=LpInteger) x3 = LpVariable("x3", lowBound = 1, cat=LpInteger) x4 = LpVariable("x4", lowBound = 1, cat=LpInteger)
bsdfan

2023/03/02 14:57

複数の解をすべて列挙したいような使い方には、あまり向いていないんじゃないかと思います。 1つの解が出たら、それが解にならないような制約を追加して解きなおす、ということを繰り返すとかしたら、できるのかもしれません。
pig_vba

2023/03/03 02:14 編集

単純にfor文を使って考えるならx4を一旦消去、x1+x2+x3<200(無料会員0はありえないと思うので)の制約に変更、x3を0<x3<125の範囲でそれぞれ計算させてリストに格納させればいけそう。 手動でもいいならx3を定数とする二次元グラフに展開できるので desmosでグラフ展開するという手もあります。 https://www.desmos.com/calculator?lang=ja x3>=125は解無しなので計算不要です
guest

回答1

0

ベストアンサー

総会員見込み人数は200人なので、どの会員ランクに何人いれば達成できるのかの最低ラインパターンをすべて算出したいです。

問題を正しく把握できていないかもしれませんが、とりあえず単純にループで求めてもよいと思います。

Python

1 2N = 200 3with open('ret.txt', 'w') as f: 4 for g in range(N+1): 5 for s in range(N-g+1): 6 for b in range(N-g-s+1): 7 w = N-g-s-b 8 total = 10000*g + 4000*s + 2000*b 9 if total >= 1000000: 10 f.write(f'{g:3d},{s:3d},{b:3d},{w:3d},{total}\n') 11 12""" 13 34,164, 2, 0,1000000 14 34,165, 0, 1,1000000 15 34,165, 1, 0,1002000 1617199, 0, 0, 1,1990000 18199, 0, 1, 0,1992000 19199, 1, 0, 0,1994000 20200, 0, 0, 0,2000000 21"""

投稿2023/03/03 02:10

can110

総合スコア38286

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問