【发布时间】:2021-01-17 18:04:48
【问题描述】:
我在将返回的解决方案正确装箱到 min_cals
menu = [
{'name':'Cheese Pizza Slice', 'calories': 700, 'cost': 4},
{'name':'House Salad', 'calories': 100, 'cost': 8.5},
{'name':'Grilled Shrimp', 'calories': 400, 'cost': 15},
{'name':'Beef Brisket', 'calories': 400, 'cost': 12},
{'name':'Soda', 'calories': 100, 'cost': 1},
{'name':'Cake', 'calories': 300, 'cost': 3},
]
def menu_recommendation(menu, min_cal, max_cal, budget):
menu = [item for item in menu if item['calories'] <= max_cal and item['cost'] <= budget]
if len(menu) == 0: return []
return min((
[item] + menu_recommendation(menu, min_cal - item['calories'], max_cal - item['calories'], budget - item['cost'])
for item in menu
), key=
lambda recommendations: [budget - sum(item['cost'] for item in recommendations) and min_cal <= sum(item['calories'] for item in recommendations) <= max_cal, -sum(item['calories'] for item in recommendations)]
)
recommendation = menu_recommendation(menu, 1000, 1200, 15)
total_cost = sum(item['cost'] for item in recommendation)
total_cals = sum(item['calories'] for item in recommendation)
print(f'recommendation: {recommendation}')
print(f'total cost: {total_cost}')
print(f'total calories: {total_cals}')
例如,以下返回总卡路里数为 700 的解决方案,低于 1000 的最小值。 推荐 = menu_recommendation(menu, 1000, 1200, 15)
【问题讨论】:
-
使用遗传算法
-
您可以使用遗传算法,但如果使用线性目标和线性约束,您最好使用混合整数规划:developers.google.com/optimization/mip/…
-
@DavidEisenstat 感谢您将我指向 google OR-Tools。我不了解此资源,也不知道搜索此类内容所需的语言。干杯:)
-
我不确定,但不能使用knapsack 的变体来解决吗?它使用重量小于
w的第一个i项计算矩阵C[i,w],即可能的最大值。假设卡路里为重量,预算为价值。计算出C后,查找min_cal <= w <= max_cal所在的单元格以找到低于预算的最高值。 -
对我来说,这似乎是一个常见的背包问题,但有两个约束,最好的解决方法是动态规划。我猜这是一些考试/面试问题?请参阅此处了解更多信息en.wikipedia.org/wiki/List_of_knapsack_problems 或更具体地了解这里en.wikipedia.org/wiki/Packing_problems
标签: python algorithm iteration scientific-computing