Ich arbeite derzeit an einem Problem, das eine Variation des Fach Verpackung Problem erfordert. Mein Problem ist, dass die Anzahl der Bins endlich ist. Ich habe drei Behälter, der kleinste kostet am wenigsten, einen Gegenstand hineinzulegen, der mittlere Behälter ist etwas teurer als der kleine Behälter, und der dritte Behälter hat theoretisch unbegrenzte Kapazität, ist aber unerschwinglich teurer, um einen Gegenstand hineinzustellen.Bin packen Python-Abfrage mit variablen Lagerplatzkosten und Größen
Ich konnte ein Python-Skript online finden, das das Bin-Problem in ähnlicher Weise löst. Meine Frage ist, wie kann ich das Skript umschreiben, um meinem ursprünglichen Problem näher zu kommen? Das fragliche Skript verwendet identische Bins.
Ich habe ein paar Zeilen ganz unten eingefügt, um zu besprechen, wie ich das Fach aussehen würde. Gibt es außerdem eine Möglichkeit, separate Einschränkungen für jeden Bereich einzurichten? Danke für die Hilfe!
from openopt import *
N = 30 #Length of loan dataset
items = []
for i in range(N):
small_vm = {
'name': 'small%d' % i,
'cpu': 2,
'mem': 2048,
'disk': 20,
'n': 1
}
med_vm = {
'name': 'medium%d' % i,
'cpu': 4,
'mem': 4096,
'disk': 40,
'n': 1
}
large_vm = {
'name': 'large%d' % i,
'cpu': 8,
'mem': 8192,
'disk': 80,
'n': 1
}
items.append(small_vm)
items.append(med_vm)
items.append(large_vm)
bins = {
'cpu': 48*4, # 4.0 overcommit with cpu
'mem': 240000,
'disk': 2000,
}
p = BPP(items, bins, goal = 'min')
r = p.solve('glpk', iprint = 0)
print(r.xf)
print(r.values) # per each bin
print "total vms is " + str(len(items))
print "servers used is " + str(len(r.xf))
for i,s in enumerate(r.xf):
print "server " + str(i) + " has " + str(len(s)) + " vms"
##OP Interjection: Ideally my bins would look something like:
bin1 = {
'size': 10000,
'cost': 0.01*item_weight,
}
bin2 = {
'size': 20000,
'cost': 0.02*item_weight,
}
bin3 = {
'size': 100000,
'cost': 0.3*item_weight,
}