06.04.2018, 11:50
Hallo W...,
auch wenn die Daten nur Testdaten sind, halte ich unnötige Mehrkosten von 11% (100.000€ statt 90.000€) für relevant.
Insbesondere da nach meiner Erfahrung in der "Required Volume" meisten schon viele Sicherheitszuschläge eingerechnet sind.
Wenn auch eine VBA-Lösung (UDF= User Defined Function) erlaubt ist, bitte sehr.
Das Programm berechnet die minimalen Kosten aus allen möglichen Kombinationen.
Mit deinem Zahlenbeispiele weicht das optimale Ergebnis nur selten von den Ergebnissen der Formeln ab. Das kann aber bei anderen Zahlen auch sehr häufig sein.
auch wenn die Daten nur Testdaten sind, halte ich unnötige Mehrkosten von 11% (100.000€ statt 90.000€) für relevant.
Insbesondere da nach meiner Erfahrung in der "Required Volume" meisten schon viele Sicherheitszuschläge eingerechnet sind.
Wenn auch eine VBA-Lösung (UDF= User Defined Function) erlaubt ist, bitte sehr.
Das Programm berechnet die minimalen Kosten aus allen möglichen Kombinationen.
Mit deinem Zahlenbeispiele weicht das optimale Ergebnis nur selten von den Ergebnissen der Formeln ab. Das kann aber bei anderen Zahlen auch sehr häufig sein.
Code:
Option Explicit
Dim intAnzT As Integer
Dim intAkt() As Integer
Dim intOpt() As Integer
Dim lngAktWert As Long
Dim lngOptWert As Long
Dim varListe() As Variant
Const intMaxE As Integer = 3
Public Function Minimiere(lngWert As Long, rngListe As Range) As Variant()
Dim intPos As Integer
Dim varArr() As Variant
lngOptWert = 10 ^ 9
varListe = rngListe.Value
intAnzT = UBound(varListe, 1)
ReDim intAkt(1 To intAnzT)
ReDim intOpt(1 To intAnzT)
ReDim varArr(1 To intAnzT)
Call Recursion(1, 1, lngWert)
For intPos = 1 To intAnzT
varArr(intPos) = intOpt(intPos)
'Minimiere = Minimiere & intOpt(intPos) & "; "
Next intPos
Minimiere = varArr
End Function
Sub Recursion(ByVal intEbene As Integer, ByVal intAktTower As Integer, ByVal lngRest As Long)
Dim intPos As Integer
Dim intTower As Integer
Dim intAktAnz As Integer
Dim intAktMax As Integer
For intTower = intAktTower To intAnzT
intAktAnz = 0
intAktMax = Application.RoundUp(lngRest / varListe(intTower, 2), 0)
Do While intAktAnz <= intAktMax
intAktAnz = intAktAnz + 1
lngRest = lngRest - varListe(intTower, 2)
intAkt(intTower) = intAktAnz
lngAktWert = lngAktWert + varListe(intTower, 3)
If lngRest <= 0 Then
If lngAktWert < lngOptWert Then
lngOptWert = lngAktWert
For intPos = 1 To intAnzT
intOpt(intPos) = intAkt(intPos)
Next intPos
End If
Exit Do
Else
If intEbene < intMaxE Then
Call Recursion(intEbene + 1, intTower + 1, lngRest)
End If
End If
Loop
lngRest = lngRest + intAkt(intTower) * varListe(intTower, 2)
lngAktWert = lngAktWert - intAkt(intTower) * varListe(intTower, 3)
intAkt(intTower) = 0
Next intTower
End Sub