Somme problème
J’ai dû concevoir une méthode de remplissage de plusieurs ensembles de racks d’une certaine hauteur fixe avec des unités individuelles appelées MCC. Chaque unité qui entrait dans le rack était de taille différente, l’objectif était donc d’utiliser le moins de supports possible et de remplir les supports de manière optimale compte tenu de la hauteur de chaque unité – utilisé une fonction récursive pour calculer la façon optimale de remplir les supports tout en utilisant aussi peu de supports que possible. Il s’agit d’une méthode pour calculer un « problème de somme de sous-ensemble ». Je vais attacher tout le projet qui dessine les unités mais la fonction principale est ce qui m’intéressait – à suivre est la fonction récursive et sa méthode à appeler.
Public fR As Boolean Function RealEqual (A, B, Optional Epsilon As Double = 0.00000001)
RealEqual = Abs (A – B) ⇐ Epsilon End Function Function 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, _ ByTurrVal IntegerI , 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 Si MaxSoln = 0 Alors Si UBound (Rslt) Mod 100 = 0 Alors Debug.Print « Rslt ( » & UBound (Rslt) & « ) = » & Rslt (UBound (Rslt))
Sinon ‘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 / Currotal, _ InArr (2, I), Epsilon, Rslt (), _ ExtendRslt (CurrRslt, I, Separator), _ Separator If MaxSoln <> 0 Then If fR = True Then Exit Sub Else ‘no matches End If Next I End Sub Called by recursiveMatch MaxSoln, TargetVal, InArr, HaveRandomNegatives, _ LBound (InArr), 0, 0.00000001, _ Rslt, « », « , »