运输问题解的最优性检验----python实现对偶变量法

对偶变量法解的最优性检验----python实现

目录

前言

一、对偶变量法

二、代码实现

1.代码实现

总结


前言

这里是针对前一篇博客的初始解的生成后的解的最优性检验,这里的检验方法是对偶变量法。


一、对偶变量法

对偶变量法的原理可以在其他资料得到。其具体的操作步骤为:

1、添加一个行位势、列位势的列;

2、通过解来创建位势方程组,并求解;

3、计算各空值的检验数,若有检验数小于0,则不是最优解,否则已找到最优解。

二、代码实现

1.代码实现

这里的代码逻辑比较简单,主要是需要得到各个行和列的位势。

求解方程组可以使用numpy中的linalg模块。而构建方程组时,需要将简单的方程组扩充。

如u1+v2=4---->1*u1+0*u2+0*u3+0*v1+1*v2+0*v3+0*v4=4,那么序数矩阵就是两个位置为1,其余为0。以此方法得到方程组。

具体的代码如下

X=[[ 0. , 0. ,10. , 6.],
 [ 8. , 0. , 2. , 0.],
 [ 0., 14.,  0. , 8.]]

def check(X):
    u = [0] * (supplyNum + demandNum)  # 初始化位势系数矩阵
    M = []  # 方程组左边矩阵
    N = []  # 方程组右边矩阵
    for i in range(supplyNum):
        for j in range(demandNum):
            if X[i][j] != 0:  # 如果基向量不为0,则可以列入方程组
                u1 = copy.deepcopy(u)
                u1[i] = 1  # 将对应的行位势系数改为1
                u1[supplyNum + j] = 1  # 将对应的列位势系数改为1
                M.append(u1)  # 矩阵叠加
                N.append(c[i][j])
    # 额外添加一个方程组
    u[1] = 1
    M.append(u)
    N.append(0)
    m = np.mat(M)  # 改为矩阵格式
    n = np.mat(N).T  # 改为矩阵格式
    x = solve(m, n)  # 求解
    bestCheck=1
    for i in range(supplyNum):
        for j in range(demandNum):
            if x[i] + x[j + supplyNum] < 0:
                bestCheck=0
                break
        else:
            continue
        break
    return bestCheck

result=check(X)
if result:
    print('是最优解')
else:
    print('不是最优解')


总结

这里是位势法检验的代码,只是给出了检验函数,其他数值需要和前一篇的初始解的生成结合,下一篇就是解的改进,将在下一节给出运输问题表上作业法的完整代码。

你可能感兴趣的:(python,算法)