资源简介

python窗体实现线性规划中的单纯形法,其中包含一个主要实现单纯形表算法的LPtable.py和实现tkinter窗体输入的test1.py。使用时直接在后者中点运行即可。

资源截图

代码片段和文件信息

# -*- coding: utf-8 -*-

class Table(object):
    def __init__(selfX_numB_numz0Xbasebound):  #初始化函数
        self.X_num=X_num    #变量个数
        self.B_num=B_num    #约束条件个数
        self.z0=z0          #目标函数
        self.check=[]       #检验数
        self.Xbase=Xbase    #基变量
        self.bound=bound    #约束条件
        self.flag=0         #解的类型

    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给它一个足够大的值
                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 [ijmain]

    def baseChange(selfmodel):   #基变换
        if model==1:
            [ijmain]=self.FindMain()
        else:
            [ijmain]=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 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的个数大于基变量个数,有无穷多最优解

    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
            
    def Iteration2(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.IsEnd2()
            if self.flag>0:
                break
            else:
                self.baseChange(2)
                lim-=1
        
    def IsEnd2(self):
        self.flag=1
        for i in range(self.B_num):
            if self.bound[i][self.X_num]<0:
                self.flag=0
    

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2020-03-27 15:13  LP\
     文件        4071  2020-03-27 15:07  LP\LPTable.py
     目录           0  2020-03-27 15:17  __MACOSX\
     目录           0  2020-03-27 15:17  __MACOSX\LP\
     文件         425  2020-03-27 15:07  __MACOSX\LP\._LPTable.py
     文件        6148  2020-03-27 15:13  LP\.DS_Store
     文件         120  2020-03-27 15:13  __MACOSX\LP\._.DS_Store
     文件        5731  2020-03-27 15:07  LP\test1.py
     文件         425  2020-03-27 15:07  __MACOSX\LP\._test1.py
     文件         427  2020-03-27 15:13  __MACOSX\._LP

评论

共有 条评论