编程实现线性规划——单纯形法(上)

编程实现单纯形法(上)

  • 一、基本概念
    • 1.线性规划问题的标准型
    • 2.线性规划的单纯形法(表)
    • 3.人工变量法
  • 二、单纯形法的python编程
    • Step1:建立单纯形表类
    • Step2:迭代函数
    • Step3:判断迭代终止函数
    • Step4:基变换

一、基本概念

1.线性规划问题的标准型

标准型

2.线性规划的单纯形法(表)

https://baike.baidu.com/item/%E5%8D%95%E7%BA%AF%E5%BD%A2%E6%B3%95/8580570?fr=aladdin

3.人工变量法

https://baike.baidu.com/item/%E4%BA%BA%E5%B7%A5%E5%8F%98%E9%87%8F%E6%B3%95/16629814?fr=aladdin
————————————————————————————————————

二、单纯形法的python编程

Step1:建立单纯形表类

class Table(object):
    def __init__(self,X_num,B_num,z0,Xbase,bound):  #初始化函数
        self.X_num=X_num    #变量个数
        self.B_num=B_num    #约束条件个数
        self.z0=z0          #目标函数
        self.check=[]       #检验数
        self.Xbase=Xbase    #基变量
        self.bound=bound    #约束条件,包括右端常数
        self.flag=0         #解的类型,0为(暂时)无解,1为唯一最优解,2为无穷多最优解

Step2:迭代函数

	def Iteration(self):    	#迭代函数
        lim=100		#最大迭代次数(防止无解时无限迭代)
        while(lim>0):
            self.check=[]
            for i in range(self.X_num):     #计算检验数
                temp=0
                for j in range(self.B_num):
                    temp+=self.bound[j][i]*self.z0[self.Xbase[j]]
                self.check.append(self.z0[i]-temp)
            self.IsEnd()		#判断迭代是否结束
            if self.flag>0:		#有解,则结束迭代
                break
            else:				#否则,进行基变换
                self.BaseChange(1)
                lim-=1

Step3:判断迭代终止函数

	def IsEnd(self):   	#检验是否为最优解且最优解是否唯一
        self.flag=1
        zero=0
        for i in range(self.X_num):
            if self.check[i]>0:  #检验数大于0,非最优解
                self.flag=0
                break
            if abs(self.check[i])<0.00001:   
            #因为M取1000,所以检验数的计算有些许误差
                zero+=1
                if zero>self.B_num:
                    self.flag=2  
                    #检验数中0的个数大于基变量个数,有无穷多最优解

Step4:基变换

    def BaseChange(self,model):   #基变换
        if model==1:
            [i,j,main]=self.FindMain()	#单纯形法:寻找主元素
        else:
            [i,j,main]=self.FindMain2()	#对偶单纯形法:寻找主元素
        self.Xbase[i]=j     #更换基变量
        for t in range(self.X_num+1):	#变换基变量所在行
            self.bound[i][t]=self.bound[i][t]/main
        for k in range(self.B_num):		#变换其他行
            if k!=i:
                times=self.bound[k][j]
                for t in range(self.X_num+1):
                    temp=self.bound[i][t]*times
                    self.bound[k][t]=self.bound[k][t]-temp
    def FindMain(self):    #寻找主元素
        j=self.check.index(max(self.check)) #获取检验数中最大值序号
        theta=[]
        for i in range(self.B_num):
            if self.bound[i][j]==0:     #当被除数为0,给其theta一个足够大的值
                th=1000
            else:
                th=self.bound[i][self.X_num]/self.bound[i][j]
            if th<0:                        #当theta<0时,给其一个足够大的值
                th=10000
            theta.append(th)
        i=theta.index(min(theta))           #获取检验数中最小值序号,换入
        main=self.bound[i][j]        
        return [i,j,main]

后文:
编程实现线性规划——单纯形法(下)

你可能感兴趣的:(线性规划,算法)