[[20131219085716]] 『指定の数字になる数の組み合わせを探す方法』(初心者) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『指定の数字になる数の組み合わせを探す方法』(初心者)

 ある範囲にある数字の組み合わせが希望の数字になるようにする方法がありました
 ら教えてください。
 例えば

 A1〜A50のセルに任意の数字がそれぞれ入力されており、その組み合わせ
 により希望の数字になる組み合わせを検索出来る計算式があれば助かります。

 よろしくお願いします。

< 使用 Excel:Excel2010、使用 OS:unknown >


[[20120308214011]]

 以前こんな投稿をしたことがありました、VBAです。よく似ていると思います。

 後は、ソルバー(アドインソフト Excelに標準に付いています)使うと
 できるらしいですよ!!

(ichinose) 2013/12/19(木) 09:10


それぞれのセルを使うか使わないか、組み合わせ数は、
2^50 = 1,125,899,906,842,624 通り。

答えは複数あり得るので、Excelが50個の数字の足し算を、この回数行うだけの時間が必要。
試しに、単純計算で2,147,483,647 * 1000回ループさせるだけのサンプルを作ってみる。

 1,125,899,906,842,624 50個の組み合わせ
   2,147,483,647,000 Long型の上限 * 1000

サンプルが完了する時間の500倍くらいかかる事になる。まぁ、完走できるとは思えないので、
途中でESCキーで中断すること。

 Sub test()
    Dim i As Long
    Dim J As Long
    Dim k As Long
    Dim iAll As Long

    For k = 0 To 2147483647
        For J = 0 To 999
            iAll = 0
            For i = 1 To 50
                iAll = iAll + i
            Next i
        Next J
        Application.StatusBar = k
    Next k
End Sub

50個の組み合わせの総当りを計算するのは無謀ということが、わかってもらえると思う。
Excelではなく、C言語等ならもっとマシにはなるが。

そこで、お薦めしたいのは、どれを足し算するかをランダムで決める案。
何万回も試せば、たまたま目的の値になる場合も何回かでてくるので、答えが1つでも
判れば良い場合には便利かと思う。
(???) 2013/12/19(木) 09:50


 私は、あまりソルバーというアドインを使いませんが、これを使ってみました。

 まず、A1からA50にデータを作ります。

 次にB1:B50にすべて0を入力してください。

 C1に =a1*b1   という数式を入力します。C50までフィル操作で数式を入力します。

 D1には =sum(c1:c50)  という数式を入力します。

 これでシートの準備はOKです。

 次にソルバーを使えるようにしましょう。

 まず、以下の手順で開発タブを表示させなくてはなりません。
http://office.microsoft.com/ja-jp/excel-help/HA101819080.aspx 現在参照不可

 ↑ここの手順で開発タブを表示させてください。
 既に表示されていれば、この操作は要りません。

 開発タブ をクリックしてください。

 アドインボタンをクリックし、アドインダイアログを表示させます。

 アドイン一覧の 「ソルバーアドイン」にチェックを入れてOKボタンをクリックします。

 データタブを表示させます。最右端にソルバー というボタンがありますから、クリックしてください。

 ソルバーパラメータダイアログが表示されます。

 目的セルの設定 $D$1  と指定します。
 目標値は 指定値 を選択し、 希望の合計値を指定します(例 10000)

 変数セルの変更  $b$1:$b$50   と指定します。

 制約条件の対象 の設定です
 追加ボタンをクリックします。制約条件の追加 ダイアログが表示されます。

 制約条件を3つ追加します

 1  セル参照  $b$1:$b$50   >=    制約条件  0   これで追加ボタンをクリック

 2  セル参照  $b$1:$b$50   <=    制約条件  1   これで追加ボタンをクリック

 3  セル参照  $b$1:$b$50   int   制約条件  整数(自動で設定される) これで追加ボタンをクリック

 これらの設定が終わったら キャンセルをクリックしてください。

 制約条件の対象に

 $b$1:$b$50   >=  0
 $b$1:$b$50   <=  1
 $b$1:$b$50   =   整数
 (順不同)

 等と表示されていれば OKです。

 解決方法の選択 シンプレックスLP  を選択してください

 これで設定終了です。

 解決ボタンをクリックしてください。

 解があれば、B列が1になっているA列の数字が合計値(例では10000)になる組合せです。

 以上です。

 試してみてください。

( ichinose) 2013/12/19(木) 19:54


 これは部分集合和問題といい、かなり難しい。
 1組の解が分かれば良いならば、Excelソルバーを利用する
 のが最も手っ取り早いと思います。
 ichinoseさんが丁寧にソルバーの利用方法を説明されて
 いるので一度試して見るといいと思う。

 Yahoo!知恵ノートにVBAのサンプルがあります。
 http://note.chiebukuro.yahoo.co.jp/detail/n2390
 これも1組の解を見つけるものですがVBAで解を探すときの
 参考にはなるでしょう。
(varum) 2013/12/19(木) 23:18

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.