我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Simplex 单纯形算法的python

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Simplex 单纯形算法的python

相关理论知识参考 单纯形理论知识

算法可以在给定一个包含线性规划问题的标准形式的描述下,求解该线性规划问题。
例如某一个 pro.txt 文件内容如下:

6
3
3 -1 1 -2 0 0
2 1 0 1 1 0
-1 3 0 -3 0 1
-3 4 12
-7 7 -2 -1 -6 0

执行算法之后得到结果:

x_1 = 0.000000,x_2 = 0.000000,x_3 = 0.000000,x_4 = 1.500000,x_5 = 2.500000,x_6 = 16.500000
objective value is : -16.500000
1-th line constraint value is : -3.000000
2-th line constraint value is : 4.000000
3-th line constraint value is : 12.000000

代码如下:

#encoding=utf-8
__author__ = 'ysg'
import numpy as np #python 矩阵操作lib


class Simplex():

    def __init__(self):
        self._A = "" # 系数矩阵
        self._b = "" #
        self._c = '' #约束
        self._B = '' #基变量的下标集合
        self.row = 0 #约束个数

    def solve(self, filename):
        #读取文件内容,文件结构前两行分别为 变量数 和 约束条件个数
        #接下来是系数矩阵
        #然后是b数组
        #然后是约束条件c
        #假设线性规划形式是标准形式(都是等式)

        A = []
        b = []
        c = []
        with open(filename,'r') as f:
            self.var = int(f.readline())
            self.row = int(f.readline())

            for i in range(self.row):
                x =map(int, f.readline().strip().split(' '))
                A.append(x)
            b=(map(int, list(f.readline().split(' '))))
            c=(map(int, list(f.readline().split(' '))))


        self._A = np.array(A, dtype=float)
        self._b = np.array(b, dtype=float)
        self._c = np.array(c, dtype=float)
        # self._A = np.array([[3,-1,1,-2,0,0],[2,1,0,1,1,0],[-1,3,0,-3,0,1]],dtype=float)
        # self._b = np.array([-3,4,12],dtype=float)
        # self._c = np.array([-7, 7, -2, -1, -6, 0],dtype=float)
        self._B = list()
        self.row = len(self._b)
        self.var = len(self._c)
        (x,obj) = self.Simplex(self._A,self._b,self._c)
        self.pprint(x,obj,A)


    def pprint(self,x,obj,A):
        px = ['x_%d = %f'%(i+1,x[i]) for i in range(len(x))]
        print ','.join(px)
        print ('objective value is : %f'% obj)
        print '------------------------------'
        for i in range(len(A)):
            print '%d-th line constraint value is : %f' % (i+1, x.dot(A[i]))

    #添加人工变量得到一个初始解
    def InitializeSimplex(self,A,b):

        b_min, min_pos = (np.min(b), np.argmin(b))  # 得到最小bi

        #将bi全部转化成正数
        if (b_min < 0):
            for i in range(self.row):
                if i != min_pos:
                    A[i] = A[i] - A[min_pos]
                    b[i] = b[i] - b[min_pos]
            A[min_pos] = A[min_pos]*-1
            b[min_pos] = b[min_pos]*-1

        #添加松弛变量
        slacks = np.eye(self.row)
        A = np.concatenate((A,slacks),axis=1)
        c = np.concatenate((np.zeros(self.var),np.ones(self.row)),axis=1)
        # 松弛变量全部加入基,初始解为b
        new_B = [i + self.var for i in range(self.row)]

        #辅助方程的目标函数值
        obj = np.sum(b)

        c = c[new_B].reshape(1,-1).dot(A) - c
        c = c[0]
        #entering basis
        e= np.argmax(c)

        while c[e] > 0:
            theta = []
            for i in range(len(b)):
                if A[i][e] > 0:
                    theta.append(b[i]/A[i][e])
                else:
                    theta.append(float("inf"))

            l = np.argmin(np.array(theta))

            if theta[l] == float('inf'):
                print 'unbounded'
                return False

            (new_B, A, b, c, obj) = self._PIVOT(new_B, A, b, c, obj, l , e)

            e = np.argmax(c)

        #如果此时人工变量仍在基中,用原变量去替换之
        for mb in new_B:
            if mb >= self.var:
                row = mb-self.var
                i = 0
                while A[row][i] == 0 and i < self.var:
                    i+=1
                (new_B, A, b, c, obj) = self._PIVOT(new_B,A,b,c,obj,new_B.index(mb),i)

        return (new_B, A[:,0:self.var], b)

    #算法入口
    def Simplex(self,A,b,c):
        B = ''
        (B, A ,b) = self.InitializeSimplex(A,b)

        #函数目标值
        obj = np.dot(c[B],b)

        c = np.dot(c[B].reshape(1,-1), A) - c
        c = c[0]

        # entering basis
        e = np.argmax(c)
        # 找到最大的检验数,如果大于0,则目标函数可以优化
        while c[e] > 0:
            theta = []
            for i in range(len(b)):
                if A[i][e] > 0:
                    theta.append(b[i] / A[i][e])
                else:
                    theta.append(float("inf"))

            l = np.argmin(np.array(theta))

            if theta[l] == float('inf'):
                print 'unbounded'
                return False

            (B, A, b, c, obj) = self._PIVOT(B, A, b, c, obj, l, e)

            e = np.argmax(c)


        x = self._CalculateX(B,A,b,c)
        return (x,obj)


    #得到完整解
    def _CalculateX(self,B,A,b,c):

        x = np.zeros(self.var,dtype=float)
        x[B] = b
        return x

    # 基变换
    def _PIVOT(self,B,A,b,c,z,l,e):
        # main element is a_le
        # l represents leaving basis
        # e represents entering basis

        main_elem = A[l][e]
        #scaling the l-th line
        A[l] = A[l]/main_elem
        b[l] = b[l]/main_elem

        #change e-th column to unit array
        for i in range(self.row):
            if i != l:
                b[i] = b[i] - A[i][e] * b[l]
                A[i] = A[i] - A[i][e] * A[l]

        #update objective value
        z -= b[l]*c[e]

        c = c - c[e] * A[l]

        # change the basis
        B[l] = e

        return (B, A, b, c, z)


s = Simplex()
s.solve('pro.txt')

注释差不多写的比较清楚,可以参考上面的理论知识链接。

大佬请绕路。

有错欢迎指出。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Simplex 单纯形算法的python

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Simplex 单纯形算法的python

相关理论知识参考 单纯形理论知识算法可以在给定一个包含线性规划问题的标准形式的描述下,求解该线性规划问题。 例如某一个 pro.txt 文件内容如下:6 3 3 -1 1 -2 0 0 2 1 0 1 1 0 -1
2023-01-31

纯CSS绘制三角形的方法

本篇内容主要讲解“纯CSS绘制三角形的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“纯CSS绘制三角形的方法”吧!CSS绘制三角形的方法:1、定义个宽高为0的标签元素;2、使用“border
2023-06-14

纯CSS如何实现单一div的正多边形变换

小编给大家分享一下纯CSS如何实现单一div的正多边形变换,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!正三角形正三角形不需要用到伪元素,只需要设定div本身的边
2023-06-08

css中实现环形/扇形菜单的方法

这篇文章主要介绍了css中实现环形/扇形菜单的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言 项目需要用到环形菜单,初略在网上找了一下,没有找到合适的,于是自己写了一
2023-06-08

纯css实现小箭头或三角形标志的方法

小编给大家分享一下纯css实现小箭头或三角形标志的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!实现小箭头:.arrow{ width: 20px; height: 20px; margin-top:
2023-06-08

python中纯函数的使用方法

这篇文章给大家分享的是有关python中纯函数的使用方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开发,众多大型网站均为Py
2023-06-14

纯css实现动态条形加载条效果的方法

这篇文章将为大家详细讲解有关纯css实现动态条形加载条效果的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。运用了css变量的知识,直接上代码及其我加的注释
2023-06-15

python简单数值运算的方法是什么

Python中进行简单数值运算的方法包括使用算术运算符、使用内置数学函数和使用第三方数学库。1. 使用算术运算符:- 加法:`+`- 减法:`-`- 乘法:`*`- 除法:`/`- 取余:`%`- 幂运算:`**`- 整除:`//`例如:`
2023-10-10

Python算法输出1-9数组形成的结果为100的所有运算式

问题: 编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如:1 + 2 + 34?5 + 67?8 + 9 = 100。from functools import
2022-06-04

简单的排序算法

现在的IT行业并不像以前那么好混了,从业人员过多,导致初级程序员过剩,这也间接导致了公司的招聘门槛越来越高,要求程序员掌握的知识也越来越多。算法也是一个争论了很久的话题,程序员到底该不该掌握算法?不同的人有不同的答案,而事实上,很多公司都对算法有一定的要求,有
简单的排序算法
2021-12-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录