Je travaille actuellement sur un problème qui nécessite une variation du problème d'emballage des bacs. Mon problème est différent en ce que le nombre de bacs est fini. J'ai trois bacs, le plus petit coûte le moins cher de mettre un objet, le bac moyen est un peu plus cher que la petite boîte, et la troisième boîte a théoriquement une capacité illimitée, mais il est prohibitivement plus cher de placer un objet.Requête Python pour l'empaquetage avec le coût et les tailles des bacs variables
J'ai été en mesure de trouver un script Python en ligne qui résout le problème bin de la même manière. Ma question est comment puis-je réécrire le script pour se rapprocher de mon problème d'origine? Le script en question utilise des bacs identiques.
J'ai inclus quelques lignes tout en bas pour discuter de la façon dont je préférerais que la poubelle soit regardée. De plus, existe-t-il un moyen de définir des contraintes distinctes pour chaque bac? Merci pour votre aide!
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,
}