赞
踩
运筹学是一种科学的决策方法,通常在需要分配稀缺资源的条件下寻求系统的最佳设计和操作。决策的科学方法需要使用一个或多个数学/优化模型(即实际情况的表示)来做出最佳决策。
一个优化模型试图找到值决策变量即优化(最大化或最小化)的目标函数设定为满足给定的决策变量的所有值中的约束。它的三个主要组成部分是:
建模步骤
对运筹学问题进行准确建模代表了最重要,有时也是最困难的任务。错误的模型会导致错误的解决方案,因此无法解决原始问题。应由具有不同专业领域的不同团队成员执行以下步骤,以获得对模型的准确和更深入的了解:
线性规划
线性规划(也称为 LP)是一种运筹学技术,当所有目标和约束都是线性的(在变量中)并且所有决策变量都是连续的时。在层次结构中,线性规划可以被认为是最简单的运筹学技术。
Python 的SciPy库包含用于解决线性规划问题的linprog函数。使用linprog 时,在编写代码时需要考虑两个因素:
线性规划的标准形式如下,
首先,需要最小化式子z,定义为:
z
=
C
X
z=CX
z=CX
其中, C为系数向量,X为待优化参数向量。上式的限制条件可以写为:
A
X
<
=
B
AX<=B
AX<=B
其中,A和B为系数矩阵。
举一个具体的例子:
m
i
n
z
=
10
x
1
+
15
x
2
+
25
x
3
s
.
t
−
1
x
1
−
1
x
2
−
1
x
3
<
=
−
1000
−
1
x
1
+
2
x
2
−
0
x
3
<
=
0
0
x
1
+
0
x
2
−
1
x
3
<
=
−
300
−
1
x
1
<
=
0
−
1
x
2
<
=
0
−
1
x
3
<
=
0
min \, z=10x_1 +15x_2+25x_3 \\s.t \\-1x_1-1x_2-1x_3<=-1000 \\-1x_1+2x_2-0x_3<=0 \\0x_1+0x_2-1x_3<=-300 \\-1x_1<=0 \\-1x_2<=0 \\-1x_3<=0
minz=10x1+15x2+25x3s.t−1x1−1x2−1x3<=−1000−1x1+2x2−0x3<=00x1+0x2−1x3<=−300−1x1<=0−1x2<=0−1x3<=0
如果调用scipy中的linprog函数来解决上诉的线性规划最优化问题,代码如下:
# Import required libraries import numpy as np from scipy.optimize import linprog # Set the inequality constraints matrix # Note: the inequality constraints must be in the form of <= A = np.array([[-1, -1, -1], [-1, 2, 0], [0, 0, -1], [-1, 0, 0], [0, -1, 0], [0, 0, -1]]) # Set the inequality constraints vector b = np.array([-1000, 0, -300, 0, 0, 0]) # Set the coefficients of the linear objective function vector c = np.array([10, 15, 25]) # Solve linear programming problem res = linprog(c, A_ub=A, b_ub=b) # Print results print('Optimal value:', round(res.fun, ndigits=2), '\nx values:', res.x, '\nNumber of iterations performed:', res.nit, '\nStatus:', res.message)
Optimal value: 14500.0
x values: [7.0000000e+02 7.1017063e-09 3.0000000e+02]
Number of iterations performed: 7
Status: Optimization terminated successfully.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。