【机器学习5】python实现单纯形法和大M法
目录
- 1.手算--单纯形法
- 2.Python--单纯形法
- 3.Python包--单纯形法
- 4.Excel--大M法
- 5.python--大M法
写在前面:
关于单纯形法和大M法的原理,自己去百度吧,本篇文章只是给出了算法过程~
1.手算–单纯形法
题目:
手写计算最优解为为:27500
手算全过程请留言~
2.Python–单纯形法
题目依然是上面的↑
import numpy as np
def pivot(d,bn):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] = jnumr = d[inum][jnum]d[inum] /= rfor i in [x for x in range(bn) if x !=inum]:r = d[i][jnum]d[i] -= r * d[inum]
def solve(d,bn):flag = Truewhile flag:if max(list(d[0][:-1])) <= 0: #直至所有系数小于等于0flag = Falseelse:pivot(d,bn)
def printSol(d,cn):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("D:\\my.txt", dtype=np.float)
(bn,cn) = d.shape
s = list(range(cn-bn,cn-1)) #基变量列表
solve(d,bn)
printSol(d,cn)
计算结果:
3.Python包–单纯形法
题目依然是上面的↑
#导入包
from scipy import optimize
import numpy as np
#确定c,A_ub,B_ub
c = np.array([50,100])
A_ub = np.array([[1,1],[2,1],[0,1]])
B_ub = np.array([300,400,250])
#求解
res =optimize.linprog(-c,A_ub,B_ub)
print(res)
计算结果:
4.Excel–大M法
题目如下:
excel得到的结果如图:最优解为2
过程和上面的单纯法差不多 ~不清楚的先去学习单纯法吧 ~
5.python–大M法
题目是第4步骤贴出来的题目,代码参考: https://blog.csdn.net/desirew/article/details/79795554
导入txt文件内容格式为:
import os
import re
import numpy as np
import time
"""
输入线性规划模型到一个文档中,程序读取线性规划模型,化其为标准型。
找到初始可行基,建立单纯形表,迭代求解,判断解的类型,输出结果。
"""
#读取线性规划模型,并返回字符串列表
def inPut():# 读取线性规划模型model_str = []with open("大M法数据.txt",'r') as f: #建立一个文本文档 储存线性规划模型lines = f.readlines()for element in lines:element = element[:-1]model_str.append(element)return(model_str)#得到价值向量c
def find_C(model_str):x_temple = re.findall(r"-?\d+\.?\d*",model_str[-1])x_temple = [int(i) for i in x_temple]x_max = max(x_temple)c_temple = re.findall(r"-?\d+\.?\d*",model_str[0])c_temple = [float(i) for i in c_temple]c_list_1 = c_temple[1::2]c_list_2 = c_temple[::2]c=[]for i in range(x_max+1):c.append(0)for i in range(len(c_list_1)):c[int(c_list_1[i])] = c_list_2[i]c = np.array(c)return c#求系数矩阵+资源向量
def find_A(model_str):b = []x_temple = re.findall(r"-?\d+\.?\d*",model_str[-1])x_temple = [int(i) for i in x_temple]x_max = max(x_temple)A = [[0 for i in range(x_max+1)] for i in range(len(model_str)-2)]k = 0for element in model_str[1:-1]:x_temple = re.findall(r"-?\d+\.?\d*",element)x_temple = [float(i) for i in x_temple]x_list_1 = x_temple[1::2]x_list_2 = x_temple[:-1:2]x=[]b.append(x_temple[-1])for i in range(x_max+1):x.append(0)for i in range(len(x_list_1)):x[int(x_list_1[i])] = x_list_2[i]for num in range(len(x)):A[k][num] = x[num]k += 1for num in range(len(b)):A[num][0] = b[num]A = np.array(A,dtype = np.float_)return A#由以上三个函数可得到 1.系数+资源向量矩阵 2.价值向量 A c b 三个变量#为进行资源向量非负化,约束条件等式化,记录每个约束的形式( =记为0,>记为1,<记为-1)
def constraintCondition(model_str):yueshu = []for element in model_str[1:-1]:if '<' in element:yueshu.append(-1)elif '>' in element:yueshu.append(1)else:yueshu.append(0)yueshu = np.array(yueshu)return yueshu#对A,b进行标准化
def change_A(str,A,c,yueshu):#约束条件等式化for i in range(A.shape[0]):if A[i,0]< 0:yueshu[i]*=-1A[i]*=-1for i in range(A.shape[0]):if yueshu[i] == 1:#添加松弛变量temple_list = [0 for j in range(A.shape[0])]temple_list[i] = -1A = np.column_stack((A,temple_list))for i in range(A.shape[0]):if yueshu[i] == -1:#添加剩余变量temple_list = [0 for j in range(A.shape[0])]temple_list[i] = 1A = np.column_stack((A,temple_list))elif yueshu[i] == 1:#添加人工变量temple_list = [0 for j in range(A.shape[0])]temple_list[i] = 1A = np.column_stack((A,temple_list))elif yueshu[i] == 0:# 添加人工变量temple_list = [0 for j in range(A.shape[0])]temple_list[i] = 1A = np.column_stack((A,temple_list))return A#对价值向量c进行标准化
def change_c(str,A,c,yueshu):if 'in' in str[0]:c = c*-1#约束条件等式化for i in range(A.shape[0]):if A[i,0]< 0:yueshu[i]*=-1for i in range(A.shape[0]):if yueshu[i] == 1:#添加松弛变量c = list(c)c.append(0)c = np.array(c)for i in range(A.shape[0]):if yueshu[i] == -1:#添加剩余变量c = list(c)c.append(0)c = np.array(c)elif yueshu[i] == 1:#添加人工变量c = list(c)c.append(-pow(10,9))c = np.array(c)elif yueshu[i] == 0:# 添加人工变量c = list(c)c.append(-pow(10,9))c = np.array(c)return c#基变量对应的价值系数
def C_B(x_b,c,m):c_b = []for element in x_b:c_b.append(c[element])return c_b#计算检验数
def CN(A,c,x_b,c_b,m,n):cn = [0]for num_1 in range(1,n):cj = c[num_1]for num_2 in range(m):cj = cj - c_b[num_2] * A[num_2,num_1]if 0 < cj and cj < 0.0001:cj = 0cn.append(cj)return cn#判断解的情况
def judge(A,cn,m,n,x_b,c_b):#最优解num = cn.count(0)if max(cn) <= 0:for j in range(len(c_b)):if c_b[j] == -pow(10,9):if A[j,0] !=0:return 4 #无可行解if num == m+1:return 1 #有最优解else:return 2 #有无穷多最优解else:for num in range(len(cn)):if cn[num] >0:lis = []for i in range(m):lis.append(A[i,num])if max(lis) < 0:for j in range(len(c_b)):if c_b[j] == -pow(10,9):if A[j,0] !=0:return 4 #无可行解return 3 #有无界解return 0 #继续迭代#计算theta
def theTa(cn,A,m):theta = []j = cn.index(max(cn))for num in range(m):if A[num,j] > 0:theta.append(A[num,0] / A[num,j])else:theta.append(float("inf"))return theta#进行基变换
def baseChange(A,cn,theta,m,n):# 找出中心元素j = cn.index(max(cn))i = theta.index(min(theta))main_elem = A[i,j]A[i] = A[i] / main_elemfor num in range(m):if num != i:A[num] = A[num] - A[num][j] * A[i]return A#进行基的换入与换出
def X_B(cn,theta,x_b):j = cn.index(max(cn))i = theta.index(min(theta))x_b[i] = jreturn x_b#计算最优值
def Value(c_b,A,m):value = 0for num in range(m):value += c_b[num] * A[num,0]return value#打印单纯形表
def Excel(A,c_b,x_b,c,theta,cn,m,n):print("%6s"%"Cj", end="")print("%6s"%"Cj", end="")print("%6s"%"Cj", end="")for i in c:if i != -pow(10,9):print("%6.1f"%i,end="")else:print("%6s"%"-M",end="")print("%6s"%"theta")#第二行print("%6s"%"CB", end="")print("%6s"%"XB", end="")print("%6s"%"b", end="")print("%6s"%"b", end="")for i in range(1,n):print("%6d" % i,end="")print("%6s"%"--")#打印数字for i in range(m):if c_b[i] != -pow(10,9):print("%6.1f" % c_b[i],end="")else:print("%6s" % "-M",end="")print("%6d" % x_b[i], end="")print("%6s" % "", end="")for j in range(n):print("%6.1f" % A[i,j] ,end="")print("%6.1f" % theta[i])#打印检验数print("%6s"%"CN", end="")print("%6s"%"CN", end="")print("%6s"%"CN", end="")for i in range(n):if cn[i]>10000 or cn[i]<-10000:print("%6s" %"MM", end="")else:print("%6.f" % cn[i],end="")print("%6s" % "--")print("")def outPut(result,value,x_b,A,X):if result == 1:num = 0for i in x_b:if i <= len(X):if A[num,0]<0:print("该问题无可行解:")returnX[i-1] = A[num,0]num +=1print("该问题有最优解:")print("X=(",end = "")for i in range(len(X)):if i == len(X)-1:print("%.1f"%X[i],end = "")else:print("%.1f,"%X[i],end = "")print(")")print("最优值:%.3f"%value)elif result == 2:print("该问题有无穷多解,其中一个最优解为:")num = 0for i in x_b:if i <= len(X):if A[num,0]<0:return 4X[i-1] = A[num,0]num +=1print("X=(",end = "")for i in range(len(X)):if i == len(X)-1:print("%.0f"%X[i],end = "")else:print("%.0f,"%X[i],end = "")print(")")print("最优值:%.3f"%value)elif result ==3:print("该问题有无界解")elif result ==4:print("该问题无可行解")#输入线性规划模型,找出变量
def solve():str = inPut()startTime = time.time()yueshu = constraintCondition(str)c = find_C(str)A = find_A(str)X = [ 0 for i in range(A.shape[1]-1)]#标准化A = change_A(str,A,c,yueshu)c = change_c(str,A,c,yueshu)#得到矩阵的维数m = A.shape[0]n = A.shape[1]#确定初始可行基X的下标,x_b存储可行基X的下标x_b = []for i in range(m):x_b.append(n-m+i)#X_B对应的价值系数c_bc_b = C_B(x_b,c,m)#初始单纯形表建立#1.计算检验数cn, theta#2.判断解的情况 若未达到终止条件 找到主元素 改变可行基 进行单位变换 进行第一步#3.若达到终止条件,输出结果num = 0while True:cn = CN(A,c,x_b,c_b,m,n)theta = theTa(cn,A,m)num += 1Excel(A,c_b,x_b,c,theta,cn,m,n)result = judge(A,cn,m,n,x_b,c_b)if result != 0:breaktheta = theTa(cn,A,m)A = baseChange(A,cn,theta,m,n)x_b = X_B(cn,theta,x_b)c_b = C_B(x_b,c,m)value = Value(c_b,A,m)if "in" in str[0]:value *= -1outPut(result,value,x_b,A,X)endTime = time.time()time_1 = endTime - startTimeprint("该问题迭代%d次,用时%.3fs" % (num,time_1))solve()
运行结果:
与excel计算结果一致!!
【机器学习5】python实现单纯形法和大M法相关推荐
- 小驼峰法和大驼峰法的区别
小驼峰法: 变量一般用小驼峰法标识.驼峰法的意思是:除第一个单词之外,其他单词首字母大写.如 helloWorld; 变量HelloWorld第一个单词是全部小写,后面的单词首字母大写. 常用于函数名 ...
- 搞机器学习,Python和R哪个更合适?
[编者按]如果你正想构建一个机器学习项目,但却纠结于如何选择编程语言,这篇文章将是你所需要的.这篇文章不仅帮助你理解Python和R这两种语言的区别,还有助于你了解各个语言多方面的优势. 作者 | M ...
- 要学习机器学习,先从这十大算法开始吧
https://blog.csdn.net/qq_40196321/article/details/85012951 本文介绍了机器学习新手需要了解的 10 大算法,包括线性回归.Logistic 回 ...
- 西安python工资怎么样-在西安为什么对Python编程需求这么大?工资这么高?
原标题:在西安为什么对Python编程需求这么大?工资这么高? 因为西安Python程序员太少啦!很多高校并未开设Python课程,因此市场上Python开发人才供小于求.很多企业为了争夺有限的Pyt ...
- 自学python推荐书籍同时找哪些来实践-机器学习:Python实践 PDF 原书完整版
给大家带来的一篇关于人工智能相关的电子书资源,介绍了关于机器学习.Python实践方面的内容,本书是由电子工业出版社出版,格式为PDF,资源大小124.7 MB,魏贞原编写,目前豆瓣.亚马逊.当当.京 ...
- python爬虫机器_Python常用的机器学习库|python爬虫|python入门|python教程
https://www.xin3721.com/eschool/pythonxin3721/ Python在科学计算中用途广泛:计算机视觉.人工智能.数学.天文等.它同样适用于机器学习也是意料之中的事 ...
- 决策算法python_GitHub - nxety/MachineLearning_Python: 机器学习算法python实现
机器学习算法Python实现 目录 1.代价函数 其中: 下面就是要求出theta,使代价最小,即代表我们拟合出来的方程距离真实值最近 共有m条数据,其中代表我们要拟合出来的方程到真实值距离的平方,平 ...
- python与数学关系大吗_通过一个简单的数学游戏,清晰了解各大编程语言之间的一些区别...
原标题:通过一个简单的数学游戏,清晰了解各大编程语言之间的一些区别 前言 我想很多人在小时候都玩过这么一个游戏,我记得以前的摩托罗拉的手机里面就有,那就是汉诺塔! 看到图片是不是想起来玩过这个游戏呢? ...
- 搞机器学习,Python 和 R 哪个更合适?
[编者按]如果你正想构建一个机器学习项目,但却纠结于如何选择编程语言,这篇文章将是你所需要的. 这篇文章不仅帮助你理解Python和R这两种语言的区别,还有助于你了解各个语言多方面的优势.那就不再浪费 ...
最新文章
- 程序员毕业两年,如何在帝都购房上车?
- ES6-let const
- SQL Server 2012 中的 Service Broker功能的一些改进或增强
- JWT令牌组成和安全校验讲解
- 原生js cookie的使用实例setCookie()、getCookie()方法
- DOM-11 【兼容】鼠标行为坐标系、pageXY封装、拖拽函数封装
- 如何用正则表达式杀死Java
- hal库开启中断关中断_【MCU】寄存器、标准库、HAL库、LL库,这么多库!你叫我怎么选?...
- maven项目转eclipse工程的命令:eclipse.bat
- Vscode配置ftp连接远程服务器
- python爬网易云音乐评论最多的歌_Python爬取网易云音乐上评论火爆的歌曲
- teamtalk原理
- 代码随想录第十天 LeetCode 232、225(栈,队列)
- 高通Camx offline Log merge命令
- CKEditor 修改编辑器 字体大小和行高
- Rootkit技术基础(4)
- 9位院士!10所一流大学,迎“新帅”
- PHP 换行符的一些说明
- MessageBox深入研究
- 算力大革命 智能经济新时代