单纯形算法及对偶的python实现

单纯形算法

使用python编程语言通过矩阵运算编程来实现单纯形算法。

1.建立模型后输入数据列出初始单纯形表

将线性规划问题转化为标准型,求minz转化为求max-z
以下图为例
在这里插入图片描述
初始化

import numpy as np
class Simplex(object):
    #构造函数(初始化函数)
    def __init__(self,z,B,bound):  
        self.X_count=len(z)          #变量个数
        self.b_count=len(bound)      #约束条件个数
        self.z=z                     #目标函数
        self.C=[]                    #检验数
        self.B=B                     #基变量,由于运算规则必须按顺序给出基变量
        self.bound=bound             #约束条件,包括右端常数
        self.flag=0                  #解的类型,0为(暂时)无解,1为唯一最优解,2为无穷多最优解
        self.special=True            #无界解

2.进行最优性检验

计算所有的检验数,若所有的检验数都小于零,结束得到最优解,否则转下步。若检验数大于零而Pk<=0(θ无值可计算),此问题属于无界解,结束,否则转入下一步。

    def Iteration(self):    	
        lim=100		#防止无限迭代
        while(lim>0):
            self.C=[] #检验数清空
            for j in range(self.X_count):     
                zj=0
                for i in range(self.b_count): #遍历第j列全行系数,计算第j个变量检验数
                    zj+=self.bound[i][j]*self.z[self.B[i]]#限制B基变量序号顺序之处
                self.C.append(self.z[j]-zj) #检验数,'cj-zj'
            self.Check() #判断迭代是否结束
            if self.flag>0: #有解,结束迭代
                break

单次迭代后对解的判断方法独立为Check()函数。
无可行解的情况出现在最后仍有人工变量非零,可在两阶段法的第一阶段确定。
特殊情况无界解的判定稍后分析。

    #Check(),检验是否为最优解且最优解是否唯一
    def Check(self):   	
        self.flag=1
        k=0
        for i in range(self.X_count):
            #检验数大于0,非最优解
            if self.C[i]>0:  
                self.flag=0
                break
            if abs(self.C[i])<0.00000001:   #计算存在误差
                k+=1
                #检验数中0的个数大于基变量个数,即存在非基变量检验数为零,则有无穷多最优解
                if k>self.b_count:
                    self.flag=2  

3.确定主元素,进行基变换

通过第二步我们计算出了所有的检验数。
找到最大检验数确定对应的换入变量。按照θ规则θi=min(bi/aik| aik>0) 确定换出变量。即能确定主元素。
在这里由于存在无界解这种特殊情况,该情况出现是因为在非基变量检验数大于0时theta无值可计算,非基变量系数小于零,即无约束。于是在FindMain()设计一个计数器,如果计数达到约束条件的行数,即theta全部为无穷大,设定special旗帜,则在最终输出时通过if可输出无界解的情形。

    def FindMain(self):                 
  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对偶单纯形法是一种线性规划的解方法,其主要思想是将原问题转化为对偶问题,然后通过对偶问题的解来得到原问题的最优解。下面是一个简单的对偶单纯形法的Python代码实现: ``` import numpy as np class DualSimplex(object): def __init__(self, A, b, c): self.A = np.array(A) self.b = np.array(b) self.c = np.array(c) self.m, self.n = self.A.shape self.B = np.eye(self.m) self.N = np.eye(self.n) self.x = np.zeros(self.n) self.y = np.zeros(self.m) self.obj = 0 def pivot(self, B, N, A, b, c, x, y, l, e): b[l], N[:, e] = N[:, e], b[l] B[:, l], A[:, e] = A[:, e], B[:, l] c_B, c_N = c[l], c[e] c -= c_N * N @ B[:, l] c[l] = c_B N[:, e] = -N[:, e] / N[l, e] b /= N[l, e] B[:, l] /= N[l, e] for i in range(self.m): if i != l: b[i] -= N[i, e] * b[l] B[:, i] -= N[i, e] * B[:, l] N[i, e] = -N[i, e] / N[l, e] obj = c @ x + np.sum(c_B * b) return B, N, A, b, c, x, y, obj def solve(self): while True: y = np.linalg.solve(self.B.T, self.c[:self.m]) s = self.c[self.m:] - self.N.T @ y if np.all(s >= 0): self.x = np.linalg.solve(self.B, self.b) self.obj = self.c @ self.x return self.x, self.obj e = np.argmin(s) if np.all(self.A[:, e] <= 0): return "Unbounded" l = np.argmin(self.b / self.A[:, e]) self.B, self.N, self.A, self.b, self.c, self.x, self.y, self.obj = self.pivot(self.B, self.N, self.A, self.b, self.c, self.x, self.y, l, e) ``` 该代码实现对偶单纯形法的解过程,其中`A`、`b`、`c`分别为线性规划问题的系数矩阵、右端常数向量和目标函数系数向量。在`solve`函数中,首先通过对偶问题得到对偶问题的最优解`y`,然后计算出对偶问题的检验数`s`,如果`s`的所有元素都大于等于0,则说明原问题的解已经找到,返回原问题的最优解和最优值;否则,选择一个检验数`s`中最小的元素对应的列`e`,然后选择一个基变量`l`,进行基变换,继续迭代解,直到找到原问题的最优解或者发现原问题无界。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值