1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Inferior

Beiträge von Inferior

  • Script zur Ermittlung des passenden Gutscheins

    • Inferior
    • 5. August 2021 um 12:09

    Hallo AspirinJunkie,

    vielen Dank für die Zeit die du dir genommen hast.

    Meine Antwort hat leider ne Weile gedauert.

    Ich musste mir auch erst mal deine Lösung genauer ansehen.

    Nach längerem Überlegen habe ich denke ich alles verstanden.

    Eine sehr clevere Lösung.

    Du hast sogar mit eingebaut, dass er möglichst die Lösung mit den wenigsten Gutscheinen (Anzahl) verwenden soll.

    Das ist das einzige was nicht funktioniert hat.

    Ich meine den Fehler gefunden zu haben:

    Zitat von AspirinJunkie

    If ($nRabatt = $nRabattMax) and ($iRabattMaxN >= UBound($aIndGroup)) Then ContinueLoop

    Zeile 61 müsste meiner Meinung nach heißen: If ($nRabatt = $nRabattMax) and ($iRabattMaxN <= UBound($aIndGroup)) Then ContinueLoop

    Das hat bei mir geholfen.

    Super Forum und klasse für deine Unterstützung!

    Liebe Grüße

    Inferior

  • Script zur Ermittlung des passenden Gutscheins

    • Inferior
    • 23. Juli 2021 um 13:36

    Du hast völlig recht. Jetzt habe ich die Logik komplett verstanden.

    Mein Fehler!

    Die Lösung funktioniert erst mal und es sollte nun immer die beste Kombination rauskommen.

    Wie du schon geschrieben hast, ist es erst mal sozusagen "quick & durty" aber es macht was es soll.

    Vielen lieben Dank dir, du hast mir sehr geholfen.

  • Script zur Ermittlung des passenden Gutscheins

    • Inferior
    • 23. Juli 2021 um 13:17
    Zitat von AspirinJunkie

    Äh doch - über diese Liste iterieren wir ja bei der Ermittlung, welche Kombination die beste ist.

    Ich vermute die Verwirrung kommt daher, dass ich im Array $aGutscheine in der Dimmension 3 (0 bis 4) = Gutscheinart die Zahlen 1 bis 3 angegeben habe. Dort könnte aber auch stehen: "grün, gelb, blau"

    Anders gesagt, diese Zahl soll wiederspiegeln, dass es sich dabei um verschiedene Gutscheinarten handeln kann. Nicht aber, dass Gutschein mit der 3 öfter verwendet werden kann als einer mit einer 1.

    Code
    Global $aGutscheine[][] = [ _ ;[Gutscheinwert in € | Zähler | Rabatt | Gutscheinart | Rabatt in %]
        [500, 0,   40, "grün", 8.00], _
        [100, 0,    8, "grün", 8.00], _
        [ 80, 0,    5, "blau", 6.25], _
        [ 50, 0,    4, "grün", 8.00], _
        [ 44, 0, 2.64, "gelb", 6.00], _
        [ 25, 0,    2, "blau", 8.00], _
        [ 20, 0, 1.20, "gelb", 6.00], _
        [ 10, 0,  0.9, "blau", 9.00], _
        [5.5, 0,  0.5, "blau", 9.09], _
        [  5, 0,  0.3, "gelb", 6.00] ]
    Alles anzeigen
    Zitat von AspirinJunkie

    Doch wird in Betracht gezogen. Dies wird dadurch umgesetzt, dass Gutscheine, welche mehrmals vorliegen auch mehrmals im Array $aScheine vorkommen (bei mir habe ich ja als Anzahl für die Gutscheine die Art eingesetzt). Die anschließende Kombination darauf bringt dann auch Kombis bei welchem Gutscheine mehrmals verwendet werden.
    Gib z.B. mal als Startbetrag 250 ein und du wirst eine Lösung erhalt bei der der 100€-Gutschein 2x verwendet wird.

    Prinzipiell liegen alle Gutscheine in unendlichfacher Anzahl vor. Einziges Nadelöhr ist, dass in Summe nur 3 Gutscheine verwendet werden können. Egal welche Höhe und welche Gutscheinart.

    EDIT:

    Ich habe derweil dieses UDF gefunden, was ich prinzipiell schon sehr gut finde:

    Array combinations
    Anyone know if a function already exists for an output like this? _ArrayCombinations() doesnt quite do this. Thanks. Local $aArray = [A, B, C] #cs A B C AA AB…
    www.autoitscript.com

    Leider sind die Kombinationen im zurückgegebenen Array ohne Trennzeichen.

  • Script zur Ermittlung des passenden Gutscheins

    • Inferior
    • 23. Juli 2021 um 12:32
    Zitat von AspirinJunkie

    Die Anzahl der Gutscheine ist hier ziemlich überschaubar.
    Daher ist es kein Problem einfach alle möglichen Gutscheinkombinationen zu ermitteln und diese einzeln durchzugehen.

    Welche Auswirkung die Art des Gutscheins hat habe ich aus deiner Erläuterung noch nicht verstanden - du wertest sie ja auch nicht in deinem Skript aus.
    Im folgenden Beispielskript habe ich die Art daher frecherweise einfach als Anzahl genommen wie oft der jeweilige Gutschein vorliegt.

    Im Grunde habe ich mal folgendes gemacht: Jeden Gutschein so oft er existiert als Einzelgutschein zum Gutscheinarray hinzugefügt.
    So dass ein Gutschein, welchen man 2x hat auch 2x im Array existiert.
    Dann habe ich von dieser Gutscheinliste alle möglichen Kombinationen (sowohl 1x, 2x, als auch 3x) erstellt.
    Das Ergebnisarray beinhaltet einfach nur die Indizes im Ausgangsarray.

    Dann muss man im Grunde nur noch diese Kombinationen durchgehen und schauen bei welcher Kombi der Rabatt am höchsten ist.

    Zugegeben: Es ist aktuell nur schnell dahingerotzt. Da kann/muss man noch deutlich im Code aufräumen.
    Alternativ könnte man auch die Kombinationserstellung auch direkt (so wie du) in den Berechnungsteil schieben aber da fehlt mir gerade die Zeit da eine clevere Kombinatorik bisschen nachdenken erfordert.
    Eventuell bringt es dich dennoch ein Stück weiter:

    AutoIt
    #include <GUIConstantsEX.au3>
    #include <Array.au3>
    
    Global $aGutscheine[][] = [ _ ;[Gutscheinwert in € | Zähler | Rabatt | Gutscheinart | Rabatt in %]
        [500, 0,   40, 3, 8.00], _
        [100, 0,    8, 3, 8.00], _
        [ 80, 0,    5, 2, 6.25], _
        [ 50, 0,    4, 3, 8.00], _
        [ 44, 0, 2.64, 1, 6.00], _
        [ 25, 0,    2, 2, 8.00], _
        [ 20, 0, 1.20, 1, 6.00], _
        [ 10, 0,  0.9, 2, 9.00], _
        [5.5, 0,  0.5, 2, 9.09], _
        [  5, 0,  0.3, 1, 6.00] ]
    
    ;~ _ArrayDisplay($aGutscheine, "", "", 64, "", "Gutscheinwert in € | Zähler | Rabatt | Gutscheinart | Rabatt in %")
    
    
    #Region Wenn mehrere Gutscheine einer Sorte existieren diese auch einzeln auflisten:
    Local $aScheine = $aGutscheine
    ReDim $aScheine[3 * UBound($aGutscheine)][UBound($aGutscheine, 2)] ; *3 = max, da jeder Gutschein max vorkommen kann
    Local $cAdd = UBound($aGutscheine)
    For $i = 0 To UBound($aGutscheine) - 1
        For $j = 2 To $aGutscheine[$i][3]
            For $k = 0 To UBound($aGutscheine, 2) - 1
                $aScheine[$cAdd][$k] = $aGutscheine[$i][$k]
            Next
            $cAdd += 1
        Next
    Next
    ReDim $aScheine[$cAdd][UBound($aScheine, 2)]
    #EndRegion
    
    #Region Auflistung aller möglichen Kombinationen erstellen:
    Local $aIndizes[UBound($aScheine)]
    For $i = 0 To UBound($aIndizes) - 1
        $aIndizes[$i] = $i
    Next
    Local $aTmp, $aCombinations = $aIndizes
    For $i = 2 To 3
        $aTmp = _ArrayCombinations($aIndizes, $i, "|")
        _ArrayDelete($aTmp, 0)
        _ArrayAdd($aCombinations, $aTmp)
    Next
    
    ;~ _ArrayDisplay($aCombinations)
    #EndRegion
    
    
    $Main = GUICreate("Main", 260, 135)
    
    GUICtrlCreateLabel("Startbetrag:", 10, 13, 110, 18)
    $startbetrag = GUICtrlCreateInput("", 10, 30, 100, 20)
    GUICtrlCreateLabel("Rabatt:", 10, 78, 100, 18)
    $rabatt = GUICtrlCreateInput("", 10, 95, 100, 20)
    GUICtrlCreateLabel("Endbetrag:", 150, 78, 80, 18)
    $endbetrag = GUICtrlCreateInput("", 150, 95, 100, 20)
    
    GUISetState()
    
    While 1
        Switch GUIGetMsg()
            Case $startbetrag
                Local $nZielBetrag = GUICtrlRead($startbetrag), $aIndizes, $nSum, $nRabatt, $nRabattMax = 0, $iRabattMaxIndex = 0, $nBetrag
    
                ; Alle Kombinationen durchgehen und Endbetrag und Rabattsumme berechnen:
                For $i = 0 To UBound($aCombinations) - 1
                    $nBetrag = 0
                    $nRabatt = 0
    
                    $aIndizes = StringSplit($aCombinations[$i], "|", 3)
                    For $j In $aIndizes
                        $nBetrag += $aScheine[$j][0]
                        $nRabatt += $aScheine[$j][2]
                    Next
                    If $nBetrag > $nZielBetrag Then ContinueLoop
    
                    If $nRabatt >= $nRabattMax Then
                        $iRabattMaxIndex = $i ; für später damit man auch anzeigen kann welche Kombi genau fetzt
                        $nRabattMax = $nRabatt
    
                        GUICtrlSetData($endbetrag, $nZielBetrag - $nRabatt)
                        GUICtrlSetData($rabatt, $nRabatt)
    
                    EndIf
                Next
                
                ; Die Gutscheine ausgeben, welche man nehmen soll:
                $sOut = ""
                For $i In StringSplit($aCombinations[$iRabattMaxIndex], "|", 3)
                    $sOut &= $aScheine[$i][0] & "€-Gutschein mit " & $aScheine[$i][2] & "€ Rabatt" & @CRLF
                Next
                MsgBox(0,"", $sOut)
    
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
    WEnd
    Alles anzeigen
    Alles anzeigen

    Hallo AspirinJunkie,

    vielen lieben Dank für deine Ausarbeitung und die Zeit die du dir für mein kleines Projekt genommen hast.

    Ich konnte schon einiges aus deinem Code lernen und er bringt auf alle Fälle einen tollen Ansatz um darauf aufzubauen!

    Die Auflistung aller möglichen Kombinationen ist nicht notwendig. Die Gutscheinart ist nur bei der Ausgabe dann interessant. -> Nehme Gutschein 10€, Gutscheinart 2 = Spezialangebot ABC und bekomme 0,9€ Rabatt.

    Der Abschnitt kann also weggelassen werden.

    Was nun noch fehlt ist folgendes: Die Funktion _ArrayCombinations zieht nicht in Betracht, dass auch die gleichen Gutscheinkombinationen möglich wären:

    0|0

    1|1

    ...

    9|9

    0|0|0

    1|1|1

    ...

    9|9|9

    Ich habe es nicht geschafft das einzubauen, da _ArrayCombinations erst mal eine andere Logik hat.

    Kann man das noch irgendwie ergänzen?

    Vielen lieben Dank vorab.

    Viele Grüße

    Inferior

  • Script zur Ermittlung des passenden Gutscheins

    • Inferior
    • 22. Juli 2021 um 21:16

    Hallo liebe AutiIT Gemeinde,

    wollte mir ein einfaches Script schreiben, dass wie folgt funktionieren soll:

    Es gibt verschiedene Gutscheine mit verschiendenen Beträgen und Rabatten:

    Gutscheinart 1:

    Wert 44€, Rabatt 2,64€ = 6%

    Wert 20€, Rabatt 1,20€ = 6%

    Wert 5€, Rabatt 0,30€ = 6%

    Gutscheinart 2:

    Wert 80€, Rabatt 5,00€ = 6,25%

    Wert 25€, Rabatt 2,00€ = 8%

    Wert 10€, Rabatt 0,90€ = 9%

    Wert 5,5€, Rabatt 0,50€ = 9,09%

    Gutscheinart 3:

    Wert 500€, Rabatt 40,00€ = 8%

    Wert 100€, Rabatt 8,00€ = 8%

    Wert 50€, Rabatt 4,00€ = 8%

    Der Startwert wird eingetragen und es wird ermittelt welche Gutscheine am besten verwendet werden, damit der möglichst höchste Rabatt entsteht. In Summe dürfen aber nur 3 Gutscheine verwendet werden.

    Aktuell arbeitet mein Script so, dass es möglichst den höchsten Gutschein verwendet solange, bis entweder der Startbetrag möglichst ausgefüllt ist oder 3 Gutscheine verwendet werden.

    Nun soll aber auch eine Logik eingebaut werden, die prüft, ob man bspw. 2 x 10 € hernehmen könnte (=9% Rabatt) anstelle eines 20€ Gutscheins (=6% Rabatt)

    Ich bekomme die beiden Welten nicht zusammen, sodass einerseits der Betrag möglichst ausgenutzt wird (hohe Gutscheine) und andererseits möglichst die Gutscheine verwendet werden sollen, die mehr Rabatt geben (niedrige Gutscheine) immer mit max. 3 Gutscheinen in Summe.

    Am Ende wäre es schön, wenn das Script dann nicht nur den Rabatt und den Endbetrag ausspuckt, sondern auch welche Gutscheine in welcher Menge verwendet wurden.

    Ich hoffe ich habe es verständlich erklärt.

    Würde mich freuen, wenn mir hier jemand weiterhelfen könnte.

    Anbei mein Script, ich habe mir dazu bereits einiges an Gedanken gemacht:

    Viele Grüße

    Inferior

    Code
    #include <GUIConstantsEX.au3>
    
    Global $a
    Global $gutscheine[10][5] = _
        [ _ ; [Gutscheinwert in € | Zähler | Rabatt | Gutscheinart | Rabatt in %]
        [500, 0,   40, 3, 8.00], _
        [100, 0,    8, 3, 8.00], _
        [ 80, 0,    5, 2, 6.25], _
        [ 50, 0,    4, 3, 8.00], _
        [ 44, 0, 2.64, 1, 6.00], _
        [ 25, 0,    2, 2, 8.00], _
        [ 20, 0, 1.20, 1, 6.00], _
        [ 10, 0,  0.9, 2, 9.00], _
        [5.5, 0,  0.5, 2, 9.09], _
        [  5, 0,  0.3, 1, 6.00]  _
        ]
    
    $Main = GUICreate("Main", 260, 135)
    
    GUICtrlCreateLabel("Startbetrag:", 10, 13, 110, 18)
    $startbetrag = GUICtrlCreateInput("", 10, 30, 100, 20)
    GUICtrlCreateLabel("Rabatt:", 10, 78, 100, 18)
    $rabatt = GUICtrlCreateInput("", 10, 95, 100, 20)
    GUICtrlCreateLabel("Endbetrag:", 150, 78, 80, 18)
    $endbetrag = GUICtrlCreateInput("", 150, 95, 100, 20)
    
    GUISetState()
    
    While 1
        If GUICtrlRead($startbetrag) <> $a Then
            $a = GUICtrlRead($startbetrag)
    
            $kalk = GUICtrlRead($startbetrag)
            $count = 0
    
            For $i = 0 To UBound($gutscheine)-1
                If $kalk >= $gutscheine[$i][0] And $count < 3 Then
                    $gutscheine[$i][1] = Round($kalk / $gutscheine[$i][0] -0.5, 0)
                    If $gutscheine[$i][1] + $count > 3 Then $gutscheine[$i][1] = 3 - $count
                    GUICtrlSetData($rabatt, GUICtrlRead($rabatt) + $gutscheine[$i][1] * $gutscheine[$i][2])
                    $kalk = $kalk - $gutscheine[$i][1] * $gutscheine[$i][0]
                    $count = $count + $gutscheine[$i][1]
                EndIf
            Next
            GUICtrlSetData($endbetrag, GUICtrlRead($startbetrag) - GUICtrlRead($rabatt))
        EndIf
    
        $Main = GUIGetMsg()
        Switch $Main
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
    WEnd
    Alles anzeigen

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™