举例一个单纯形法的例题,并附上pyhton代码
时间: 2024-03-23 22:39:29 浏览: 68
下面是一个使用Python实现单纯形法求解线性规划问题的示例:
例题:求解线性规划问题
$$
\begin{aligned}
\max_{x_1, x_2} \quad & 2x_1 + x_2 \\
\text{s.t.} \quad & x_1 + x_2 \leq 10 \\
& 2x_1 + x_2 \leq 16 \\
& x_1, x_2 \geq 0
\end{aligned}
$$
我们可以将问题转化为标准形式:
$$
\begin{aligned}
\max_{x_1, x_2} \quad & 2x_1 + x_2 + 0s_1 + 0s_2 \\
\text{s.t.} \quad & x_1 + x_2 + s_1 = 10 \\
& 2x_1 + x_2 + s_2 = 16 \\
& x_1, x_2, s_1, s_2 \geq 0
\end{aligned}
$$
然后用单纯形法求解,代码如下:
```python
import numpy as np
def simplex(c, A, b):
"""
单纯形法求解线性规划问题
:param c: 目标函数系数向量
:param A: 约束条件系数矩阵
:param b: 约束条件常数向量
:return: 最优解和最优值
"""
m, n = A.shape
# 初始化单纯形表
table = np.zeros((m+1, n+m+1))
table[:-1, :-1] = A
table[:-1, -1] = b
table[-1, :-1] = c
# 引入松弛变量
for i in range(m):
table[i, n+i] = 1
# 入基变量和出基变量的初始值
basis = list(range(n, n+m))
# 迭代求解
while True:
# 找到目标函数系数中的最小值
j = np.argmin(table[-1, :-1])
# 如果最小值大于等于0,则得到最优解
if table[-1, j] >= 0:
break
# 找到离基变量
ratios = table[:-1, -1] / table[:-1, j]
i = np.argmin(ratios)
# 更新单纯形表
table[i, :] /= table[i, j]
for k in range(m+1):
if k != i:
table[k, :] -= table[k, j] * table[i, :]
# 更新基
basis[i] = j
# 计算最优值和最优解
z = -table[-1, -1]
x = np.zeros(n)
for i, b in enumerate(basis):
x[b] = table[i, -1]
return x, z
# 定义线性规划问题
c = np.array([2, 1])
A = np.array([[1, 1], [2, 1]])
b = np.array([10, 16])
# 求解
x, z = simplex(c, A, b)
print("最优解为:", x)
print("最优值为:", z)
```
运行代码,可以得到最优解为 `[6. 4.]`,最优值为 `14.0`。
阅读全文