Subset-Sum Problem
Ich musste eine Methode entwickeln, um mehrere Sätze von Racks mit einer bestimmten festen Höhe mit einzelnen Einheiten zu füllen, die als MCCs bezeichnet werden. Jede Einheit, die in das Rack ging, hatte eine andere Größe. Ziel war es daher, so wenig Racks wie möglich zu verwenden und die Racks bei gegebener Höhe jeder Einheit optimal zu füllen. Verwenden Sie eine rekursive Funktion, um die optimale Art des Füllens der Racks zu berechnen, während Sie so wenige Racks wie möglich verwenden möglich. Dies ist eine Methode zur Berechnung eines „Teilmengen-Summenproblems“. Ich werde das gesamte Projekt anhängen, das die Einheiten zeichnet, aber die Hauptfunktion ist das, woran ich interessiert war – zu folgen ist die rekursive Funktion und ihre aufzurufende Methode.
Public fR As Boolean Function RealEqual (A, B, optionales Epsilon As Double = 0,00000001)
RealEqual = Abs (A – B) ⇐ Epsilon-Endfunktion Funktion ExtendRslt (CurrRslt, NewVal, Separator)
Wenn CurrRslt = „“, dann ist ExtendRslt = NewVal _ Else ExtendRslt = CurrRslt & Separator & NewVal End Function Subrekursives Match (ByVal MaxSoln als Ganzzahl, ByVal TargetVal, InArr (), _ ByVal HaveRandomNegatives als Boolean, _ ByVal CurrIdx als Ganzzahl, _ValV , 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)
Wenn RealEqual (CurrTotal + InArr (2, I), TargetVal, Epsilon), dann Rslt (UBound (Rslt)) = (CurrTotal + InArr (2, I)) _ & Separator & ExtendRslt (CurrRslt, I, Separator)
fR = True Wenn MaxSoln = 0 Dann Wenn UBound (Rslt) Mod 100 = 0 Dann Debug.Print „Rslt (“ & UBound (Rslt) & „) =“ & Rslt (UBound (Rslt))
Andernfalls ‚Wenn UBound (Rslt)> = MaxSoln, dann Sub beenden, wenn fR = True, dann Sub beenden, wenn ReDim Rslt (UBound (Rslt) + 1) beibehalten
ElseIf IIf (HaveRandomNegatives, False, CurrTotal + InArr (2, I)> TargetVal + Epsilon) Dann ElseIf CurrIdx <UBound (InArr, 2) Dann recursiveMatch MaxSoln, TargetVal, InArr (), HaveRandomNegatives, _ I + 1, _ CurrTotal + InArr (2, I), Epsilon, Rslt (), _ ExtendRslt (CurrRslt, I, Separator), _ Separator Wenn MaxSoln <> 0 Dann Wenn fR = True, dann Sub beenden Sonst ‚keine Übereinstimmungen End If Next I End Sub Called by recursiveMatch MaxSoln, TargetVal, InArr, HaveRandomNegatives, _ LBound (InArr), 0, 0,00000001, _ Rslt, „“, „,“