两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】

目录

本文内容:用 Excel 和 python 编程完成线性规划问题的求解。

一、问题描述

  • 现有5个广告投放渠道:日间电视、夜间电视、网络媒体、平面媒体、户外广告。
  • 每个渠道的效果、广告费用、限制数据如下表:
广告渠道 触达用户数(人/次) 广告费用(元/次) 最高使用次数 咨询电话量(通/次) 各媒体使用次数
日间电视 2000 1000 14 600 x 1 x_1 x1​
夜间电视 4000 2000 8 800 x 2 x_2 x2​
网络媒体 3000 400 40 500 x 3 x_3 x3​
平面媒体 5000 1000 5 400 x 4 x_4 x4​
户外广告 600 100 50 300 x 5 x_5 x5​
  • 设日间电视、夜间电视、网络媒体、平面媒体、户外广告的使用次数依次为 x 1 x_1 x1​、 x 2 x_2 x2​、 x 3 x_3 x3​、 x 4 x_4 x4​、 x 5 x_5 x5​,咨询电话量为 L L L,则 5 种谋体资源配置的三要素如下:
  • (1)决策变量: x 1 x_1 x1​、 x 2 x_2 x2​、 x 3 x_3 x3​、 x 4 x_4 x4​、 x 5 x_5 x5​;
  • (2)目标函数(st):咨询电话量 L = 600 x 1 + 800 x 2 + 500 x 3 + 400 x 4 + 300 x 5 L=600x_1+800x_2+500x_3+400x_4+300x_5 L=600x1​+800x2​+500x3​+400x4​+300x5​最大化;
  • (3)所满足的约束条件:
    • 电视广告费用不超过 3 万元: 1000 x 1 + 2000 x 2 ≤ 30000 1000x_1+2000x_2≤30000 1000x1​+2000x2​≤30000
    • 电视广告次数至少进行 20 次: x 1 + x 2 ≥ 20 x_1+x_2≥20 x1​+x2​≥20
    • 广告总费用不超过 4 万元: 1000 x 1 + 2000 x 2 + 400 x 3 + 1000 x 4 + 100 x 5 ≤ 40000 1000x_1+2000x_2+400x_3+1000x_4+100x_5≤40000 1000x1​+2000x2​+400x3​+1000x4​+100x5​≤40000
    • 被告知人数至少 10 万人: 2000 x 1 + 4000 x 2 + 3000 x 3 + 5000 x 4 + 600 x 5 ≥ 100000 2000x_1+4000x_2+3000x_3+5000x_4+600x_5≥100000 2000x1​+4000x2​+3000x3​+5000x4​+600x5​≥100000
    • 各媒体使用次数不超过次数限量: x 1 ≤ 14 x_1≤14 x1​≤14; x 2 ≤ 8 x_2≤8 x2​≤8; x 3 ≤ 40 x_3≤40 x3​≤40; x 4 ≤ 5 x_4≤5 x4​≤5; x 5 ≤ 50 x_5≤50 x5​≤50
    • 各媒体使用次数均为正整数。

二、法一:Excel 线性规划

  • 首先使用 Excel 2016 建立一个数据表:
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】

设置目标函数:

  • 根据上面分析,目标函数为:E2:E6与F2:F6区域的乘积。
  • 在 C10 单元格内输入:=SUMPRODUCT(E2:E6,F2:F6)
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】
  • 输入完毕后,值为 0 ,因为 F 那一列值为空,这里我在前面备注了一下。
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】

设置约束条件:

  • 将第一部分所写的约束条件表达式设置在 Excel 中。
  • 在 C15:C18 单元格内依次输入公式:
    • C15:=SUMPRODUCT(C2:C3,F2:F3)
    • C16:=F2+F3
    • C17:=SUMPRODUCT(C2:C6,F2:F6)
    • C18:=SUMPRODUCT(B2:B3,F2:F6)
  • 输入完毕后均为 0 。
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】

加载 Excel 的规划求解模块:

  • 选择【文件】→【选项】→【加载项】→【转到】,勾选【规划求解加载项(Solver add-in)】,再点击【确定】按钮,就出现了规划求解模块。
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】

在 Excel 规划求解模块中设置决策变量和目标函数:

  • 打开规划求解。
  • 修改以下两个值:
    (1)设置目标:输出结果区域;
    (2)通过更改可变单元格:也就是之前数据表空白的地方。
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】
    设置约束条件:
  • 点击【添加】按钮,分别设置 6 个约束条件。
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】
  • 约束条件 1——电视广告费用不超过 3 万元: 1000 x 1 + 2000 x 2 ≤ 30000 1000x_1+2000x_2≤30000 1000x1​+2000x2​≤30000
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】
  • 约束条件 2——电视广告次数至少进行 20 次: x 1 + x 2 ≥ 20 x_1+x_2≥20 x1​+x2​≥20
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】
  • 约束条件 3——广告总费用不超过 4 万元: 1000 x 1 + 2000 x 2 + 400 x 3 + 1000 x 4 + 100 x 5 ≤ 40000 1000x_1+2000x_2+400x_3+1000x_4+100x_5≤40000 1000x1​+2000x2​+400x3​+1000x4​+100x5​≤40000
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】
  • 约束条件 4——被告知人数至少 10 万人: 2000 x 1 + 4000 x 2 + 3000 x 3 + 5000 x 4 + 600 x 5 ≥ 100000 2000x_1+4000x_2+3000x_3+5000x_4+600x_5≥100000 2000x1​+4000x2​+3000x3​+5000x4​+600x5​≥100000
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】
  • 约束条件 5——各媒体使用次数不超过次数限量: x 1 ≤ 14 x_1≤14 x1​≤14; x 2 ≤ 8 x_2≤8 x2​≤8; x 3 ≤ 40 x_3≤40 x3​≤40; x 4 ≤ 5 x_4≤5 x4​≤5; x 5 ≤ 50 x_5≤50 x5​≤50
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】
  • 约束条件 6——各媒体使用次数均为正整数
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】

求解问题:

  • 约束条件设置完毕后,设置【单纯线性规划】,然后点击【求解】。
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】
  • 点击【确定】。
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】
  • 结果如下:
    两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】

三、法二:python 编程线性规划

  • scipy 库中线性规划求解函数的说明:
    函数原型
scipy.optimize.linprog(c,
A_ub=None,
b_ub=None,
A_eq=None,
b_eq=None,
bounds=None,
method=‘interior_point’,
callback=None,
options=None,x0=None)​

使用 Jupter 编写代码:

# 导入包
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)

两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】

  • 一样的可以得到结果。

四、总结

  • Excel 在数据处理方面是一个强大的工具,而 python 在处理数据方面是一个很强大的编程语言,针对大数据处理,用着两种方式都可以做线性规划。

五、参考资料

[1] 线性规划问题的求解——Excel和python编程

上一篇:美容怎么做副业?做美容还能做哪些副业?


下一篇:BZOJ3509-FFT,分块