【问题标题】:pulp solve function gives same output纸浆求解功能给出相同的输出
【发布时间】:2019-04-28 06:47:25
【问题描述】:

我为不同日子的膳食生成编写了以下代码,但我每天都吃同样的饭。我想隔天吃“肉”和“素食”食物组。

my dataframe is as follows:

id      name               energy   sugar   Food_Groups
1       4-Grain Flakes      140     58.8    Breakfast
2       Beef Mince, Fried   1443    8.0     Meat
3       Pork                1000    3.0     Meat
4       cake                1200    150     Sweet
5       cheese              1100    140     Sweet
6       Juice               700     85      Drink
7       cabbage             60      13      vegetarian
8       cucumber            10      10      vegetarian
9       eggs                45      30      Breakfast

我正在使用 PuLP 来减少糖分,同时限制卡路里摄入量。

# Create the 'prob' variable to contain the problem data
prob = LpProblem("Simple Diet Problem",LpMinimize)
#create data variables and dictionary
food_items = list(df['name'])
calories = dict(zip(food_items,df['energy']))
sugars = dict(zip(food_items,df['sugar']))

food_vars =LpVariable.dicts("Food",food_items,lowBound=0,cat='Integer')

#Building the LP problem by adding the main objective function.
prob += lpSum([sugars[i]*food_vars[i] for i in food_items])

#adding calorie constraint
prob += lpSum([calories[f] * food_vars[f] for f in food_items]) >= 
1800.0, "CalorieMinimum"
prob += lpSum([calories[f] * food_vars[f] for f in food_items]) <= 
2200.0, "CalorieMaximum"

我循环 prob.solve() 以生成不同日期的菜单

prob.writeLP("SimpleDietProblem.lp")
days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
for i in days:
    print(i)

    prob.solve(PULP_CBC_CMD())
#    print("Status:", LpStatus[prob.status])
    print("Therefore, the optimal balanced diet consists of\n"+"-")
    for v in prob.variables():
        if v.varValue:
            print(v.name , "=", v.varValue)
    print("The total sugar of this balanced diet is: {}\n\n".format(round(value(prob.objective),2)))

我的问题是输出整天都在重复。如何隔天吃“肉”和“素”??

【问题讨论】:

    标签: python optimization mathematical-optimization pulp


    【解决方案1】:

    @Khaned,做你想做的最简单的方法是设置两个问题实例。一个将有肉类选择,另一个将有素食选择。在不同的日子使用每一种。您可以将要运行计划的每周的起始问题交替进行,以获得为期两周的膳食计划。

    您可以像这样设置求解器:

    prob1 = LpProblem("Simple Diet Problem Meat Day",LpMinimize)
    prob2 = LpProblem("Simple Diet Problem Vegetarian Day",LpMinimize)
    #create data variables and dictionary
    day1_df = df[df['Food_Groups'] != 'vegetarian']
    day1_items = list(day1_df['name'])
    day1_calories = dict(zip(day1_items,day1_df['energy']))
    day1_sugars = dict(zip(day1_items,day1_df['sugar']))
    day2_df = df[df['Food_Groups'] != 'Meat']
    day2_items = list(day2_df['name'])
    day2_calories = dict(zip(day2_items,day2_df['energy']))
    day2_sugars = dict(zip(day2_items,day2_df['sugar']))
    # variables
    day1_vars =LpVariable.dicts("Food",day1_items,lowBound=0,cat='Integer')
    day2_vars =LpVariable.dicts("Food",day2_items,lowBound=0,cat='Integer')
    
    #Building the LP problem by adding the main objective function.
    prob1 += lpSum([day1_sugars[i]*day1_vars[i] for i in day1_items])
    prob2 += lpSum([day2_sugars[i]*day2_vars[i] for i in day2_items])
    

    如果您仍然想在所有日子都显示您没有在肉类和素食之间进行选择的选项,您需要创建一个更复杂的模型,其中包含将这些项目的 food_vars 指定为零的约束。

    两个问题各解决一次。

    接下来,将一周中的每一天分配一个列表中的一个问题,例如:

    days = [('Monday', prob1), ('Tuesday', prob2), ...]
    

    然后循环这些天并像以前一样打印变量。

    for day, prob in days:
        print(day)
        print("Therefore, the optimal balanced diet consists of\n"+"-")
        for v in prob.variables():
            if v.varValue:
                print(v.name , "=", v.varValue)
        print("The total sugar of this balanced diet is: {}\n\n".format(round(value(prob.objective),2)))
    

    【讨论】:

    • 如何在你的想法中添加目标函数?
    • 我尝试了代码但它不起作用,我还为 prob1 和 prob2 添加了卡路里限制
    • 结果如何?你在for循环之前解决了prob1和prob2吗?
    • 您的意思是五种不同的选择,与份数无关?你应该把它作为一个不同的问题发布,因为你的原始问题已经得到解决。这是建议网站Operations Research 上的一个好问题。如果您承诺使用该网站,那就太好了,这样它就可以起步了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 2020-08-02
    • 1970-01-01
    • 2017-03-31
    • 2020-05-27
    • 2015-04-22
    • 1970-01-01
    相关资源
    最近更新 更多