Estoy buscando maximizar el número de estrellas dado un cierto presupuesto y un límite máximo en la combinación.
Pregunta de ejemplo:
Con un presupuesto de 500 euros, visitando solo los restaurantes máximos permitidos o menos, cena y recoge la mayor cantidad de estrellas posible.
Estoy buscando escribir un algoritmo eficiente, que potencialmente podría procesar 1 millón de instancias de restaurantes para hasta 10 restaurantes como máximo.
Tenga en cuenta que esta es una publicación cruzada de una pregunta que hice ayer: Java: obtenga la combinación más eficiente de una gran lista de objetos basada en un campo
La solución a continuación asignará 15 $ por estrella al r8
restaurante, lo que significa que al generar la lista, primero la coloca en la lista, y con los 70 $ restantes solo puede obtener 2 estrellas más, lo que da un total de 4 estrellas. Sin embargo, si fuera lo suficientemente inteligente como para saltear el r8
restaurante (a pesar de que es la mejor relación dólar por estrella), el r1
restaurante en realidad sería una mejor opción para el presupuesto, ya que cuesta 100 $ y 5 estrellas.
¿Alguien puede ayudar a intentar el problema y superar la solución actual?
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
= peso máximo de la mochila en kg, max
= número de artículos que la mochila puede contener, stars
= algún valor en el artículo y cost
= peso del artículo en kg
r8
restaurante, lo que significa que al generar la lista, primero la coloca en la lista, y con los 70 $ restantes solo puede obtener 2 estrellas más. Sin embargo, si fuera lo suficientemente inteligente como para omitir eso (a pesar de que es la mejor relación dólar por estrella, el r1
restaurante en realidad sería una mejor opción para el presupuesto, ya que cuesta 100 $ y 5 estrellas