Python 在pulp中对字典的一个值应用约束

Python 在pulp中对字典的一个值应用约束,python,machine-learning,data-science,mathematical-optimization,pulp,Python,Machine Learning,Data Science,Mathematical Optimization,Pulp,我需要在我的字典的值部分应用一个约束,我使用纸浆来解决一个优化问题。 我有一个食品数据,其中包含食品项目信息、营养信息和每份/份成本 我的代码运行良好,为我提供了每种食物的份数,并将成本降至最低。我需要对每种食物的数量应用一个过滤器,n是一种特定食物的消费数量 来自纸浆进口* 作为pd进口熊猫 prob=LpProblem(“简单饮食问题”,LpProblem) df=pd.read_excel(“diet-medium.xls”,nrows=17) 食品项目=列表(df[‘食品’) 成本=d

我需要在我的字典的值部分应用一个约束,我使用纸浆来解决一个优化问题。 我有一个食品数据,其中包含食品项目信息、营养信息和每份/份成本

我的代码运行良好,为我提供了每种食物的份数,并将成本降至最低。我需要对每种食物的数量应用一个过滤器,n是一种特定食物的消费数量

来自纸浆进口*
作为pd进口熊猫
prob=LpProblem(“简单饮食问题”,LpProblem)
df=pd.read_excel(“diet-medium.xls”,nrows=17)
食品项目=列表(df[‘食品’)
成本=dict(邮政编码(食品项目,df[‘价格/服务’))
卡路里=dict(zip(食物项目,df[‘卡路里’))
fat=dict(zip(食品项目,df[‘总脂肪(g)’))
碳水化合物=dict(zip(食品项目,df[‘碳水化合物(g)’))
食物变量=LpVariable.dicts(“食物”,食物项,下限=0,cat='Continuous')
prob+=lpSum([成本[i]*食品中i项的食品变量[i])
prob+=lpSum([卡路里[f]*食品中f的食品变量[f])>=800.0
prob+=lpSum([卡路里[f]*食物中的食物变量[f])0:
打印(v.name,“=”,v.varValue)
obj=值(概率目标)
打印(“这种均衡饮食的总成本为:${}”。格式(圆形(obj,2)))

如果我理解正确,您是在询问如何在循环中添加约束,而不是逐个添加约束。如果是这样,一般做法如下:

for f in food_items:
    prob += food_vars[f] <= max_qty[f]
食品中f的

prob+=食物变量[f]您需要执行以下操作:

  • 创建列标题列表-用于创建约束的所有因素:

    factors = []
    for col in data.columns:
        factors.append(col)
    
    for i in factors:
            prob += lpSum([my_dict[i][b] * amountVars[b] for b in food]) >= min_dict[i], ""
            prob += lpSum([my_dict[i][b] * amountVars[b] for b in food]) <= max_dict[i], ""
    
  • 然后,您将创建一个字典字典,其中每个因素都是一个键,其中包含一个嵌套的食品目录和相应的数量

    my_dict = {}
    
    for i,j in enumerate(factors):
        my_dict[j] = {x[0]: x[i+1] for x in data_list}
    
    在这里要小心你的切片;确保您了解哪些列是行名称,而不是数据的开头

  • 用mins和maxes创建一个dict;以下是我的例子:

    constraints = pd.read_excel("diet_large.xls")
    constraints = constraints[7147:7149]
    constraints = constraints.values.tolist()
    mins = constraints[0][1:]
    maxs = constraints[1][1:]
    min_dict = dict(zip(factors, mins))
    max_dict = dict(zip(factors, maxs))
    
  • 最后,您将设置目标函数和约束函数。下面我只是发布了一些限制条件:

    factors = []
    for col in data.columns:
        factors.append(col)
    
    for i in factors:
            prob += lpSum([my_dict[i][b] * amountVars[b] for b in food]) >= min_dict[i], ""
            prob += lpSum([my_dict[i][b] * amountVars[b] for b in food]) <= max_dict[i], ""
    
    对于i in因子:
    prob+=lpSum([my_dict[i][b]*amountVars[b]代表食物中的b])>=min_dict[i],“
    
    prob+=lpSum([my_dict[i][b]*amountVars[b]表示食品中的b])您能否澄清“我需要对每种食品的数量应用一个过滤器,n是特定食品的消费数量。”?我不明白。您的意思是要添加一个约束,即每种食物生产的项目数量必须>=或是..相应的限制..特定食物项目不应增加其存储在my data csv中的最大数量..如果数据数量较少,则更容易应用..通过定义0