エクセルVBAでのナップザック問題
以下は、私たちはナップザック問題の小さなインスタンスを解決エクセルVBAでプログラムを見ていきます。
定義:、アイテムのセットが与えられる重みと値をそれぞれ、合計値ができるだけ大きくし、総重量が所定の限界よりも小さくなるように、コレクションに含める項目を決定します。
これは、固定サイズのナップザックによって制約されており、最も便利なアイテムとそれを埋める必要があり、誰かが直面している問題からその名の由来します。
例:重み値と限界を有する5つのアイテム与えられます。
Excelでは、この問題は、次のようになります:
1.まず、我々は、名前の制限、重量、価値、全重量と最大値をdouble型の5つの変数を宣言します。
Dim limit As Double, weight As Double, value As Double, totalWeight As Double, maximumValue As Double
2.次に、我々は名前I、J、K、L、MとでInteger型の5つの変数を宣言します。
Dim i, j, k, l, m As Integer
3.私たちは、2つの変数を初期化します。私たちは、セルD6の値を持つ変数の制限を初期化します。私たちは、値0を持つ変数最大値を初期化し
limit = Range("D6").value maximumValue = 0
4.次に、私たちは、それぞれの可能な解決策をご確認ください。私たちは、いずれかの項目(1)を含めるか(0)、それを残すことができます。私たちは、次のループのために5を起動します。各項目のひとつ。
For i = 0 To 1 For j = 0 To 1 For k = 0 To 1 For l = 0 To 1 For m = 0 To 1
5.私たちは、重量と可能な解決策の値を計算します。
weight = 12 i + 2 j + 1 k + 1 l + 4 m value = 4 i + 2 j + 2 k + 1 l + 10 m
値が最大値よりも高く、かつ重量が限界値よりも低い場合6.は、我々は新しい、より良い解決策を見つけただけです。
If value > maximumValue And weight <= limit Then
-
trueの場合、私たちは、最大値に新しい行4の解決策、全重量に対する重量と値を書き込みます。
Range("B4").value = i Range("C4").value = j Range("D4").value = k Range("E4").value = l Range("F4").value = m totalWeight = weight maximumValue = value
-
if文を閉じることを忘れないでください。
End If
9.次ループの場合は5を閉じることを忘れないでください。
Next m Next l Next k Next j Next i
エクセルVBAチェックそれぞれの可能な解決策このように、結果として、最適解が行に表示されますが、我々はそれを残すアイテム、0手段を含む1つの手段を覚え4。
10.最後に、それぞれのセルB6及びB8に最適解の全重量と最大値を書き込みます。
Range("B6").value = totalWeight Range("B8").value = maximumValue
11.テストプログラム。
結果:
結論:それの最適は15の2 + 1 + 1 + 4 = 8 15の限度を超えていない
総重量を有するこの溶液の最大値を有する最後の4つの項目を含むように注:このサイズの任意のナップザック問題を解決することができ重みと値変数を作ることによって(ダウンロード可能なExcelファイルを参照してください)。