サブセット和問題
一定の高さのラックを複数セット、MCCと呼ばれる個別のユニットで満たす方法を設計する必要がありました。ラック内に入る各ユニットのサイズが異なるため、目的は、できるだけ少ないラックを使用し、各ユニットの高さを考慮してラックを最適に充填することでした-再帰関数を使用して、できるだけ少ないラックを使用しながらラックを充填する最適な方法を計算しました可能。これは「部分和問題」を計算する方法です。ユニットを描画するプロジェクト全体を添付しますが、主な関数は私が興味を持っていたものです-従うのは再帰関数とその呼び出しメソッドです。
Public fR As Boolean Function RealEqual(A、B、Optional Epsilon As Double = 0.00000001)
RealEqual = Abs(A-B)⇐イプシロン終了関数関数ExtendRslt(CurrRslt、NewVal、Separator)
If CurrRslt = “” Then ExtendRslt = NewVal _ Else ExtendRslt = CurrRslt&Separator&NewVal End Function Sub recursiveMatch(ByVal MaxSoln As Integer、ByVal TargetVal、InArr()、_ ByVal HaveRandomNegatives As Boolean、_ ByVal Curr 、ByVal Epsilon As Double、_ ByRef Rslt()、ByVal CurrRslt As String、ByVal Separator As String)
Dim I As Integer For I = CurrIdx To UBound(InArr、2)
If RealEqual(CurrTotal + InArr(2、I)、TargetVal、Epsilon)Then Rslt(UBound(Rslt))=(CurrTotal + InArr(2、I))_&Separator&ExtendRslt(CurrRslt、I、Separator)
fR = True If MaxSoln = 0 Then If UBound(Rslt)Mod 100 = 0 Then Debug.Print “Rslt(”&UBound(Rslt)& “)=”&Rslt(UBound(Rslt))
Else’If UBound(Rslt)> = MaxSoln Then Exit Sub If fR = True Then Exit Sub End If ReDim Preserve Rslt(UBound(Rslt)+ 1)
ElseIf IIf(HaveRandomNegatives、False、CurrTotal + InArr(2、I)> TargetVal + Epsilon)Then ElseIf CurrIdx <UBound(InArr、2)Then recursiveMatch MaxSoln、TargetVal、InArr()、HaveRandomNegatives、_ I + 1、_ CurrTotal InArr(2、I)、Epsilon、Rslt()、_ ExtendRslt(CurrRslt、I、Separator)、_ Separator If MaxSoln <> 0 Then If fR = True Then Exit Sub Else ‘一致しないEndIf Next I End Sub Called by recursiveMatch MaxSoln、TargetVal、InArr、HaveRandomNegatives、_ LBound(InArr)、0、0.00000001、_ Rslt、 “”、 “、”