• ベストアンサー

数値を足して4000に近づく関数

規格の長さが4000mmの商品があり、注文が来るとその中から切り売りをしています。一度の注文で40~60個程の注文があるのですが、注文の内容はそれぞれ、200mmだったり、2500mmだったり大きさは様々です。一度の注文で受けた全ての数値の中から、より4000mmに近い(できるだけ最後の余りを少なくしたい)組み合わせを探して表示させたいのです。さらに全部で4000mmの規格品が何本必要なのかが知りたいのですが、それらを実行できる関数はあるでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • SortaNerd
  • ベストアンサー率43% (1185/2748)
回答No.6

ナップサック問題と呼ばれるもので、数が増えると急激に計算量が増えてしまうことで有名です。 が、今のコンピュータなら100や200なら総当りで答えは出せると思います。 取り敢えず「ナップサック ソフト」で検索したところ http://hp.vector.co.jp/authors/VA016496/ こんなのが見つかりました。

BJ-0571
質問者

お礼

回答ありがとうございます。 リンク拝見しました。まさに、「これっ!」って感じです。 難しい問題だったんですねぇ・・・。 必要本数は出せるので、やりたい事に近い値が求められそうな関数を 1つづつ入力していくしかないようですね・・・。ありがとうございました。

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

エクセルやアクセスの関数にあるかという質問なら、ありません。 ユーザー関数やアドインソフトやVBなど言語で作るのなら、それは関数というより、アルゴリズムはどういうものになるか、を聞くことになるでしょう。 以下私など門外漢なので間違っているも知れませんが、こういう問題はダイナミックプログラミング(DP)の問題のような気がする。この質問は、長さの解なのですが、他の似た例で、一定の布から、それより狭い色々な長方形を無駄なく切り取りたい場合の長方形の組み合わせ問題などを見たことはあります。 これらの問題は、普通にやると、爆発的な回数の計算が必要なので、効率的な計算のための、アルゴリズムが研究されています。一般的には、ソフトウエア工学の大学院以上の方が研究する課題だと思います。ただ本質問は良くあるニーズなので、その筋では常識化している方法があるのかも知れませんが。 この一般的にアルゴリズムというのは、全世界の理数的素養のある方が、知恵を絞って生み出すものなので、素人にはわからない。 例 この質問の問題ではないが、議論のムードを知るためにhttp://www.neurosci.aist.go.jp/~kurita/thesis/thesis/node34.html さらに、こう言う理論をプログラムに実装するのも難しい。 ついでに言えばそういうレベルでない文系の人の、できる・できないなどは、それなりのものであるということでしょう。 1つの提案は、数理系のカテゴリに質問して見てはどうでしょう。ただ上記の研究者などがOKWAVEを見ていてくれることは、期待できないと思いますが、数学などにくわしいアマチュアでも見ていて、答えてくれれば幸いなわけです。 以上は質問者には具体的には何の役にも立たない文章ですが、ムードがつたわれば、何かの足しになるかと思って。 オーム社 アルゴリズム入門 4章 アルゴリズム構成のパターン

BJ-0571
質問者

お礼

回答ありがとうございます。マクロを組めるとか、そういった問題ではないようですね。まだまだ初心者なので、『コンピュータは何でもできるんだ』と思い込んでいたようです。コンピュータを扱う上で、使用者も沢山の知識を持っていないと使いこなせないのですね。リンク拝見しましたが、恥ずかしながら、???という感じです。関数等が無いとなると、今まで通り人力でやるしかないですね・・・。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 みなさん、お答えになっているようですが、アドインのほうはどうでしょうか? アドインの「ソルバー」がありますね。できれば、VBAからのほうが「ソルバー」を使うと面倒な作業が減るような気がします。  定数   数量(空白)   計算              =A2 * B2              =A3 * B3                ・                ・                ・              =SUM($C$2:C9)               4000              =C11 - C10 などとして、小分け分の定数を入れていき、数量を「ソルバー」で解かせます。目的値の 「=C11 - C10」 が最も小さい値になるように、数量を総当り制で、当たらせるわけです。この場合は、ソルバーよりも、最初からVBAから作ったほうが、ブレがない(初めから数量は整数と決まっている)ので、速いようです。ただ、何10分も行うわけではありませんので、まもなくでるかとは思います。

BJ-0571
質問者

お礼

回答ありがとうございます。アドイン?ソルバー? せっかく見て頂いたのに使用されている言葉の意味がよく分かりません。私の勉強不足です、本当にすみません。

noname#60992
noname#60992
回答No.3

プログラムで組むしかないでしょうが、一番簡単なプログラミングとしてはNo1の方がおっしゃっている総当りを行い、4000mmに一番近くなった数値のものを省いて、また総当りを行い・・・と思いますが、60個(仮に長さが全部違えば)の総当りは8.32E+81とでてきました。 たぶん、普通のコンピュータで処理できるものではないと思います。 いろいろ条件をつけてかなり手を入れないとできないと思います。(逆にあまっているものを管理したほうが、楽なような気はしますが・・・)

BJ-0571
質問者

お礼

回答ありがとうございます。普通のコンピュータでは無理・・・。 が~ん。私は賢くも何ともないのですが、この質問させて頂いた内容が 一応実践出来るということは、人間の頭って柔らかいのですね。 コンピュータには簡単に出来そうに思っても、複雑なプログラムを 組まないといけないのですね。マクロ・・・、ムムム・・・。

回答No.2

切手の種類や枚数から最適な組み合わせ枚数を求める、というフリーソフトがあります。 切手の金額と枚数を長さと受注数に置き換えれば質問者さんのやりたいことができるかもしれません。

参考URL:
http://www.forest.impress.co.jp/article/2004/11/11/okiniiri.html
BJ-0571
質問者

お礼

参考リンクありがとうございます。 ダウンロードしてみましたが、数値を入れ替える(置き換える) には単位が違いすぎて無理なようです・・・。すみません、 ありがとうございました。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

この手の問題に関数は無いでしょう。 最適解を求めるには総当りが必要ですし、ある程度妥協するにしても試行錯誤が必要です。 プログラムを組むしかないでしょう。 もしかするとパッケージソフトがあるかも知れませんが。

BJ-0571
質問者

お礼

回答ありがとうございます。 関数では無理なんですねぇ・・・(T_T) マクロを組まないと無理ということでしょうか。