Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1180to1184
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Optimierung und Ausgabe der besten Lösung

Optimierung und Ausgabe der besten Lösung
Christian
Hallo alle zusammen,
ich benötige Eure Hilfe bei folgendem Sachverhalt:
Ich benötige die Berechnung und Ausgabe von 15 Mitarbeitern (aus einer Auswahl von 21 Mitarbeitern) unter Berücksichtigung von vier weiteren Bedingungen.
1. - 3.: Je 5 Controller, Personalentwickler und Juristen
4. Die Gesamtkosten dürfen 950.000,00 € nicht übersteigen
Das Ziel ist die höchste Produktivität unter Berücksichtigung der Bedingungen.
Ich habe das ganze mal grafisch in der nachfolgenden Tabelle festgehalten.
https://www.herber.de/bbs/user/72020.xlsx
Kann Excel mir diese Auswertung überhaupt liefern oder muss ich dafür auf ein anderes Tool zurückgreifen?

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Optimierung und Ausgabe der besten Lösung
23.10.2010 13:16:16
{Boris}
Hi Christian,
das klingt wie eine klassische Aufgabe für den Solver - dachte ich zumindest, denn
a) entweder ist er dazu nicht in der Lage oder
b) ich bin zu blöd, ihn richtig einzustellen
Daher würde ich auf ein reines iteratives Formelmodell ausweichen und mit "Trial and Error" Stück für Stück nach einer Optimierung suchen (also quasi der "Formel-Solver" ;-) ).
Falls Du das selbst nicht hinbekommst, bastel ich Dir gerne was - vorher nur die Frage: Ist die Beispielmappe Dein Endmodell oder nur ein Ausschnitt?
Grüße Boris
AW: Optimierung und Ausgabe der besten Lösung
23.10.2010 14:41:31
{Boris}
Hi Christian,
hab mal schnell ne kleine Mappe fertig gemacht.
Denk dran, die Iteration zu aktivieren (steht aber auch alles in der Mappe).
https://www.herber.de/bbs/user/72021.xlsx
Grüße Boris
Anzeige
AW: Optimierung und Ausgabe der besten Lösung
23.10.2010 15:07:27
Christian
Hallo Boris,
wow, die Tabelle scheint das gesuchte Ergebnis zu liefern. Ich konnte gerade leider nur kurz drauf schauen und beschäftige mich heute Abend noch einmal ausführlich damit.
Kannst Du mir vielleicht noch kurz eine Erläuterung zum Ergebnisprotokoll geben?
Vielen Dank für Deine großartige Unterstützung.
AW: Optimierung und Ausgabe der besten Lösung
23.10.2010 15:19:48
{Boris}
Hi Christian,
Kannst Du mir vielleicht noch kurz eine Erläuterung zum Ergebnisprotokoll geben?
Da gibt´s nicht viel zu erläutern. Sobald ein Ergebnis ermittelt wird, das alle Bedingungen erfüllt, wird die erste Zeile des Protokolls gefüllt - inkl. der absoluten Produktivität, der Anzahl Berechnungen, die bis dahin durchgeführt wurden, den involvierten Mitarbeitern (als Zahl zwischen 1 und 21 für MA1 bis MA21) und auch - neu in der angehängten Datei - die dadurch entstehenden Gesamtkosten.
Weitere Ergebnisse werden darunter nur dann eingetragen, wenn sie eine bessere Produktivität haben.
Weiterhin hab ich Dir noch nen Button eingebaut, damit Du nicht auf der F9-Taste einschläfst ;-)
https://www.herber.de/bbs/user/72022.xlsm
Grüße Boris
Anzeige
Optimierung vs. mathematischer Lösung
23.10.2010 16:04:34
{Boris}
Hi Christian,
Du solltest wissen, dass diese Lösung nicht intelligent ist - will heißen: Es wird auf Teufel komm raus ausprobiert - und wenn dann zufällig ein passendes Ergebnis bei rauskommt, wird es protokolliert.
Die Abstände zwischen den temporären Höchstmarken werden natürlich auch immer größer - und letztlich kannst Du Dir niemals sicher sein, ob das auch wirklich das optimale Ergebnis ist. Das ist halt der Unterschied zwischen einem Optimierungsalgorithmus und einer mathematisch einwandfreien Lösung.
Das ist z.B. ein Ergebnisprotokoll, wo nach 89.602(!) Versuchen noch eine Optimierung gefunden wurde:
Userbild
Das nur noch zu Deiner Info (falls Dich nachher irgendein schlauer Mathematiker aufgrund Deiner Mitarbeiterzusammenstellung anraunzt ;-) ).
Grüße Boris
Anzeige
AW: Optimierung vs. mathematischer Lösung
23.10.2010 22:14:33
Christian
Hallo Boris,
ich habe mich jetzt intensiv mit Deiner Tabelle (aktuelle Version) beschäftigt. Sie funktioniert bei 21 Möglichkeiten einwandfrei.
Aber wenn ich die Tabelle auf ungefähr 300 Auswahlmöglichkeiten erweitern will, dann funktioniert diese Möglichkeit nicht mehr, oder? Da die Wahrscheinlichkeit von 15 Treffern dann zu gering ist, richtig?
Hättest Du dafür eine Alternative?
Noch einmal vielen Dank für Deine Hilfe.
Rucksackproblem?
25.10.2010 11:22:10
Klaus
Hallo Christian und Boris,
bei 21 Mitarbeitern gibt es 2.097.151 Möglichkeiten - das könnte man sogar noch "Brute Force" für alle Möglichkeiten durchlaufen lassen.
Bei 300 Mitarbeitern gibt es circa 2*10^90 Möglichkeiten.
Ich emfinde die Aufgabenstellung allerdings recht ähnlich dem bekannten Rucksackproblem:
http://de.wikipedia.org/wiki/Rucksackproblem
Auch hier geht es darum, für n Objekte (in diesem Fall Mitarbeiter) mit variablem Wert (in diesem Fall Produktivität) eine optimale Lösung zu finden.
Vielleicht kann man einen der hierfür bereits gefundenen Logarithmen ableiten um die Lösung zu finden?
Grüße,
Klaus M.vdT.
Anzeige
AW: Rucksackproblem?
25.10.2010 22:31:27
Christian
Hallo Klaus,
also der Ansatz des Rucksatzproblems hört sich auf jeden Fall ähnlich an,n aber ich sehe keinen Bezug zu den Nebenbedingungen und muss tatsächlich bei der Umsetzung passen. Aber dennoch vielen Dank für den Hinweis.
AW: Rucksackproblem?
26.10.2010 12:29:44
bst
Auch Hallo,
Auch mal ein Versuch. Benötigt für die hier M.E. 21 über 15 = 54264 Möglichkeiten knapp über einer Sekunde.
Bevor Du das mit 300 Mitarbeitern machst solltest Du mal 300 über 15 ausrechnen, das sind denn rund 7,7E+24 Möglichkeiten und die Berechnung dazu (wenn ich mich nicht verrechnet habe) würde 'geschätzte' 4,5E+12 Jahre dauern ;-)
cu, Bernd
--
Option Explicit

Const N As Integer = 21
Const K As Integer = 15

Dim lngCount As Long ' wird eigentlich nicht benötigt ...

Sub main()
    Dim arData As Variant
    Dim ar(1 To N) As Byte
    Dim i As Integer
    Dim dblSum As Double, dblMax As Double
    Dim strResult As String
    Dim t As Single
    
    t = Timer
    lngCount = 0
    arData = Range("A2:D2").Resize(N)
    For i = 1 To UBound(arData)
        Select Case Left(arData(i, 4), 1)
            Case "C": arData(i, 4) = 0
            Case "P": arData(i, 4) = 1
            Case "J": arData(i, 4) = 2
            Case Else: MsgBox "No." & i, vbCritical, "PANIC": Exit Sub
        End Select
    Next
    
    For i = N - K + 1 To N
        ar(i) = 1
    Next
    'Debug.Print myJoin(ar)
    Do
        If CheckConditions(arData, ar) Then
            dblSum = CalcSum(arData, ar)
            If dblSum > dblMax Then
                dblMax = dblSum
                strResult = myJoin(ar)
            End If
        End If
    Loop While CanShift(ar)
    For i = 1 To Len(strResult)
        Cells(i + 1, 5).Value = Mid(strResult, i, 1)
    Next
    MsgBox Format(Timer - t, "##.00 Sekunden"), , lngCount & " Berechnungen"
End Sub

Private Function CheckConditions(arData As Variant, ar() As Byte) As Boolean
    Dim Count(0 To 2) As Integer
    Dim dblSum As Double
    Dim i As Integer
    
    For i = 1 To UBound(ar)
        If ar(i) = 1 Then
            dblSum = dblSum + arData(i, 2)
            Count(arData(i, 4)) = Count(arData(i, 4)) + 1
        End If
    Next
    CheckConditions = (Count(0) = 5 And Count(1) = 5 And Count(2) = 5 And dblSum <= 950000)
End Function

Private Function CalcSum(arData As Variant, ar() As Byte) As Double
    Dim i As Integer
    
    For i = 1 To UBound(ar)
        If ar(i) = 1 Then CalcSum = CalcSum + arData(i, 3)
    Next
End Function

Private Function CanShift(ar() As Byte)
    Dim i As Integer, j As Integer, m As Integer
    
    lngCount = lngCount + 1
    i = 1
    While ar(i) = 1
        i = i + 1
    Wend
    
    j = i + 1
    While ar(j) = 0
        j = j + 1
        If j > UBound(ar) Then Exit Function
    Wend
    
    ar(j - 1) = 1
    ar(j) = 0
    CanShift = True
    If i > 1 And i < j Then
        For m = 1 To i - 1
            If ar(j - 1 - m) = 0 Then
                ar(j - 1 - m) = 1
                ar(m) = 0
            End If
        Next
    End If
    'Debug.Print myJoin(ar)
End Function

Private Function myJoin(ar() As Byte) As String
    Dim i As Integer
    
    For i = 1 To UBound(ar)
        myJoin = myJoin & IIf(ar(i) = 0, "0", "1")
    Next
End Function


Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige