线性规划--单纯形法

刚开始学单纯形法的时候觉得它也太复杂了8,什么基变换啊,什么迭代啊。。。完全不知所云,后来看了几遍后才渐渐对它的原理与计算方法有了更深入的理解,关于单纯形法的理解建议参考简单易懂的单纯形法理解文中虽然有些小错误,但不影响读者对内容的理解,需要注意的一点是,文中的换入变量仅仅根据价值系数来确定,这一点是不对的。

简而言之,单纯形法就是先找出一个基本可行解,对它进行鉴别,看是否是最优解;若不是,则按照一定法则转换到另一改进后更优的基本可行解,再鉴别;若仍不是,则再转换,按此重复进行。其实只要理解了它的原理,单纯形法也没那么复杂。

这里的单纯形法仅能解决目标函数求最大值,约束条件为<=的情况,若要求解别的约束类型的线性规划问题,建议参考我的另一篇博客线性规划–大M法,同时,博主这里没有加上对无可行解与无穷多最优解的判断,有兴趣的小伙伴可以自己去试试。

import numpy as np

#单纯形法
# max Z = 2X1 + 3X2
# X1 + 2X2 <= 8
# 4X1 + 0X2 <= 16
# 0X1 + 4X2 <= 12
# X1 , X2 > 0

z = [2,3]
b = [[1,2,8],[4,0,16],[0,4,12]]
length = len(z)
z += [0 for i in range(len(b))]
m = np.zeros((1 + len(b),length + len(b) + 1))
m[0] = z + [0]
for i in range(len(b)):
    a = [0 for j in range(len(b))]
    a[i] = 1
    m[i+1] = b[i][:-1] + a + [b[i][-1]]

cb = [0,0,0]
xb = [i + length + 1 for i in range(len(b))]
cMinusZ = []

judge = False
infinite = True
while not judge:
    for i in range(m.shape[1] - 1):
        cz = 0
        for j in range(m.shape[0] - 1):
            cz += m[j + 1][i] * cb[j]
        cMinusZ.append(m[0][i] - cz)
    if max(cMinusZ) <= 0:
        judge = True
        break
    else:
        Xin = cMinusZ.index(max(cMinusZ))            #换入变量
        minVal = float("inf")
        for i in range(m.shape[0] - 1):
            if m[i + 1][Xin] != 0:
                infinite = False
                if m[i + 1][-1] / m[i + 1][Xin] < minVal and m[i + 1][-1] / m[i + 1][Xin] > 0:
                    minVal = m[i + 1][-1]/m[i + 1][Xin]
                    Xout = i + 1                       #换出变量
        if infinite is True:
            print("问题无界")
            exit()
        m[Xout] = m[Xout] / m[Xout][Xin]
        for i in range(m.shape[0]):
            if i != Xout and m[i][Xin] != 0:
                m[i] -= m[Xout] * m[i][Xin]
        cb[Xout - 1] = m[0][Xin]
        xb[Xout - 1] = Xin + 1
    cMinusZ = []
solution = [0 for i in range(m.shape[1] - 1)]
for i in range(len(xb)):
    solution[xb[i] - 1] = m[i + 1][-1]

print("最优解:" + str(solution))
print("目标函数最大值:" + str(z[0] * solution[0] + z[1] * solution[1]))

你可能感兴趣的:(线性规划--单纯形法)