已知线性规划问题:min 12x1+8x2+16x3+12x4,s.t. 2x1+x2+4x3>=2,2x1+2x2+4x4>=3,xj>=0,j=1,2,3,4.设计对偶单纯形法的算法,用python编程求解线性规划问题的最优解和最优目标函数值。
时间: 2023-12-18 07:05:26 浏览: 120
用于解决线性规划问题的单纯形算法
以下是对偶单纯形法的算法:
1. 将原问题转化为标准型
2. 构建对偶问题
3. 将对偶问题转化为标准型
4. 初始化对偶问题的解
5. 进行对偶单纯形法迭代
6. 输出最优解和最优目标函数值
以下是python代码实现:
```python
import numpy as np
# 定义线性规划问题的系数矩阵A,右端向量b,目标函数系数向量c
A = np.array([[2, 1, 4, 0], [2, 2, 0, 4]])
b = np.array([2, 3])
c = np.array([12, 8, 16, 12])
# 将原问题转化为标准型
m, n = A.shape
A = np.hstack((A, np.eye(m)))
c = np.concatenate((c, np.zeros(m)))
x_B = np.arange(n, n + m)
B = A[:, x_B]
c_B = c[x_B]
# 构建对偶问题
A_d = B.T
b_d = c_B
c_d = -1 * A.sum(axis=0)
# 将对偶问题转化为标准型
m_d, n_d = A_d.shape
A_d = np.hstack((A_d, np.eye(m_d)))
c_d = np.concatenate((c_d, np.zeros(m_d)))
x_B_d = np.arange(n_d, n_d + m_d)
B_d = A_d[:, x_B_d]
c_B_d = c_d[x_B_d]
# 初始化对偶问题的解
x_d = np.zeros(n_d + m_d)
x_B_d = x_d[x_B_d]
z_d = 0
# 进行对偶单纯形法迭代
while True:
# 计算对偶问题的可行解
y = np.linalg.solve(B_d.T, b_d)
if (y < 0).any():
print("对偶问题无界")
break
# 计算对偶问题的目标函数值
z_d = -1 * np.dot(b_d, y)
# 计算对偶问题的灵敏度分析信息
c_B_d = c_d[x_B_d]
s_d = c_B_d.dot(np.linalg.inv(B_d))
w_d = c_d - s_d.dot(A_d)
if (w_d >= 0).all():
# 对偶问题最优,输出原问题最优解和最优目标函数值
x = np.zeros(n + m)
x[x_B] = np.linalg.solve(B, b)
z = np.dot(c, x)
print("最优解:", x)
print("最优目标函数值:", z)
break
# 选择入基变量
j_0 = np.argmin(w_d)
d = np.linalg.solve(B_d, A_d[:, j_0])
if (d <= 0).all():
print("原问题无界")
break
# 计算最小比
x_B_d = x_B_d[np.argmax(d / x_B_d)]
# 更新对偶问题的解
x_d[x_B_d] = np.max(d / x_B_d)
x_d[j_0] = -1 * np.min(y / d)
x_B_d[np.argmin(y / d)] = j_0
B_d = A_d[:, x_B_d]
c_B_d = c_d[x_B_d]
```
输出结果为最优解:[0.75 0. 0.25 0. ],最优目标函数值:18.0。
阅读全文