大M法的python编程求解和python包求解

  • 一、大M算法的求解步骤讲解
  • 二、python编程求解
  • 三、利用python包scipy的优化包optimize
  • 四、用excel求解
  • 五、分析结果

一、大M算法的求解步骤讲解

单纯形法的步骤是从一个初始极点出发,不断找到更优的相邻极点,直到找到最优的极点(或极线)。
消去xBxB x_BxB​得到问题的字典表达,即:
mincTBB−1b+(cTN−cTBB−1N)xNmin⁡cBTB−1b+(cNT−cBTB−1N)xN \min cT_BB{-1}b+(cT_N-cT_BB^{-1}N)x_NmincBT​B−1b+(cNT​−cBT​B−1N)xN​
s.t. B−1b−B−1NxN≥0B−1b−B−1NxN≥0 B{-1}b-B{-1}Nx_N\ge 0B−1b−B−1NxN​≥0
xN≥0xN≥0 x_N\ge 0xN​≥0
称(cTN−cTBB−1N)i(cNT−cBTB−1N)i (cT_N-cT_BB^{-1}N)_i(cNT​−cBT​B−1N)i​为第ii ii个非基变量的残差(reduced cost),如果残差小于0,那么说明这个非基变量还没有满足最优条件。直观上来看,这个非基变量取稍稍大于0的数就可以继续优化目标函数了。我们选择一个基变量和这个非基变量对换,就可以找到更优的相邻极点。
另一种理解方法:残差对应的是对偶问题可行条件,小于0表示对偶问题还不可行,需要继续探索。
接下来的问题是具体选择哪个基变量和哪个非基变量进行对换。我们用启发式原则,每次将负数残差(cTN−cTBB−1N)i(cNT−cBTB−1N)i (cT_N-cT_BB^{-1}N)_i(cNT​−cBT​B−1N)i​最小(绝对值最大)的非基变量xixi x_ixi​替换为基变量,同时将(B−1b(B−1N)i)j(B−1b(B−1N)i)j (\frac{B{-1}b}{(B{-1}N)_i})j((B−1N)i​B−1b​)j​最小值对应的基变量xjxj x_jxj​替换为非基变量。这个进基/出基的过程称为pivoting。
另一种表达方式是:minz=cxmin⁡z=cx \min z = cxminz=cx,s.t.Ax=bAx=b Ax = bAx=b的pivoting是每次找出c中最小数对应的非基变量xixi x_ixi​,再找出bi/Aijbi/Aij b_i/A
{ij}bi​/Aij​最小的基变量xjxj x_jxj​进行对换。
如果是max问题,令c′=−cc′=−c c’=-cc′=−c即可转化为min问题,相对应的,每次pivoting是找出c′c′ c’c′最大值对应的非基变量。

求解例子如图:

二、python编程求解

# encoding=utf-8
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):# 读取文件内容,文件结构前两行分别为 变量数 和 约束条件个数# 接下来是系数矩阵# 然后是b数组# 然后是约束条件c# 假设线性规划形式是标准形式(都是等式)A = []b = []c = []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([[0,2,-1],[0,1,-1]],dtype=float)self._b = np.array([-2,1],dtype=float)self._A = np.array([[1,-1,1]])# 等式约束系数self._A,3x1维列向量self._b = np.array([2])# 等式约束系数self._b,1x1数值self._c = np.array([2,1,1],dtype=float)self._B = []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=0)# 松弛变量全部加入基,初始解为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()
x_1 = 0.000000,x_2 = 0.000000,x_3 = 2.000000
objective value is : 2.000000
------------------------------

三、利用python包scipy的优化包optimize

import numpy as np
from scipy import optimize as op
# 给出变量取值范围
x1=(0,None)
x2=(0,None)
x3=(0,None)
#定义给出变量,确定c,A_ub,B_ub,A_eq,B_eq
c = np.array([2,1,1])# 目标函数系数,3x1列向量
A_ub = np.array([[0,2,-1],[0,1,-1]]) # 不等式约束系数A,2x3维矩阵
B_ub = np.array([-2,1])# 等式约束系数B, 2x1维列向量
A_eq = np.array([[1,-1,1]])# 等式约束系数Aeq,3x1维列向量
B_eq = np.array([2])# 等式约束系数beq,1x1数值
#调用函数求解
res=op.linprog(c,A_ub,B_ub,A_eq,B_eq,bounds=(x1,x2,x3))#调用函数进行求解
print(res)
     con: array([3.41133788e-11])fun: 1.9999999999762483message: 'Optimization terminated successfully.'nit: 4slack: array([-3.94371202e-11,  3.00000000e+00])status: 0success: Truex: array([2.85788627e-13, 5.03802074e-12, 2.00000000e+00])

四、用excel求解

①根据公式自行推导
结果如下:

②根据excel的自带规划求解
结果如下:

五、分析结果

用四种方式都都能很好的计算出最优解,但在用python包scipy的优化包optimize计算时,发现结果不太一样,百度后仔细一看,原来是精确度的问题。最后求出的目标函数最大值都是2。这四种方式相比之下,发现用python求解是简单,最方便的,而用excel求解太繁琐了,一不小心就要出错,要十分仔细。

参考链接:https://ismango.blog.csdn.net/article/details/105604577

大M法的python编程求解和python包求解相关推荐

  1. python编程入门电子书-Python编程基础 PDF 原书高质量版

    给大家带来的一篇关于Python入门相关的电子书资源,介绍了关于Python编程基础.Python编程教程方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小6 MB,张健 张良均编写,目前 ...

  2. 山东python编程培训,Python进入山东省小学教材了

    根据最近火爆朋友圈的一则消息,Python已经进入山东省小学教材.Python这几年的火热,离不开人工智能和机器学习. 已经没有什么能够阻挡Python了.根据国务院<新一代人工智能发展规划的通 ...

  3. 青少年python编程入门书-青少年Python编程入门——图解Python

    商品详情 书名:青少年Python编程入门--图解Python 定价:69.8 ISBN:9787121395543 作者:傅骞 版次:第1版 出版时间:2020-09 内容提要: 本书介绍pytho ...

  4. arcgis python编程案例-ArcGIS Python编程案例-电子资料链接

    ArcGIS Python编程案例(1)-Python语言基础 https://www.jianshu.com/p/dd90816d019b ArcGIS Python编程案例(2)-使用ArcPy编 ...

  5. 青少年python编程入门书籍_新书推荐 | 《青少年Python编程入门——图解Python》

    原标题:新书推荐 | <青少年Python编程入门--图解Python> 随着信息时代的到来,在编程教育中进行计算思维培养正在成为信息技术教育关注的重点.<普通高中信息技术课程标准( ...

  6. python编程入门视频教程-PYTHON编程从0到1(视频教学版)

    本书以Python语言构建了程序设计基础课程的教学体系.本书在对程序设计核心方法的探讨上较其他Python书籍更为全面和深入.通过对本书内容的学习,读者将全面地掌握用Python进行程序设计的基本能力 ...

  7. 郑州python编程_郑州python班

    为了提高模块加载的速度,每个模块都会在__pycache__文件夹中放置该模块的预编译模块,命名为module.version.pyc,version是模块的预编译版本编码,一般都包含Python的版 ...

  8. 想学python编程-想学Python编程?你真的适合吗?

    原标题:想学Python编程?你真的适合吗? 有的人说我想学什么.我想干什么,很多时候都是头脑发热,单凭一腔热血,可是这样的路即便走上去你又能坚持多久呢?所以,每每有人问我学Python编程怎么样,我 ...

  9. 学会python编程容易吗-Python 适合初学编程的人学吗?

    相信对于每个人而言,知道编程和学习编程这件事,出发点是不同的.汤哥在北京接触编程的时间是2013年,那个时候还在一个二线城市上大学,还没有这么多各种融资,各种互联网创业的氛围,大家想的更多的是一些线下 ...

  10. python编程基础语法-Python编程基础语法快速入门

    1. 课程咨询加老师助理微信:助理1微信: chenjinglei88 ,助理2微信: omf6757 2. 决定购买并想得到陈敬雷老师亲自指导(课程或自己项目难题均可)加老师微信: chenjing ...

最新文章

  1. Acronis移动方案(四)
  2. 触摸事件练习 -- 手势解锁
  3. canvas实现的喜羊羊图像效果
  4. 相对完善的Java通过JDBC操纵mysql的例子
  5. 熊猫分发_熊猫新手:第一部分
  6. bootstrap 取消_学习写个网站(5)Bootstrap学习2
  7. think php5关联模型,thinkphp5的模型中使用关联
  8. Centos系统服务FAQ汇总(下)
  9. [k8s]dashboard1.8.1搭建( heapster1.5+influxdb+grafana)
  10. 华为机试HJ90:合法IP
  11. Atitit 模板引擎总结 v4 saa 目录 1. 模板引擎 1 1.1. 构成渲染引擎+指令系统 1 1.2. 模板语法mustache语法 es6 el语法 1 2. 常见模板步骤 1 2.
  12. vue.js 带有正则选择的车牌控件组件
  13. 50行python代码写个计算器教程
  14. VideoSolo Blu ray Player for Mac(mac蓝光播放器)
  15. 移动端App弱网测试
  16. 3d transform的(x、y、z)坐标空间及位置
  17. 数字地图制作原则细节
  18. [USACO07FEB] Lilypad Pond
  19. [PPT] 设定PPT默认字体
  20. 2020网络安全NISP一级(模拟题五)

热门文章

  1. 机器人门禁控制盒怎么接线方法_机器人自助出入门禁的系统的制作方法
  2. CES归来---话说AR眼镜
  3. 46 《未来的工作》 -豆瓣评分7.0
  4. h700整列卡直通配置_dell raid h700 perc h800阵列卡配置完全手册图解.doc
  5. 二叉搜索树 【数据结构】
  6. 【开源项目学习】源码剖析,学习仿网易云音乐app代码
  7. 中国污泥处理处置行业前景趋势研究及投资风险分析报告2022-2027年新版
  8. 第4章_Java仿微信全栈高性能后台+移动客户端
  9. 社群管理助手有什么用
  10. 分布式基础通信协议:paxos,totem和gossip