python下ILP求解工具学习:
使用流程
我们解决线性规划问题一般是通过以下三个步骤。
1.列出约束条件及目标函数2.画出约束条件所表示的可行域3.在可行域内求目标函数的最优解及最优值123 使用pulp工具包,我们只需要做第一步即可,使用pulp提供的API提供目标函数及约束条件就可以直接求解,非常方便。
官网上给出了三个实例,这里采用第一个实例,配料分配的问题,这是一个经典的动态规划问题。
有家公司要生产猫粮,猫粮的配料有chicken, beef, mutton,rice, wheat,gel。它们的成本分别是$0.013, $0.008,$0.010,$0.002, $0.005, $0.001为了满足营养标准,每100g成品必须至少有8gProtein,6gfat,但是不超过2g的fibre以及0.4g的salt。下面是营养成分表。
用pulp解决该问题的代码如下
#-*- coding:utf-8 -*-from pulp import *Ingredients = ['CHICKEN', 'BEEF', 'MUTTON', 'RICE', 'WHEAT', 'GEL']costs = {'CHICKEN': 0.013, 'BEEF': 0.008, 'MUTTON': 0.010, 'RICE': 0.002, 'WHEAT': 0.005, 'GEL': 0.001}proteinPercent = {'CHICKEN': 0.100, 'BEEF': 0.200, 'MUTTON': 0.150, 'RICE': 0.000, 'WHEAT': 0.040, 'GEL': 0.000}fatPercent = {'CHICKEN': 0.080, 'BEEF': 0.100, 'MUTTON': 0.110, 'RICE': 0.010, 'WHEAT': 0.010, 'GEL': 0.000}fibrePercent = {'CHICKEN': 0.001, 'BEEF': 0.005, 'MUTTON': 0.003, 'RICE': 0.100, 'WHEAT': 0.150, 'GEL': 0.000}saltPercent = {'CHICKEN': 0.002, 'BEEF': 0.005, 'MUTTON': 0.007, 'RICE': 0.002, 'WHEAT': 0.008, 'GEL': 0.000}#创建问题实例,求最小极值prob = LpProblem("The Whiskas Problem", LpMinimize)#构建Lp变量字典,变量名以Ingr开头,如Ingr_CHICKEN,下界是0ingredient_vars = LpVariable.dicts("Ingr",Ingredients,0)#添加目标方程prob += lpSum([costs[i]*ingredient_vars[i] for i in Ingredients])#添加约束条件prob += lpSum([ingredient_vars[i] for i in Ingredients]) == 100prob += lpSum([proteinPercent[i] * ingredient_vars[i] for i in Ingredients]) >= 8.0prob += lpSum([fatPercent[i] * ingredient_vars[i] for i in Ingredients]) >= 6.0prob += lpSum([fibrePercent[i] * ingredient_vars[i] for i in Ingredients]) <= 2.0prob += lpSum([saltPercent[i] * ingredient_vars[i] for i in Ingredients]) <= 0.4#求解prob.solve()#查看解的状态print("Status:", LpStatus[prob.status])#查看解for v in prob.variables(): print(v.name, "=", v.varValue)#另外一种查看解的方式# for i in Ingredients:# print(ingredient_vars[i],"=",ingredient_vars[i].value())