年間売上目標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を使ってみましたが、そもそもこのような状況に数理最適化を用いるべきか、から悩んでいます。
また、今回の手法で解決できる場合、上記のように試したのですが、負の値がでてしまう、
また、条件を満たす全てのパターンを算出できないことで困っています。
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)
複数の解をすべて列挙したいような使い方には、あまり向いていないんじゃないかと思います。
1つの解が出たら、それが解にならないような制約を追加して解きなおす、ということを繰り返すとかしたら、できるのかもしれません。
単純にfor文を使って考えるならx4を一旦消去、x1+x2+x3<200(無料会員0はありえないと思うので)の制約に変更、x3を0<x3<125の範囲でそれぞれ計算させてリストに格納させればいけそう。
手動でもいいならx3を定数とする二次元グラフに展開できるので
desmosでグラフ展開するという手もあります。
https://www.desmos.com/calculator?lang=ja
x3>=125は解無しなので計算不要です
回答1件
あなたの回答
tips
プレビュー