匿名質問者

ある条件の数式からもっとも値が少ない組み合わせを計算で出す方法を教えてください。


x + y + z + w + q = 5000
0 <= x, x は500の倍数
0 <= y, y <= 2500
0 <= z, z <= 500, zは100の倍数
0 <= w
q <= 0, -500 <= q

上記条件の答えから
x × 14 + y × 13 + z × 12 + w × 11 + q × (-10)
の答えが一番小さい組み合わせを計算で出したいと思っています。

最終的にはExcelのマクロで計算したいので、
そこまでお願いできればありがたいですが、
計算式だけでも構いません。

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2016/03/03 18:00:03

ベストアンサー

匿名回答1号 No.1

線形計画法ですね

以下のURLの手順で数式と値を入力して
目標値で最小値を選べばすぐに計算できます

http://kogures.com/hitoshi/webtext/or-lp-solver/index.html



補足します

基本的には
目的関数 = x * 14 + y * 13 + z * 12 + w * 11 + q * (-10)
とおいて線形計画法のソルバーを使うだけですが
具体的な手順としては,次のように式の変形,条件の追加が必要です

まず

x + y + z + w + q = 5000 から q = 5000 - (x+y+z+w)
xは500の倍数だから x=(500*A)
zは100の倍数だから z=(100*B)

ということで

目的関数 = (500*A) * 14 + y * 13 + (100*B) * 12 + w * 11 + ( 5000 - ( (500 * A)+y+(100*B) +w) ) * (-10)

と変形しておきます

あとは条件として

Aは整数
0<=A
Bは整数
0<=B, B<=5
0 <= y, y <= 2500
0 <= w
q <= 0, -500 <= q

を入力して
目的関数の最小値を選んで計算します

匿名質問者

ご回答ありがとうございます。Excelにゾルバーを入れて試したところうまくいきました。ありがとうございました。

2016/02/26 16:31:41

その他の回答1件)

匿名回答1号 No.1

ここでベストアンサー

線形計画法ですね

以下のURLの手順で数式と値を入力して
目標値で最小値を選べばすぐに計算できます

http://kogures.com/hitoshi/webtext/or-lp-solver/index.html



補足します

基本的には
目的関数 = x * 14 + y * 13 + z * 12 + w * 11 + q * (-10)
とおいて線形計画法のソルバーを使うだけですが
具体的な手順としては,次のように式の変形,条件の追加が必要です

まず

x + y + z + w + q = 5000 から q = 5000 - (x+y+z+w)
xは500の倍数だから x=(500*A)
zは100の倍数だから z=(100*B)

ということで

目的関数 = (500*A) * 14 + y * 13 + (100*B) * 12 + w * 11 + ( 5000 - ( (500 * A)+y+(100*B) +w) ) * (-10)

と変形しておきます

あとは条件として

Aは整数
0<=A
Bは整数
0<=B, B<=5
0 <= y, y <= 2500
0 <= w
q <= 0, -500 <= q

を入力して
目的関数の最小値を選んで計算します

匿名質問者

ご回答ありがとうございます。Excelにゾルバーを入れて試したところうまくいきました。ありがとうございました。

2016/02/26 16:31:41
匿名回答2号 No.2

「もっとも値が少ない数式」とは、①値が小さい事ですか?、②答え(値)の’かず’がすくない事ですか?
①は値が’0’か’負の絶対値の大きな数’を出す式
②は答えの無い式(0個)
と考えてよいでしょうか

匿名質問者

ご回答ありがとうございます。Excelにゾルバーを入れて試したところうまくいきました。説明不足で申し訳ありません。ありがとうございました。

2016/02/26 16:32:55
  • 匿名回答3号
    匿名回答3号 2016/02/25 23:50:10
    解答だけを手っ取り早く知りたいのでしょうか?(それなら回答者No1さんの方法でよい)

    それとも,こういう問題を解くときの
    解答を導き出すための仕組み,手順,考え方,アルゴリズムを知りたいのでしょうか?
    (それはつまり,線形計画法の手順を解説してほしい,ということになる)

    それとも,こういう問題を解くための
    プログラムのソースコードを自分で実装したい,ということでしょうか?


    なお,質問文にある問題を定式化すると下記のようになります。

    これが定番の言い回し,数学的・工学的に伝わりやすい形式ですね。


    ■最小化問題

    制約条件のもとで,目的関数fを最小化したい。

    fを最小化するような5変数のパラメータを決定せよ。


    ■目的関数

    f(x,y,z,w,q)= 14 x + 13 y + 12 z + 11 w - 10 q


    ■制約条件:
    x + y + z + w + q = 5000
    0 <= x, x は500の倍数
    0 <= y, y <= 2500
    0 <= z, z <= 500, zは100の倍数
    0 <= w
    q <= 0, -500 <= q


    ・・・というふうに書けば,
    あとは最小化問題のロジックや既存のライブラリ(=ソルバ)を
    機械的に当てはめるだけで解が出ますからね。

    目的関数も線形ですし,制約条件も線形ですから。

    ただxとzには,整数であるという条件が付くので,
    線形計画法ではなく,整数計画法になってきますけど。。。
  • 匿名回答4号
    匿名回答4号 2016/02/26 00:33:57
    [0, 0, 0, 5000, 0]
  • 匿名質問者
    匿名質問者 2016/02/26 16:34:19
    ご回答ありがとうございます。Excelにゾルバーを入れて試したところうまくいきました。ありがとうございました。今回はExcelで行いましたが、これをPHPに移植したいと考えていますが、PHPのライブラリーが見つけられません。もしご存じの方がいらっしゃいましたら教えてください。よろしくお願いいたします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません