各种方法求解线性\非线性规划问题

  • 一、线性规划问题求解
  • 1、excel求解广告媒体组合优化问题
  • 2、Python求解广告媒体组合优化问题
  • 二、非线性规划问题求解
  • 1、拉格朗日方法求解椭球的内接长方体的最大体积
  • 三、总结+参考


一、线性规划问题求解

1、excel求解广告媒体组合优化问题
  1. 建立数据源
    在excel中建立下表
  2. 多元非线性函数拟合python_约束条件

  3. 写出资源配置三要素
    设日间电视、夜间电视、网络媒体、平面媒体、户外广告的使用次数以此为x1,x2,x3,x4,x5,x6,咨询电话量为L,则5种媒体资源配置的要素如下:
    ①决策变量:x1,x2,x3,x4,x5,x6
    ②目标函数(s,t):咨询电话量为L=600x1+800x2+500x3+400x4+300x5最大化
    ③所满足的约束条件:
    电视广告费不超过3万元:1000x1+2000x2<=30000;
    电视广告次数至少进行20次:x1+x2>=20;
    广告总费用不超过4万元:1000x1+2000x2+400x3+1000x4+100x5<=40000;
    被告知人数至少10万人:2000x1+4000x2+3000x3+5000x4+600x5>=100000;
    各媒体使用次数不超过次数限量:x1<=14,x2<=8,x3<=40,x4<=5,x5<=50;
    各媒体使用次数均为正整数。
  4. 在excel中设置目标函数
    由前面的分析可知,目标函数为E2:E6与F2:F6区域两列数组对应元素的乘积之和,在C10单元格中输入“=SUMPRODUCT(E2:E6,F2:F6)”
  5. 多元非线性函数拟合python_优化问题_02

  6. 设置约束条件
    将第二步中的约束条件设置在excel中。注意细节,公式有等号,约束对象那列内容与公式一列内容相同,只不过是显示的为0
  7. 多元非线性函数拟合python_优化问题_03

  8. 加载excel规划求解模块
    选择文件->选项->加载项->转到,勾选规划求解加载项,单击确定。
    可以在数据中看到规划求解模块
  9. 多元非线性函数拟合python_优化问题_04

  10. 在求解模块中设置决策变量和目标函数
    点击规划求解参数,在弹出的窗口进行操作
  11. 多元非线性函数拟合python_多元非线性函数拟合python_05

  12. 在添加中根据第2步的约束条件添加。添加内容为上图中 遵守约束 中的7条
  13. 多元非线性函数拟合python_优化问题_06

  14. 结果
    点击求解以后,选择保留规划求解的解,
  15. 多元非线性函数拟合python_优化问题_07

  16. 点击确定后可以看到最优媒体组合,即当日间电视、夜间电视、网络媒体、平面媒体、户外广告5中媒体的使用次数分别为14次、6次、23次、0次、48次时咨询电话量最大,达到39100次
  17. 多元非线性函数拟合python_约束条件_08

2、Python求解广告媒体组合优化问题

根据上面第二步的分析,使用python求解组合优化问题
导入scipy,使用矩阵求解

L=600x1+800x2+500x3+400x4+300x5
x1<=14,x2<=8,x3<=40,x4<=5,x5<=50

多元非线性函数拟合python_线性规划_09

#导入包
from scipy import optimize
import numpy as np
#确定c,A_ub,B_ub
c = np.array([600,800,500,400,300])
A_ub = np.array([[1000,2000,0,0,0],[-1,-1,0,0,0],[1000,2000,400,1000,100],[-2000,-4000,-3000,-5000,-600],[1,0,0,0,0],[0,1,0,0,0],[0,0,1,0,0],[0,0,0,1,0],[0,0,0,0,1]])
B_ub = np.array([30000,-20,40000,-100000,14,8,40,5,50])
#求解
res =optimize.linprog(-c,A_ub,B_ub)
print(res)

得到结果:

多元非线性函数拟合python_多元非线性函数拟合python_10

二、非线性规划问题求解

1、拉格朗日方法求解椭球的内接长方体的最大体积
  1. 拉格朗日乘子法
    在数学最优问题中,拉格朗日乘数法是一种寻找变量受一个或多个条件所限制的多元函数的极值的方法。将一个有n 个变量与k 个约束条件的最优化问题转换为一个有n + k个变量的方程组的极值问题,其变量不受任何约束。这种方法引入了一种新的标量未知数,即拉格朗日乘数:约束方程的梯度(gradient)的线性组合里每个向量的系数。

多元非线性函数拟合python_线性规划_11


①手工求解

这里借鉴别人的手写结果图:

多元非线性函数拟合python_约束条件_12

 

②通过Python求解:

#拉格朗日求解线性规划最大值和最优解
#导入sympy包,用于求导,方程组求解等等
from scipy.optimize import minimize
import numpy as np
e = 1e-10
#目标函数:
fun = lambda x : 8 * (x[0] * x[1] * x[2])
#约束条件,包括等式约束和不等式约束
cons = ({'type': 'eq', 'fun': lambda x: x[0]**2+ x[1]**2+ x[2]**2 - 1}, 
        {'type': 'ineq', 'fun': lambda x: x[0] - e},
        {'type': 'ineq', 'fun': lambda x: x[1] - e},
        {'type': 'ineq', 'fun': lambda x: x[2] - e}
       )
#设置初始值,
x0 = np.array((1, 1, 1))
#求解#
res = minimize(fun, x0, method='SLSQP', constraints=cons)
print('最大值:',res.fun)
print('最优解:',res.x)

多元非线性函数拟合python_多元非线性函数拟合python_13