在数学中,线性规划(Linear Programming,简称LP)特指目标函数和约束条件皆为线性的最优化问题。线性规划是最优化问题中的一个重要领域。在作业研究中所面临的许多实际问题都可以用线性规划来处理,特别是某些特殊情况。最简单情况就,解线性方程组。
举个最简单的例子:
工厂生产A和B两种物品,需要原料配比分别是1:2:1和2:1:3.
现有原料是100,40,8。A和B的价格分别是5和10。
请问如何分配原材料才能获益最大?
求解一个线性方程组即可
pip install pulp 即可。那个实际例子来说明:
 
 废话不多说,直接上代码。
 # -*- coding: UTF-8 -*- import pulp import numpy as np  def assignment_problem(matrix_x,matrix_y):     row_matrix_x = len(matrix_x)      col_matrix_x = len(matrix_x[0])       row_matrix_y = len(matrix_x)     col_matrix_y = len(matrix_x[0])          #这里是将变量拉成一条直线,方便求解     flatten = lambda x: [y for l in x for y in flatten(l)] if type(x) is list else [x]           #这是说明了是求最大值:LpMaximize,如果需要求最小值:LpMinimize。     m = pulp.LpProblem('task_name', sense=pulp.LpMaximize)          #这里是mu和v2个决策变量的定义,是个矩阵形式,所以需要使用的dict这个函数,lowBound说明了下界大于等于0,和约束条件6对应     #这里的数据类型默认是浮点型,也可以换成Ingredients,cat=’Ingredients‘就是整数, cat=pulp.LpBinary这是离散型数据就是整数了。     var_mu = pulp.LpVariable.dicts("mu", (range(row_matrix_x), range(col_matrix_x)), lowBound = 0)      var_vi = pulp.LpVariable.dicts("vi", (range(row_matrix_x), range(col_matrix_x)), lowBound = 0)         #这里是6个变量,由于约束条件5中说明了上下届     rho1 = pulp.LpVariable('rho1', lowBound = 0.15, upBound = 0.18)      rho2 = pulp.LpVariable('rho2', lowBound = 0.02, upBound = 0.17)      rho3 = pulp.LpVariable('rho3', lowBound = 0.15, upBound = 0.33)      rho4 = pulp.LpVariable('rho4', lowBound = 0.25, upBound = 0.33)      rho5 = pulp.LpVariable('rho5', lowBound = 0.08, upBound = 0.17)      rho6 = pulp.LpVariable('rho6', lowBound = 0.01, upBound = 0.18)             #对应这求解最大值,即目标。pulp.lpDot相乘操作     m += pulp.lpDot(matrix_y.flatten(), flatten(var_mu))          #对应这约束条件1,pulp.lpSum当成求和用即可。     for j in range(row_matrix_x):         m +=(pulp.lpSum(var_vi[j][i]*matrix_x[j][i] for i in range(col_matrix_x))==1)            #对应这约束条件2,看起来有点长。     for j in range(row_matrix_x):         for k in range(row_matrix_x):              m+=(pulp.lpSum(var_mu[j][i]*matrix_y[k][i] for i in range(col_matrix_x))-pulp.lpSum(var_vi[j][i]*matrix_x[k][i] for i in  range(col_matrix_x))<=0.0)          #对应这约束条件3和4,为了方便就展开来写了。也可以改成上述的for循环。     m += (pulp.lpSum(var_mu[j][0] for j in range(row_matrix_x))==rho1*row_matrix_x)      m += (pulp.lpSum(var_mu[j][1] for j in range(row_matrix_x))==rho2*row_matrix_x)      m += (pulp.lpSum(var_mu[j][2] for j in range(row_matrix_x))==rho3*row_matrix_x)      m += (pulp.lpSum(var_mu[j][3] for j in range(row_matrix_x))==rho4*row_matrix_x)      m += (pulp.lpSum(var_mu[j][4] for j in range(row_matrix_x))==rho5*row_matrix_x)      m += (pulp.lpSum(var_mu[j][5] for j in range(row_matrix_x))==rho6*row_matrix_x)        m += (pulp.lpSum(var_vi[j][0] for j in range(row_matrix_x))==row_matrix_x*rho1*5)     m += (pulp.lpSum(var_vi[j][1] for j in range(row_matrix_x))==row_matrix_x*rho2*5)     m += (pulp.lpSum(var_vi[j][2] for j in range(row_matrix_x))==row_matrix_x*rho3*5)     m += (pulp.lpSum(var_vi[j][3] for j in range(row_matrix_x))==row_matrix_x*rho4*5)     m += (pulp.lpSum(var_vi[j][4] for j in range(row_matrix_x))==row_matrix_x*rho5*5)     m += (pulp.lpSum(var_vi[j][5] for j in range(row_matrix_x))==row_matrix_x*rho6*5)            #求解目标,就这么简单。不用怀疑     m.solve()     #可以打印出来各个约束条件,拆分开的很多,可以注释掉。     print(m)          #把求解的值,取出来的操作。      result_mu=[[pulp.value(var_mu[i][j]) for j in range(col_matrix_x)] for i in range(row_matrix_x)]     result_vi=[[pulp.value(var_vi[i][j]) for j in range(col_matrix_x)] for i in range(row_matrix_x)]     result_rho1=pulp.value(rho1)     result_rho2=pulp.value(rho2)     result_rho3=pulp.value(rho3)     result_rho4=pulp.value(rho4)     result_rho5=pulp.value(rho5)     result_rho6=pulp.value(rho6)       return {'objective':pulp.value(m.objective), 'result_mu':result_mu,'result_vi':result_vi}   #构造数据,我们这里为了方便直接写0,自己进行替换即可。 matrix_x=np.zeros((1008,6)) matrix_y=np.zeros((1008,6)) #输入数据求解,打印结果.   res = assignment_problem(matrix_x,matrix_y)  print('{res["objective"]}') print(res['result_mu'])