能用的单纯形法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代码,运行完,计算机直接崩溃,任务管理器都无法调用,任何键都用不了,只能强行电源 ...
随机推荐
- Memcached集群实现及原理介绍
一.Memcached集群介绍 1.自身通过算法保证数据唯一性2.集群形式对用户和Memcached都是透明的3.Memcached的集群是通过客户端实现的4.Memcached服务端相互不认识 二. ...
- Java线程状态的改变
一.线程状态 线程的状态转换是线程控制的基础.线程状态总的可分为五大状态:分别是生.死.可运行.运行.等待/阻塞.用一个图来描述如下: 1.新状态:线程对象已经创建,还没有在其上调用start()方法 ...
- redis事务、并发及应用场景
目录 事务概念 事务命令 乐观锁 悲观锁 并发控制及过期时间 队列 队列防丢失 阻塞队列 时间区间控制 持久化 RDB AOF 命令追加 文件写入.同步 RDB.AOF优缺点 RDB优缺 AOF优缺 ...
- java--demo之猜拳游戏
版本1:人机大战 基础随机出 用户键盘录入 package com.hainiu.demo; import java.util.Scanner; /* * 人机大战石头剪刀布 */ publi ...
- C++Primer 5th Chap7 Classes
this关键字: 在成员函数内部可以直接调用函数的对象的成员(类成员的直接访问看做是对this隐式引用,默认this指向非常量) 例如:string isbn() const{return this- ...
- cliff
let me tell you,buddy. there's a faster gun. cming over yonder,when tomorrow comes.
- Python3 和 Python2的区别
目录 print Python2.7的print不是一个function Python3里的print是一个function. Unicode Python 2 有 ASCII str() 类型,un ...
- 【贪心】洛谷2019 OI春令营 - 普及组 作业
[P3817 小A的糖果 小A有N个糖果盒,第i个盒中有a[i]颗糖果. 小A每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中加起来都只有x颗或以下的糖果,至少得吃掉几颗糖. [贪 ...
- Scratch:海龟绘图(九)
在本课的前导部分,我们说到怎么做才能成为一个负责任的“程序猿”.我认为,负责任的程序员决不会草率的处理任何“函数接口”. 比如这个“画圆”函数,程序员就会认真推敲“哪些参数是必要的.哪些参数又是多余的 ...
- 关于OI中的各种数学
学到后面数学越来越多了,感觉好难啊,开个博客专门记录一下数学相关的东西 因为反正也没人看,所以主要还是给自己看的 一些符号: 数论函数的卷积:$\ast$,$ h = f \ast g$ 则 $h(n ...