能用的单纯形法python代码
网上找了一些代码,发现有一些是不能用的,出现错误说集合为空
1.网上出现了好多次,但是不能用的,只能部分模型能用,比如例子中所示
原链接:https://www.jianshu.com/p/b233cfa06017
https://blog.csdn.net/kittyzc/article/details/81707464
import numpy as np def pivot():
l = list(d[0][:-2])
jnum = l.index(max(l)) #转入编号
m = []
for i in range(bn):
if d[i][jnum] == 0:
m.append(0.)
else:
m.append(d[i][-1]/d[i][jnum])
inum = m.index(min([x for x in m[1:] if x!=0])) #转出下标
s[inum-1] = jnum
r = d[inum][jnum]
d[inum] /= r
for i in [x for x in range(bn) if x !=inum]:
r = d[i][jnum]
d[i] -= r * d[inum] def solve():
flag = True
while flag:
if max(list(d[0][:-1])) <= 0: #直至所有系数小于等于0
flag = False
else:
pivot() def printSol():
for i in range(cn - 1):
if i in s:
print("x"+str(i)+"=%.2f" % d[s.index(i)+1][-1])
else:
print("x"+str(i)+"=0.00")
print("objective is %.2f"%(-d[0][-1])) d = np.loadtxt("data.txt", dtype=np.float)
(bn,cn) = d.shape
s = list(range(cn-bn,cn-1)) #基变量列表
solve()
printSol() # txt文件里面的格式 1 14 6 0 0 0 0 0 1 1 1 1 0 0 0 4 1 0 0 0 1 0 0 2 0 0 1 0 0 1 0 3 0 3 1 0 0 0 1 6 # 求解模型
max z = x0+14*x1+6*x2 s.t. x0 + x1 + x2 <= 4 x0 <= 2 x2 <= 3 3*x1 + x2 <= 6
2. 在我的模型里面能用,不过显示比较繁琐,如果想要得到自己想要的,还需要在几个函数里面return
原链接:http://www.dataguru.cn/thread-909474-1-1.html
Max z = 18*x1 + 12.5*x2 s.t. x1 + x2 +x3 = 20 x1 + x4 = 12 x2 + x5 = 16 x1,x2,x3,x4,x5 >= 0 运行下面脚本(单纯形法的Python实现) import numpy as np # 实体类 Table
# 控制类 Simplex class Table: def __init__(self): pass def set_para(self,A,b,c,base,z0): """ 输入LP必须已经化为标准形式 """ self.A=A self.b=b self.c=c self.z0=z0 self.base=base self.m,self.n=self.A.shape def build(self): self.table=np.zeros((self.m+1,self.n+1)) self.table[:-1,:1]=self.b.T self.table[-1 ,0]=self.z0 self.table[:-1,1:]=self.A self.table[-1, 1:]=c self.baseVar=base def is_best(self): for sigma_index in range(self.n): if sigma_index not in self.baseVar: sigma=self.table[-1,1+sigma_index] if sigma>0: return False return True def is_no_solution(self): for sigma_index in range(self.n): if sigma_index not in self.baseVar: sigma=self.table[-1,1+sigma_index] if sigma>0: no_solution_flag=True for a in self.table[:-1,1+sigma_index]: if a>0: no_solution_flag=False if no_solution_flag==True: return True return False def get_inVar(self): max_sigma=0 inVar=None for sigma_index in range(self.n): if sigma_index not in self.baseVar: sigma=self.table[-1,1+sigma_index] if sigma>max_sigma: max_sigma=sigma inVar=sigma_index return inVar def get_outVar(self,inVar): rates=[] for nobaseVar in range(self.m): a=self.table[nobaseVar,inVar+1] b=self.table[nobaseVar, 0 ] if a>0: rate=b/a rates.append((rate,nobaseVar)) return min(rates)[1] def in_out(self,inVar,outVar): a=self.table[outVar,inVar+1] self.table[outVar,:]/=a for i in range(self.m+1): if i != outVar: self.table[i,:]-=self.table[outVar,:]*self.table[i,inVar+1] self.baseVar[outVar]=inVar def show(self): print ('基变量/取值:',self.baseVar,end='/') print (self.table[:-1,0]) print ("单纯形表") for i in range(self.m+1): for j in range(self.n+1): print ('%6.2f'%self.table[i,j],end=' ') print () print () class Simplex: def __init__(self): self.table=Table() # 0 正常,尚未得到最优解,继续迭代 # 1 无解,无界解 # 2 达到最优解 self.status=0 self.inVar=None self.outVar=None def set_para(self,A,b,c,base,z0=0): self.table.set_para(A,b,c,base,z0) def output_result(self): self._main() if self.status==1: print("此问题无界") elif self.status==2: print("此问题有一个最优解") elif self.status==3: print("此问题有无穷多个最优解") def _main(self): self._build_table() while 1: self.table.show() if self._is_best() or self._is_no_solution(): return self._get_inVar() self._get_outVar() self._in_out() def _build_table(self): self.table.build() def _is_best(self): if self.table.is_best(): self.status=2 return True return False def _is_no_solution(self): if self.table.is_no_solution(): self.status=1 return True return False def _get_inVar(self): self.inVar=self.table.get_inVar() def _get_outVar(self): self.outVar=self.table.get_outVar(self.inVar) def _in_out(self): self.table.in_out(self.inVar,self.outVar) if __name__=="__main__": s=Simplex() A=np.matrix([[1,1,1,0,0], [ 1, 0,0,1,0], [ 0, 1,0,0,1]]) b=np.matrix([[20,12,16]]) c=np.matrix([[18,12.5,0,0,0]]) base=[2,3,4] s.set_para(A,b,c,base) s.output_result()
能用的单纯形法python代码的更多相关文章
- 可爱的豆子——使用Beans思想让Python代码更易维护
title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...
- if __name__== "__main__" 的意思(作用)python代码复用
if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog http://www.dabu.info/if-__-name__ ...
- Python 代码风格
1 原则 在开始讨论Python社区所采用的具体标准或是由其他人推荐的建议之前,考虑一些总体原则非常重要. 请记住可读性标准的目标是提升可读性.这些规则存在的目的就是为了帮助人读写代码,而不是相反. ...
- 一行python代码实现树结构
树结构是一种抽象数据类型,在计算机科学领域有着非常广泛的应用.一颗树可以简单的表示为根, 左子树, 右子树. 而左子树和右子树又可以有自己的子树.这似乎是一种比较复杂的数据结构,那么真的能像我们在标题 ...
- [Dynamic Language] 用Sphinx自动生成python代码注释文档
用Sphinx自动生成python代码注释文档 pip install -U sphinx 安装好了之后,对Python代码的文档,一般使用sphinx-apidoc来自动生成:查看帮助mac-abe ...
- 上传自己的Python代码到PyPI
一.需要准备的事情 1.当然是自己的Python代码包了: 2.注册PyPI的一个账号. 二.详细介绍 1.代码包的结构: application \application __init__.py m ...
- 如何在batch脚本中嵌入python代码
老板叫我帮他测一个命令在windows下消耗的时间,因为没有装windows那个啥工具包,没有timeit那个命令,于是想自己写一个,原理很简单: REM timeit.bat echo %TIME% ...
- ROS系统python代码测试之rostest
ROS系统中提供了测试框架,可以实现python/c++代码的单元测试,python和C++通过不同的方式实现, 之后的两篇文档分别详细介绍各自的实现步骤,以及测试结果和覆盖率的获取. ROS系统中p ...
- 让计算机崩溃的python代码,求共同分析
在现在的异常机制处理的比较完善的编码系统里面,让计算机完全崩溃无法操作的代码还是不多的.今天就无意运行到这段python代码,运行完,计算机直接崩溃,任务管理器都无法调用,任何键都用不了,只能强行电源 ...
随机推荐
- selenium + python 环境配置 (四)之启动Firefox
火狐浏览器自身适配selenium 因此不需要再安装 直接代码启动: __author__ = 'admin' #作者 # -*- coding:utf-8 -*- # 建议所有都加编码 from ...
- 如何使用js实现轮播图
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...
- Linux(CentOS 7)下安装postgres
事情背景:需要在Linux上安装postgres数据库,但安装目录想直接指定,所以想通过源码编译安装pg 首先下载源码安装包.源码下载地址:https://github.com/postgres/po ...
- java访问磁盘文件
转载,务必写上原文链接 !(尊重与你分享知识的人) 目录 文件 File 对象 VS FileDescriptor 对象 文件讲解java访问磁盘文件过程 fileReader.read() 图解ja ...
- 使用 netkeeper 创翼电脑开 WiFi 方法(12)
学校的宽带使用"netkeeper"联网,但是电脑依然可以开启WiFi,以下是方法: 1. Win10用户请看 2. Win7用户请看 Win7无法在"任务管理器&quo ...
- 【C++札记】指针函数与函数指针
指针函数 指针函数是一个函数,只不过指针函数返回的类型是某一类型的指针. 格式: 类型名* 函数名(函数参数列表) 如下代码存在问题 void test(char *p) { p = (char*)m ...
- 剑指offer57:二叉树的下一个结点
1 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 2 思路和方法 中序遍历,下一个结点有两种情况 a ...
- Excel常用操作1
1.数据透视 所在选项卡:插入-数据透视表 例如:查看下表中各个工龄的平均工资 数据透视:选择所有数据--数据透视表--数据透视字段:选择工作经验和salary 切片器的使用,根据工作经验进行切片(还 ...
- [ZJOI2007]捉迷藏 (线段树,括号序列)
大意: 给定树, 要求维护一个点集, 支持删点添点, 询问点集直径. 本题做法比较多. 一个显然的做法是, 线段树维护区间直径, 然后根据点集直径的性质, 合并后直径端点一定是四个端点其中两个, 枚举 ...
- redis5.0集群配置
介绍 redis自3.0版本以来支持主从模式的集群,可用哨兵监控集群健康状态,但这种方式的集群很不成熟,数据备份需要全量拷贝.在之后的版本才真正支持集群分片. 在redis5.0中去除了以redis- ...