大M(简单形法)、拉格朗日线性规划求解

文章目录

  • 大M(简单形法)、拉格朗日线性规划求解
    • 1、大M(简单形法)原理定义
    • 2、大M(简单形法)求解步骤
    • 3、例题求解
      • (1)excle处理:
      • (2)excle数据分析求解
        • <1>excle 表格如下
        • <2>数据分析处理结果
      • (3)python 程序处理如下:
        • <1>程序如下(非引用相关库):
        • <2>引用scipy库

1、大M(简单形法)原理定义

在线性规划问题的约束条件中加人工变量后,要求在目标函数中相应地添加认为的M或一M为系数的项。在极大化问题中,对人工变量赋于一M作为其系数;在极小化问题中,对人工变量赋于一个M作为其系数,M为一任意大(而非无穷大)的正数。把M看作一个代数符号参与运算,用单纯形法求解,故称此方法为大M法,也可称为惩罚因子法。

2、大M(简单形法)求解步骤

应用单纯形法在改进目标函数的过程中,如果原问题存在最优解,必然使人工变量逐步变为非基变量,或使其值为零。否则,目标函数值将不可能达到最小或最大。在迭代过程中,若全部人工变量变成非基变量,则可把人工变量所在的列从单纯形表中删去,此时便找到原问题的一个初始基可行解。若此基可行解不是原问题的最优解,则继续迭代,直至所有的检验数都小于等于0,求得最优解为止。

3、例题求解

(1)excle处理:

题目相关约束条件如下,求解2x1+x2+x3最大值:

第1步 标准化为:

明显的,x1和x5可分别作为第2行和第3行的基变量,因此,只在第1行引入人工变量,不必每行均引入人工变量。

第2步
填写初始单纯形。 以x1、X5、y1为初始基变量,如图1中A1:K8所示填写初始单纯形。
①在E1:J1、E2:J3、C4:C6、A4:B6、B4: B6、D4:D6、E4 :J6中依次填写约束变量、目标系数、基变量、基变量的目标系数、约束值、约束矩阵。

②A7填写目标值中M的系数,公式为
= SUMPRODUCT( A4 :A6,D4 :D6)

③B7填写目标值中常数项,公式为
= SUMPRODUCT( B4 : B6 ,D4:D6)

④E7填写检验数中M的系数,公式为
=E$2 - SUMPRODUCT( $ A4: $ A6, E4:E6)如图2所示,设置E7的条件格式,条件公式为=AND(E7>0,E7=$K7)

具体格式自定,醒目即可。把E7向右- -直复制到J7。⑤E8填写检验数中常数项,公式为=IF(E7= $K7,E $3 - SUMPRODUCT( $ B4:$B6,E4:E6),"")

设置E8的条件格式,条件公式为
= AND( E8 >0,E8= $ K8)

把E8向右一直复制到J8

⑥K7填写检验数中M的最大系数,公式为= MAX( E7:J7)
把K7复制到K8。

第3步 检验最优解。
检验数E7:J7中有正数,需要换基。

第4步 选择人基变量。
E8:J8 中只有G8这- -个检验数 ,因此,x3 人基。

第5步 选择出基变量。
K4中填写公式= IF(G4 >0,D4/G4,"")
并向下- -直复制到K6。出基值K4:K6中最小正数在K4和K5,不妨选x出基。

第6步 换基。
把A4:K8复制到A9:K13, C9、A9、B9 中相应填写人基变量x3及其目标系数。D9:D11中依次填人公式

=D4、=D5-D9、=D6 +D9

并向右一直复制到J列。然后,转回第3步。

第3步(第2次)检验最优解。
检验数E13:J13中有正数,需要换基。

第4步(第2次)选择人基变量。
检验数E13:J13中最大数在F13,因此,x2人基。

第5步(第2次)选择出基变量。
K9 中填写公式=IF(F9>0,D9/F9,"")
并向下- -直复制到K11。出基值K9:K11中最小正数在K10,因此,x;出基。

第6步(第2次)换基。
把A9:K13复制到A14;K18 ,C15、A15、B15中相应填写人基变量x2及其目标系数。
D14:D16 中依次填人公式
=D9、=D10+2* D14、=D6- D14
并向右一-直复制到J列。然后,转回第3步。

第3步(第3次)检验最优解。
检验数E17:J17和E18:J18中均没有正数,基中没有人工变量,因此,当前单纯形的可行基解是最优解(之一)。

至此,得最优解x, =x2 =0,x3 =2,最优值为2。.另外,松驰变量xs =0,xs =3,人工变量y1 =0。

(2)excle数据分析求解

<1>excle 表格如下

<2>数据分析处理结果

(3)python 程序处理如下:

<1>程序如下(非引用相关库):
# 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('目标函数最小值: %f' % obj)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()

执行结果如下:

<2>引用scipy库
import numpy as np
from scipy import optimize as op
# 给出变量取值范围
x1=(0,None)
x2=(0,None)
x3=(0,None)
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))#调用函数进行求解
res

程序运行结果如下:

求解得到最大值结果为1.9999999

大M(简单形法)线性规划求解相关推荐

  1. 使用python scipy.optimize linprog和lingo线性规划求解最大值,最小值(运筹学学习笔记)

    1. 线性模型 2. 使用python scipy.optimize linprog求解模型最优解: 在这里我们用到scipy中的linprog进行求解,linprog的用法见https://docs ...

  2. 【运筹学】线性规划数学模型 ( 单纯形法 | 迭代原则 | 入基 | 出基 | 线性规划求解示例 )

    文章目录 一.单纯形法计算示例 ( 上篇博客回顾总结 ) 二.迭代原则 三.最优解推导 四.出基与入基 五.出基与入基变量选择 一.单纯形法计算示例 ( 上篇博客回顾总结 ) 在上一篇博客 [运筹学] ...

  3. 线性规划编程求解C语言,C语言大作报告线性规划求解基科3字班.doc

    C语言大作报告线性规划求解基科3字班.doc C语言大作业选题设计报告线性规划求解程序一. 概述运筹学(OR)作为强有力的数学工具,在管理科学.决策科学中起到了举足轻重的作用.当最优化的约束条件是线性 ...

  4. 基于沙猫群优化算法的线性规划求解matlab程序

    基于沙猫群优化算法的线性规划求解matlab程序 1 沙猫群优化算法 沙猫的中文学名叫沙丘猫,俗名沙漠猫,与荒漠猫名字相似,但却是两种不同的猫科动物.沙猫生活在茫茫沙漠里,主要分布在分布于非洲北部,阿 ...

  5. 基于人工蜂群算法的线性规划求解matlab程序

    基于人工蜂群算法的线性规划求解matlab程序 1 人工蜂群算法概述 2005年D. Karaboga教授仿照蜜蜂集群采蜜生物行为,提出了人工蜂群仿生算法,可以有效解决有关函数优化等相关难题.ABC算 ...

  6. 【运筹学】线性规划数学模型 ( 线性规划求解 | 根据非基变量的解得到基变量解 | 基解 | 基可行解 | 可行基 )

    文章目录 一.线性规划求解 二.根据非基变量的解得到基变量解 三.基解 四.基可行解 五.可行基 一.线性规划求解 在上一篇博客 [运筹学]线性规划数学模型 ( 求解基矩阵示例 | 矩阵的可逆性 | ...

  7. Python数学模型——线性规划求解(一)

    线性规划求解 线性规划求解主要弄清楚两个部分,目标函数(max,min)和约束条件(s.t.),我们求解时一般要化为MATLAB标准形式 mincTxs.t.⎧⎩⎨Ax<=bAeq∗x=beql ...

  8. 线性规划求解器总结与比较

    文章目录 Gurobi CPLEX GLPK CBC 线性规划是一种优化问题,其目标是在一定的约束条件下,最大化或最小化一个线性目标函数.线性规划在生产计划.货物运输.网络流量管理等领域都有广泛应用. ...

  9. Excel与Google Sheets中实现线性规划求解

    很久没更新过APS系列文章了,这段时间项目工作确实非常紧,所以只能抽点时间学习一下运筹学的入门知识,算是为以后的APS项目积累点基础.看了一些运筹学的书(都是科普级别的)发现原来我目前面对的很多排产. ...

  10. 【运筹学】线性规划数学模型 ( 单纯形法 | 最优解判定原则 | 线性规划求解示例 )

    文章目录 一.单纯形法计算示例 二.转化标准形式 三.查找初始基可行解 四.列出单纯形表 五.最优解判定 在上一篇博客 [运筹学]线性规划数学模型 ( 单纯形法 | 最优解判定原则 | 单纯形表 | ...

最新文章

  1. 无限极评论回复插件_如何一键修复上色破损的旧照片?老照片有救了,用这个魔法插件...
  2. 仿生计算(参考神经网络)2017年考试卷子,考前抱佛脚必备!!中英翻译版本!!
  3. RedHat7安装Tomcat
  4. 指定rviz的点启动_好消息!武汉已经启动新冠疫苗紧急接种工作
  5. Python 线程优先队列 PriorityQueue - Python零基础入门教程
  6. df 和 ll 等命令无响应处理
  7. 简单直观理解形态学中的开运算和闭运算
  8. 光纤MPO端面脏了也会造成您所不知道的故障
  9. 截取安卓直播APP中的视频流 -央视频或者斗鱼直播下载+
  10. 用Retinaface_pytorch项目检测人脸+ Python 3 剪切人脸图片并保存
  11. 三位一体的漏洞分析方法-web应用安全测试方法
  12. 正常图片转灰色图片——灰度图
  13. java实现变声器--变声萝莉
  14. Python爬虫入门教程 19-100 51CTO学院IT技术课程抓取
  15. 运动会分数统计的实验报告(数组实现)
  16. Dubbo跟Spring Cloud哪个更好用?“微服务”第二代又赢了!
  17. 街霸 隆(Ryu)升龙拳(Syoryuken)动画(四)制作过程中几个版本动画比较一下
  18. 【信号与系统】(二十二)拉普拉斯变换与复频域分析——s域分析
  19. 「 运动控制 」“关节空间与笛卡尔空间进行轨迹规划”研究
  20. 决定一个人成功的七大特质!

热门文章

  1. 【备忘】elasticsearch所有版本的x-pack-sql-jdbc下载地址
  2. 操作系统进程调度算法总结
  3. pcm2wav matlab,matlab输出pcm格式文件
  4. MXY-API管理系统安装教程
  5. 记一次调试YOLOv5+DeepSort车辆跟踪项目的经过
  6. 电子元器件选型——电阻
  7. matlab——矩阵运算
  8. Python 源代码代码打包成 whl 文件
  9. 规范-阿里代码规范设置
  10. 快速提取年龄,身份证提取年龄的公式