[PYTHON] Das Problem der Minimierung von Münzen in der Brieftasche

Einführung

Der äußerste Norden des Problems der Minimierung von Münzen in der Brieftasche ~ Die Person, die 1245 Yen für die Abrechnung von 694 Yen zahlt ~ wurde vor langer Zeit erwähnt, sodass es als lineares Planungsproblem gelöst werden kann. Ich tat. Da Pulp in Python als Modellierungsbibliothek verwendet werden kann, verwenden Sie Pulp. Für diejenigen, die nicht gut in der Verwendung von Zellstoff sind, werde ich den folgenden Artikel verlinken. Einführung in die Lösung linearer Planungsprobleme mit PuLP

Quelle

Bestätigt, dass 1245 Yen für ein Produkt von 694 Yen bezahlt werden. Sie können verstehen, was Sie tun, indem Sie sich die Kommentare in der Quelle unten ansehen. Ich verwende zwei Arten von Variablen, eine Zahlungsvariable und eine Änderungsvariable, aber ich habe festgestellt, dass eine Art von Brieftaschen-Nummernvariable nach der Zahlung tatsächlich ausreicht. Der Formulierungssinn wird in Frage gestellt. Wenn es um große Probleme geht, ist dies tödlich. Auch die Anzahl der Inhalte in der Brieftasche wird nicht durch Münzen und Scheine unterschieden. Es ist besser, das Volumen zu minimieren, nicht die Anzahl der Blätter. [Zusatz] Es gibt Leute, die viel recherchieren. Informationen zum Optimieren von Münzen in Ihrer Brieftasche

MinimizeChange.py


import pulp
import numpy as np
#Art von Geld
money_type = (10000, 5000, 2000, 1000, 500, 100, 50, 10, 5, 1)
#Warenmenge
price = 694
#Der Inhalt der Brieftasche (10.000 von links, 5.000,...)
purse = [1, 1, 1, 1, 0, 4, 0, 4, 1, 3]

#Lassen Sie uns ein Minimierungsproblem erstellen...
problem = pulp.LpProblem('Change Minimization', pulp.LpMinimize)
#Variabel, wie viele Yen-Münzen verwendet werden sollen
pay_var = np.array([pulp.LpVariable('pay_var_'+str(i),0,purse[k]+1,'Integer') for k,i in enumerate(money_type)])
#Variabel, wie viele Yen-Münzen als Wechselgeld zurückgegeben werden
change_var = np.array([pulp.LpVariable('change_var_'+str(i),0,purse[k]+1,'Integer') for k,i in enumerate(money_type)])

'''
Zielfunktion
Anzahl der Scheine und Münzen in der Brieftasche nach dem Auschecken+Anzahl der zu zahlenden Scheine / Münzen* 0.01
Der letzte Abschnitt soll unklare Ergebnisse wie die Zahlung von 10.000 Yen und die Rückerstattung von 10.000 Yen vermeiden.
'''
problem += pulp.lpSum(purse - pay_var + change_var) + pulp.lpSum(pay_var)*0.01

#Das bezahlte Geld muss größer sein als der Produktpreis.
problem += pulp.lpDot(money_type,pay_var) - price >= 0
#Betrag ändern = 10000*10000 Blatt+5000*5000 Blatt+...+1*Muss eine Blattbeschränkung sein
problem += pulp.lpDot(money_type,change_var)  == pulp.lpDot(money_type,pay_var) - price
#Sie können nicht mehr als die Nummer in Ihrer Brieftasche bezahlen
for i,v in enumerate(purse):
    problem += pay_var[i] - purse[i] <= 0
status = problem.solve()

print("Optimale Zahlungsmethode")
for i,v in enumerate(pay_var):
    print("{}Kreis{}Blatt".format(money_type[i],pay_var[i].value()))
print("Anzahl der Änderungen")
for i,v in enumerate(change_var):
    print("{}Kreis{}Blatt".format(money_type[i],change_var[i].value()))

Anwendung

Wenn ich eine Brieftasche habe, in der die Münzen und Scheine gezählt werden können, kann ich den Zahlungsbetrag bei jeder Zahlung empfehlen. Es fühlt sich an, als würde es gegen die Zeit gehen, aber wenn Sie eine solche Brieftasche haben, werde ich sie vorerst kaufen (lacht). Wenn Sie interessiert sind, probieren Sie es aus!

Recommended Posts

Das Problem der Minimierung von Münzen in der Brieftasche
Optimierungsproblem ändern - realistischeres Problem -
Löser Problem Fehler in der Poesie