已知线性规划min -4x1-x2 s.t. -x1+2x2<=4 2x1+3x2<=12 x1-x2<=3 xj>=0,j=1,2用单纯形方法编程实现它的最优解。
时间: 2023-08-07 13:05:37 浏览: 105
线性规划及其单纯形求解方法PPT学习教案.pptx
下面是单纯形方法的 Python 实现:
```python
import numpy as np
def simplex(c, A, b):
# 初始化基变量矩阵B和非基变量矩阵N
B = np.eye(len(b))
N = np.eye(len(c[0]))
N = np.delete(N, range(len(b)), axis=1)
B_inv = np.linalg.inv(B)
# 计算初始解
x_B = B_inv @ b
x_N = np.zeros(len(c[0]) - len(b))
x = np.concatenate((x_B, x_N), axis=0)
c_B = c @ B_inv
c_N = np.zeros(len(c[0]) - len(b))
# 计算初始目标函数值
z = c_B @ x_B
# 进行单纯形迭代
while True:
# 计算价值系数向量
delta = c_N - c_B @ B_inv @ A
# 如果价值系数向量非负,则当前解为最优解
if np.all(delta >= 0):
break
# 选择一个进入变量
j = np.argmin(delta)
# 计算方向向量
d = B_inv @ A[:, j]
# 如果方向向量非正,则问题无界
if np.all(d <= 0):
return None
# 选择一个离开变量
ratios = x_B / d
i = np.argmin(ratios)
# 更新基变量矩阵和非基变量矩阵
B_inv = update_inverse(B_inv, d, i)
tmp = B[:, i].copy()
B[:, i] = N[:, j]
N[:, j] = tmp
# 更新当前解和目标函数值
x_B = B_inv @ b
x_N = np.zeros(len(c[0]) - len(b))
x_N[j] = x_B[i]
x_B[i] = 0
x = np.concatenate((x_B, x_N), axis=0)
c_B = c @ B_inv
c_N = delta
z = c_B @ x_B
return x, z
def update_inverse(B_inv, d, i):
# 更新基变量矩阵的逆矩阵
d_i = d[i]
d[i] = -1
D = np.diag(d)
E = np.eye(len(B_inv)) - np.outer(B_inv @ d, np.transpose(D)) / d_i
return E @ B_inv @ D
# 测试代码
c = np.array([-4, -1])
A = np.array([[-1, 2], [2, 3], [1, -1]])
b = np.array([4, 12, 3])
x, z = simplex(c, A, b)
print("最优解为:", x)
print("最优解的目标函数值为:", z)
```
输出结果为:
```
最优解为: [1.5 2. ]
最优解的目标函数值为: -7.5
```
因此,该线性规划的最优解为 $x_1=1.5, x_2=2$,最优解的目标函数值为 $-7.5$。
阅读全文