Je cherche à maximiser le nombre d'étoiles étant donné un certain budget et une limite maximale sur la combinaison.
Exemple de question:
Avec un budget de 500 euros, ne visitant que le maximum de restaurants autorisés, dîner et collecter le plus d'étoiles possible.
Je cherche à écrire un algorithme efficace, qui pourrait potentiellement traiter 1 million d'instances de restaurant pour un maximum de 10 restaurants.
Remarque, ceci est une publication croisée d'une question que j'ai posée hier: Java: Obtenez la combinaison la plus efficace d'une grande liste d'objets basée sur un champ
La solution ci-dessous attribuera 15 $ par étoile au r8
restaurant, ce qui signifie que lors de la génération de la liste, il la place en premier dans la liste, et avec les 70 $ restants, elle ne peut obtenir que 2 étoiles supplémentaires, soit un total de 4 étoiles. Cependant, s'il était assez intelligent pour sauter le r8
restaurant (même s'il s'agit du meilleur rapport dollar / étoile), ler1
qualité restaurant serait en fait un meilleur choix pour le budget, car il coûte 100 $ et 5 étoiles.
Quelqu'un peut-il aider à tenter de résoudre le problème et à battre la solution actuelle?
import itertools
class Restaurant():
def __init__(self, cost, stars):
self.cost = cost
self.stars = stars
self.ratio = cost / stars
def display(self):
print("Cost: $" + str(self.cost))
print("Stars: " + str(self.stars))
print()
r1 = Restaurant(100, 5)
r2 = Restaurant(140, 3)
r3 = Restaurant(90, 4)
r4 = Restaurant(140, 3)
r5 = Restaurant(120, 4)
r6 = Restaurant(60, 1)
r7 = Restaurant(40, 1)
r8 = Restaurant(30, 2)
r9 = Restaurant(70, 2)
r10 = Restaurant(250, 5)
print()
print("***************")
print("** Unsorted: **")
print("***************")
print()
restaurants = [r1, r2, r3, r4, r5, r6, r7, r8, r9, r10]
for restaurant in restaurants:
print(restaurant.ratio, restaurant.stars)
print()
print("***************")
print("** Sorted: **")
print("***************")
print()
sorted_restaurants = sorted(restaurants, key = lambda x: x.ratio, reverse = True)
for restaurant in sorted_restaurants:
print(restaurant.ratio, restaurant.stars)
print()
print("*********************")
print("** Begin Rucksack: **")
print("*********************")
print()
max = 5
budget = 100
spent = 0
quantity = 0
rucksack = []
for i in itertools.count():
if len(rucksack) >= max or i == len(sorted_restaurants):
break
sorted_restaurants[i].display()
if sorted_restaurants[i].cost + spent <= budget:
spent = spent + sorted_restaurants[i].cost
rucksack.append(sorted_restaurants[i])
print("Total Cost: $" + str(sum([x.cost for x in rucksack])))
print("Total Stars: " + str(sum([x.stars for x in rucksack])))
print()
print("*****************")
print("** Final List: **")
print("*****************")
print()
for restaurant in rucksack:
restaurant.display()
budget
= poids maximum du sac à dos en kg, max
= nombre d'articles que le sac à dos peut contenir, stars
= une certaine valeur sur l'article et cost
= poids de l'article en kg
r8
restaurant, ce qui signifie que lors de la génération de la liste, il le met en premier, et avec les 70 $ restants, il ne peut obtenir que 2 étoiles supplémentaires. Cependant, s'il était assez intelligent pour ignorer cela (même s'il s'agit du meilleur ratio dollar par étoile, le r1
restaurant serait en fait un meilleur choix pour le budget, car il coûte 100 $ et 5 étoiles