부분 집합 합 문제
특정 고정 높이의 여러 세트의 랙을 MCC라고하는 개별 장치로 채우는 방법을 설계해야했습니다. 랙에 들어간 각 장치는 크기가 다르기 때문에 가능한 한 적은 수의 랙을 사용하고 각 장치의 높이에 따라 랙을 최적으로 채우는 것이 목표였습니다. 랙을 최대한 적게 사용하면서 랙을 채우는 최적의 방법을 계산하기 위해 반복 함수를 사용했습니다. 가능한. 이것은 “부분 집합 문제”를 계산하는 방법입니다. 단위를 그리는 전체 프로젝트를 첨부 할 것입니다. 그러나 주요 기능은 제가 관심있는 부분입니다. 따라가는 것은 재귀 함수와 호출 할 메서드입니다.
Public fR As Boolean 함수 RealEqual (A, B, Optional Epsilon As Double = 0.00000001)
RealEqual = Abs (A-B) ⇐ Epsilon 끝 함수 함수 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 Integer, _ ByVal CurrIdx As Integer, _ ByVal, _ ByVal , 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 + 1, _ CurrTotal + InArr (2, I), Epsilon, Rslt (), _ ExtendRslt (CurrRslt, I, Separator), _ Separator If MaxSoln <> 0 Then If fR = True Then Exit Sub Else ‘일치하지 않음 End If Next I End Sub Called by recursiveMatch MaxSoln, TargetVal, InArr, HaveRandomNegatives, _ LBound (InArr), 0, 0.00000001, _ Rslt, “”, “,”