目录
本文内容:
用 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 建立一个数据表:
设置目标函数:
- 根据上面分析,目标函数为:E2:E6与F2:F6区域的乘积。
- 在 C10 单元格内输入:
=SUMPRODUCT(E2:E6,F2:F6)
- 输入完毕后,值为 0 ,因为 F 那一列值为空,这里我在前面备注了一下。
设置约束条件:
- 将第一部分所写的约束条件表达式设置在 Excel 中。
- 在 C15:C18 单元格内依次输入公式:
- C15:
=SUMPRODUCT(C2:C3,F2:F3)
- C16:
=F2+F3
- C17:
=SUMPRODUCT(C2:C6,F2:F6)
- C18:
=SUMPRODUCT(B2:B3,F2:F6)
- C15:
- 输入完毕后均为 0 。
加载 Excel 的规划求解模块:
- 选择【文件】→【选项】→【加载项】→【转到】,勾选【规划求解加载项(Solver add-in)】,再点击【确定】按钮,就出现了规划求解模块。
在 Excel 规划求解模块中设置决策变量和目标函数:
- 打开规划求解。
- 修改以下两个值:
(1)设置目标:输出结果区域;
(2)通过更改可变单元格:也就是之前数据表空白的地方。
设置约束条件: - 点击【添加】按钮,分别设置 6 个约束条件。
- 约束条件 1——电视广告费用不超过 3 万元:
1000
x
1
+
2000
x
2
≤
30000
1000x_1+2000x_2≤30000
1000x1+2000x2≤30000
- 约束条件 2——电视广告次数至少进行 20 次:
x
1
+
x
2
≥
20
x_1+x_2≥20
x1+x2≥20
- 约束条件 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
- 约束条件 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
- 约束条件 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
- 约束条件 6——各媒体使用次数均为正整数
求解问题:
- 约束条件设置完毕后,设置【单纯线性规划】,然后点击【求解】。
- 点击【确定】。
- 结果如下:
三、法二: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 在数据处理方面是一个强大的工具,而 python 在处理数据方面是一个很强大的编程语言,针对大数据处理,用着两种方式都可以做线性规划。