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

算法可以在给定一个包含线性规划问题的标准形式的描述下,求解该线性规划问题。
例如某一个 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 矩阵操作libclass 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]*-1b[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)# 松弛变量全部加入基,初始解为bnew_B = [i + self.var for i in range(self.row)]#辅助方程的目标函数值obj = np.sum(b)c = c[new_B].reshape(1,-1).dot(A) - cc = c[0]#entering basise= 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.vari = 0while 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) - cc = c[0]# entering basise = 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] = breturn x# 基变换def _PIVOT(self,B,A,b,c,z,l,e):# main element is a_le# l represents leaving basis# e represents entering basismain_elem = A[l][e]#scaling the l-th lineA[l] = A[l]/main_elemb[l] = b[l]/main_elem#change e-th column to unit arrayfor 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 valuez -= b[l]*c[e]c = c - c[e] * A[l]# change the basisB[l] = ereturn (B, A, b, c, z)s = Simplex()
s.solve('pro.txt')

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

大佬请绕路。

有错欢迎指出。

Simplex 单纯形算法的python实现相关推荐

  1. 线性规划专题——SIMPLEX 单纯形算法(三)图解——示例、注意点

    线性规划专题--SIMPLEX 单纯形算法(一) 线性规划专题--SIMPLEX 单纯形算法(二) 前面两篇博文已经把单纯形算法里面的核心思想给解释清楚了,主要是要认识到在线性规划里面的以下几点: 目 ...

  2. Nelder-Mead(simplex,“单纯形”)算法

    求多维函数极值的一种算法,由Nelder和Mead提出,又叫单纯形算法,但和线性规划中的单纯形算法是不同的,由于未利用任何求导运算,算法比较简单,但收敛速度较慢,适合变元数不是很多的方程求极值,算法的 ...

  3. Simplex单纯性算法的Python实现

    单纯性算法是解决线性规划的经典方法,上世纪50年代就提出了,其基本思想是在可行域内沿着边遍历所有的顶点,找出最优值,即为算法的最优值. 算法的执行过程如下: 求出初始基向量 构建单纯性表格 在所有非基 ...

  4. 单纯形算法 Simplex Algorithm (一)

    单纯形算法是求解线性规划问题最经典的方法,在许多介绍该算法的文章中会使用单纯形表(Tableau)辅助计算,而对Tableau进行的操作本质上都是在对松弛化的线性规划模型进行矩阵运算,从几何表现上看, ...

  5. 单纯形算法 Simplex Algorithm (二)

    为了真正理解单纯形算法的具体步骤,我查阅了许多文章,不过大部分文章会直接叙述单纯形表的操作,对理解算法帮助有限:也有一些文章直接从线性代数上的原理开始叙述,对于非专业人士又太难了.所幸我找到了一个挺不 ...

  6. 线性规划-单纯形算法详解

    本文作者: hrwhisper 本文链接: https://www.hrwhisper.me/introduction-to-simplex-algorithm/ 版权声明: 本博客所有文章除特别声明 ...

  7. 0050算法笔记——【线性规划】单纯形算法(未完全实现)

    题外话:王晓东的<算法设计与分析>看到现在,终于遇到自己琢磨不透的代码了.这里粘出来,求大神指点迷津,将代码补充完整~ 1.线性规划问题及其表示 线性规划问题可表示为如下形式: 变量满足约 ...

  8. 线性规划:单纯形算法之处理退化

    上一篇文章介绍了单纯形算法(<线性规划:单纯形算法>),但是还有一些遗留问题没有解决,比如退化情形(Degeneracy). 本文介绍如何处理退化情形. 退化情形 从几何上看上看,造成退化 ...

  9. 基于朴素贝叶斯的垃圾分类算法(Python实现)

    有代码和数据集的 https://blog.csdn.net/weixin_33734785/article/details/91428991 附有git库代码的 https://www.cnblog ...

最新文章

  1. LeetCode简单题之二叉搜索树的范围和
  2. XGBoost输出特征重要性以及筛选特征
  3. Python将list存为csv文件
  4. mysql降序后去重_Mysql 数据记录去重后按字段排序
  5. 信息学奥赛一本通 1126:矩阵转置 | OpenJudge NOI 1.8 10:矩阵转置
  6. RocketMQ单机版本安装(windows环境)
  7. 全文索引--海量数据模糊查询
  8. 【Flutter】微信项目实战【05】 通讯录界面搭建(上)
  9. 利用Calendar类判断是平年还是闰年
  10. linux查看虚拟内存使用,Linux 使用 vmstat 查看虚拟内存状态
  11. java个人网站源码下载_创建一个基于JAVA的个人网站(有源码也行)
  12. 2021全国电赛H题回顾
  13. 信息系统项目管理师-软考-B站自学
  14. java无法找到加载主类是什么意思,在Java程序运行时遇到的“Could not find or load main class(无法找到或者加载主类)”是什么意思?...
  15. c++基础题:判断某整数是正整数、负整数还是零
  16. ecshop 要求php,使用ecshop需要什么环境才可以运行
  17. Snort入侵检测系统实验
  18. Oracle VM VirtualBox Ubuntu设置共享文件夹
  19. 晕菜...又要出差了...
  20. 简单快速上手JAVA操作Excel

热门文章

  1. 七年程序员生涯,我学到最重要的 6 个教训,别再中招!
  2. 为什么中国开发不出流行的操作系统和编程语言呢?
  3. 推荐10个最好的Javascript和CSS库
  4. HTML5 API详解(18):IndexedDB 本地存储
  5. 推荐一款高引超6000次的全基因组/全外显子组变异注释工具
  6. 七龙珠 |召唤一份单细胞数据库汇总
  7. Mac操作指南:Mac Monterey实况文本功能如何开启和关闭?
  8. Mac如何快速导出保存Pages文档里的图片
  9. blob没权限 ie_vuerouter 源码和动态路由权限分配
  10. python 无序列表中第k大元素_Python要求O(n)复杂度求无序列表中第K的大元素实例...