精华内容
下载资源
问答
  • 两阶段法和单纯形法

    2014-04-10 14:10:19
    庞海藏-运筹学-两阶段法和单纯形法.
  • 单纯形法之两阶段法

    千次阅读 2020-10-05 10:46:33
    单纯形法之两阶段法单纯形法之两阶段法两阶段法具体思路解的判别 单纯形法之两阶段法 单纯形法基本步骤 两阶段法具体思路 解的判别

    单纯形法之两阶段法

    单纯形法基本步骤

    N
    Y
    化标准型
    确定初始基可行解
    检查是否为最优解
    确定改善方向
    求新的基可行解
    求最优目标函数

    两阶段法具体思路

    • 构造合适目标函数找出一组可行基
    • 构造 Z = − x n + 1 − x n + 2 Z=-x_{n+1}-x_{n+2} Z=xn+1xn+2;也能换出人工变量
    • Z Z Z达到最大值 0 , x n + 1 , x n + 2 0,x_{n+1},x_{n+2} 0,xn+1,xn+2为0,有两种可能:
      a、 x n + 1 , x n + 2 x_{n+1},x_{n+2} xn+1,xn+2成为非基变量。得到不包含人工变量的初始可行基。进入下一阶段。
      b、 x n + 1 或 x n + 2 x_{n+1}或x_{n+2} xn+1xn+2是基变量,但为0。退化。
      4. Z Z Z达到最大但不是0,说明起码不可能将人工变量完全换出,问题无解。

    解的判别

    • 无界解
      目标函数为最大,如果换入变量 x k x_k xk所在系数均小于等于0,即 a i k ′ ≤ 0 ( i = 1 , 2 , 3...... m ) a_{ik}^{'}≤0(i=1,2,3......m) aik0i=1,2,3......m),则利用最小规则无法得到一个换出变量。
    • 无穷多解
      非基变量检验数等于0,表示换入换出一样,所以有无穷多解。
    • 退化解
      一般情况,基可行解中非0分量个数等于约束方程的个数m。如果某一基可行解中非0分量个数小于m,即一些基变量值等于0,该基解为退化解。
      θ \theta θ规则确定换出变量时,同时存在两个以上相同的最小比值,在下一次迭代中就有一个或几个基变量等于零,这就出现了退化解,继续迭代,目标值不变,造成死循环。
      判别:当 b i b_i bi中有一个以上为0时,就称为退化。
      避免:摄动法,词典序法,“勃兰特”法
    展开全文
  • 运筹学两阶段法C语言程序代码.
  • 完整的两阶段法,程序可完美下载,熟悉单纯形算法和两阶段算法,并会使用两种算法求解线性规划问题,内有例题
  • 分析了两阶段法的原理,并以某矿通风系统优化指标体系为研究对象,采用两阶段法计算其指标权重。将两阶段法与层次分析法进行对比分析,结果表明,采用2种方法确定的指标权重重要性序列相同,两阶段法的计算结果可靠性高,...
  • Python求解线性规划问题_两阶段法实现的单纯形法,包括.py和.ipynb两种格式,用Jupyter Notebook打开.ipynb或者用Python软件打开.py都可成功运行,压缩包中包括测试数据,代码可输出唯一解,无穷多解,无界解,无解...
  • 最 优 化 方 法 课 程 设 计 题 目 两阶段法分析与实现 院 系 数学与计算科学学院 专 业 统计学 姓名学号 张雨坤 1200720216 指导教师 李丰兵 日 期 2015 年 01 月 22 日 摘 要 常用的解线性规划问题的方法有图解法 ...
  • 两阶段法-线性规划的单纯形法6_两阶段法.ppt
  • 线性规划单纯形法-大M法和两阶段法程序实现(MATLAB)。程序有详细的注释。通俗易懂。 程序共有三个函数:main函数、twophase.m函数、MySimplex_method.m函数。 其中twophase.m函数是利用两阶段单纯形法。MySimplex...
  • 学习笔记 | Heckman两阶段法介绍

    万次阅读 多人点赞 2020-10-27 20:05:01
    最近看的两篇VC文献,都是有使用到Heckman两阶段法,所以就借此机会系统学习了Heckman两阶段法 本篇内容主要学习了如下文章: 1 CJAR的带你了解Heckman两步法 2 计量经济圈的Heckman两步法是什么? 及其内生性问题? 3...

    最近看的两篇VC文献,都是有使用到Heckman两阶段法,所以就借此机会系统学习了Heckman两阶段法

    本篇内容主要学习了如下文章:
    1 CJAR的带你了解Heckman两步法
    2 计量经济圈的Heckman两步法是什么? 及其内生性问题?
    3 Stata连享会的Heckman 模型:你用对了吗?
    4 会计学术联盟的玩转Stata | Heckman两阶段-内生性处理利器​
    5 社经研究社的您真的懂得如何运用Heckman模型检验吗?

    这几篇文章都很有用,这几个公众号也很赞,所以可以多学习多学习~~

    1 Heckman两阶段法来源

    Heckman两阶段法是由Heckman(1979)提出,主要用于解决样本选择偏差(sample selection bias)问题。那么样本选择偏差问题是什么呢?其实就是内生性的一种。学习内生性,可以看我之前的一篇笔记学习笔记 | 内生性全面介绍

    具体而言,样本选择偏差包括两种,一种是不是随机性导致的样本偏差,一种是由于样本自选择导致的偏差。下面介绍一下

    1.1 样本不存在随机性

    样本不存在随机性就是研究人员根据自己设定的规则抽取样本,而不是随机抽样

    举例1:研究人员在研究公司治理问题时只收集了发达地区的公司作为样本。
    举例2:以“找熟人”为研究对象,来探讨使用社会资本对求职结果的影响。假设我们是采用采访的方式,询问自己的工作是不是通过找熟人获得的,来识别这个人是不是使用社会资本。但值得注意的是,那些具有社会资本,但不想使用,可能是高自尊心,或者是想通过自己努力来获得。我们通过采访,进而错过了这些样本,或者说我们只是圈住了那些不自尊、不努力的样本,由此我们使用一个不自尊、不努力的样本来研究社会资本的效应,由此是会高估结果的。

    1.2 样本自选择

    自选择是指由于经济个体(个人、家庭或厂商)本身具有选择判断能力,因此很可能会采取一些影响抽样过程的行动,从而使抽样失去随机性,造成所收集到的样本不能比例地代表总体。

    举例:若我们想研究妇女年龄与工资收入,虽然我们可以观测到有工作的妇女的实际工资收入,但是不知道没有工作的妇女的“保留工资”(即愿意工作的最低工资)。于是我们收集数据时就会缺失没有工作的妇女样本。

    1.3 选择偏差产生的后果

    整体而言,基于以上两种情形,被选择的样本都无法代表总体,使用这样的样本进行研究是得不到准确的结果的。
    延续之前的例子,
    比如我们要研究妇女年龄和工资的关系、。显然我们只可能从有工作的妇女那儿获得有关工资的数据,无法获得没出来工作的妇女的数据,这样的话,就存在低估效应。具体而言:

    在这里插入图片描述

    因为有不小比例的妇女没有参加工作,对这些人,我们知道性别,却不知道一小时可以挣多少钱。一般地,人们是否参加工作取决于实际可得的工资与意愿工资,当工资低于意愿工资时,人们就会选择不工作。把不工作这部分人也搬到我们的图上,其分布就是图中的空心点。如图可知,实线是根据总样本(黑点加白点所代表的样本)回归所得,而虚线是根据我们选择的样本回归所得。两线斜率、截距明显不同,即样本选择会带来偏误。可以发现,如果只拿实心点研究,得出的结论实际上低估了受教育程度对工资的影响。

    为此,Heckman两阶段法被提出来了!他的大致原理是:
    首先,估计出妇女参加工作的概率(可能性)多大,这可以通过经验数据模型得到。然后,删去不工作之妇女的样本,将余留的样本点依其工作概率的不同,垂直往下位移。工作概率愈小,向下位移愈大;工作概率愈大,向下位移愈小。工作概率百分之百的,不作位移。(实心点下移到由空心点标示的新位置。)
    在这里插入图片描述
    然后,对位移后的样本点,求出其回归线。理论上可以证明,这条回归线,与第一个图中标出的真实关系线,应当是一致的
    在这里插入图片描述

    2 Heckman两阶段法原理

    参考自:Stata连享会的Heckman 模型:你用对了吗?

    2.1 基本原理

    两阶段法包括两个阶段: 处理效应 (treatment effect model)、样本选择 (sample selection model)。

    处理效应 (treatment effect model):回归模型中包含一个内生的指示变量(D)。如妇女年龄对工资的影响,(出来工作的女性D=1,没有出来工作的女性D=0)即模型(1),也就是我们要预测的模型(回归模型),θ就是我们关注的
    在这里插入图片描述

    样本选择 (sample selection model):回归样本为一个子样本。例如,在女性样本中 (D=1)分析妇女年龄与工资关系。由于传统上,部分女性因为实际给的工资与意愿工资不一样,所以选择留在家庭。因此,在模型(2)中,D=1内生的 ,导致模型(1)有偏估计。
    在这里插入图片描述

    通常,式 (1) 和式 (2) 的随机误差项u 和 v 服从二元正态分布,其均值为 0,协方差矩阵为:
    在这里插入图片描述
    如果随机误差项u 和 v相关 (p不等于 0),则E(u|D)不等于0 ,使得式 (1) 中的 OLS 估计量 θ有偏。

    Heckman 方法就是通过式 (2) 构造 逆米尔斯比率 (IMR) 控制这个偏差。 计算如下:
    在这里插入图片描述

    2.2 方法评价

    综上,也就说我们传统采用OLS估计θ
    在这里插入图片描述
    这里我们引入了逆米尔斯比率(IMR)来修正模型(1)中由D引起的选择偏误
    在这里插入图片描述
    而IMR能够识别选择偏误,主要是通过:

    • (1)IMR是X 和Z 变量的非线性函数
    • (2)Z变量从式 (3) 中已经排除。

    那么 Z变量是什么呢?Z被假定为不会对 Y 变量产生直接的影响,只能通过IMR 产生间接影响,因此也被称为排他性约束 (exclusion restrictions)。Z也被成为排他性约束变量。

    那么Z(排他性约束变量)需要满足什么条件呢?简单而言,就是要满足工具变量的条件,排他性和相关性。

    在这里插入图片描述
    但是问题又出来,工具变量的选择一般是很难的,所以我们进行第一阶段的选择模型时,如果没有Z,可以仅把第一阶段的X(即控制变量)放入进行probit回归,通过IMR的非线性去识别偏差。但可能面临以下两个问题:

    • 由于只能通过IMR 的非线性识别偏差,非线性模型被错误设定为线性模型会被IMR吸收。
    • 在式 (3) 中,IMR 与X 和 D 相关,这种相关性在没有排他性约束变量 (Z) 情况下更加严重。

    进一步,高的共线性会产生以下两个问题:

    • 高共线性会使得系数的标准差变大,降低了系数的显著性。IMR系数可能会变得不显著,进而得出错误结论
    • 在模型被正确设定下,即使存在高的共线性问题,系数也可以被无偏的估计。但是,事实上,选择模型被错误设定概率是很高的。若模型被错误设定,共线性会吸收这种偏差,导致系数估计有偏。所以我们在采用时,要进行VIF检验共线性问题

    3 Heckman两阶段法实现

    3.1 实现步骤

    我们还是一如既往以妇女年龄与工资的研究为例,具体步骤如下:

    • 第一步:利用从全部妇女(包括出来工作的和留在家里的)中随机抽取的样本,估计妇女出来工作的倾向模型;并利用估计结果计算逆米尔斯比的值。
    • 第二步,利用选择性样本观测值和计算得到的逆米尔斯比的值,将(ρσ,)作为- 一个待估计参数,估计妇女年龄与工资模型,得到β的估计。
      -注意,在抽取样本时间必须保证所有选择性样本包含于全部样本之中。

    实现方法有两种途径:
    方法一:Heckman Y(因变量) X(控制变量), select (D(自变量哑变量) =Z(工具变量其他影响因素) X(控制变量)) twostep
    这种方法成为最大似然估计 (Maxlikelihood Estimation, MLE)

    方法二:先在第一阶段中计算出除逆米尔斯比率IMR,再在第二阶段中将逆米尔斯比率imr作为控制变量,予以考察。基本步骤如下:
    步骤1: 通过运用probit模型计算影响所考察变量的哑变量(0-1)的影响因素(即“第一阶段”),
    步骤2: 在上述一步基础上,计算预测:predict w,xb,
    步骤3: 再次,计算生成:gen IMR=normalden(w)/normal(w),
    步骤4: 最后,将所生成的逆米尔斯比率IMR引入主要考察模型,并予以控制(即“第二阶段”)。
    这种方法就是常用的两步法

    3.2 实现示例

    参考自:Stata连享会的Heckman 模型:你用对了吗?

    这里搬运的是一个大家都使用的示例,都是女性与工资,不过是女性教育与女性工资的关系。会用上面的第一种和第二种方法分别示例。

    首先,我们还是来先谈一下如何选择排他性变量来处理选择性偏误。

    了解女性教育对工资的影响,那么这里需要注意到,有些受了教育但也没有参加工作,那这部分样本需要特殊处理。所以,我们就先预测一个女性参加工作的可能性,然后再在那些参加了工作的女性样本中回归工资和教育水平。

    预测一个女性参加工作的可能性通过age(年龄) education(教育) married(是否结婚) children(孩子数量)
    通常我们认为结婚与孩子的数量一般会与妇女愿不愿出来工作有关,但是与妇女获得工资无关,所以满足排他性和相关性要求,选择为排他性变量

    *数据来源: https://gitee.com/arlionn/data
    use womenwk.dta, clear   
    
    *描述性统计数据
    sum age educ married children wage 
    
    *简单的ols模型,存在选择性偏误
    reg wage educ age
    est store OLS
    
    *第一种方法  heckman maximum likelihood
    heckman wage educ age, select(married children educ age) //默认最大似然估计
    est store HeckMLE
    
    *第二种方法  heckman two-step  all-in-one 不可以进行cluster调整
    heckman wage educ age, select(married children educ age) twostep
    est store Heck2s
    
    *第二种方法  heckman two-step  step-by-step 可以进行cluster调整
    probit work married children educ age
    est store First
    predict y_hat, xb
    gen pdf = normalden(y_hat)  //概率密度函数
    gen cdf = normal(y_hat)     //累积分布函数
    gen imr = pdf/cdf           //计算逆米尔斯比率
    reg  wage educ age imr if work == 1  //女性工作子样本
    est store Second
    vif  //方差膨胀因子
    
    *对比结果
    local m "OLS HeckMLE Heck2s First Second"
    esttab `m', mtitle(`m') nogap compress pr2 ar2
    

    4 Heckman两阶段法注意事项

    1. 虽然有人在运用该方法时,在第一步没有选择排他性变量,但一般模型的运用是需要一个工具变量问题。因为在前面我们也讲过,如果不加入会存在共线性问题,估计也存在偏误。
    2. 工具变量的选择需要很多的思考。我看到之前有很多人用变量密度或者区域经济变量均值作为工具变量。在选择工具变量的时候,我们需要解释一下为何选择要有具有的支撑。

    以李小荣和刘行(2012)高管性别与股价崩盘风险的研究为例。第一阶段回归Probit模型(女性高管=1),模型中加入影响女性高管选择的因素和排除性约束变量。排除性约束变量为同年同行业中其他公司的女性CEO比例,由于已有文献证明同年同行业中其他公司的女性CEO比例影响本公司CEO性别选择;同年同行业中其他公司女性CEO的比例对本公司的股价崩盘风险无直接影响。

    1. 在第一阶段中,因变量为0-1哑变量,所以第一阶段一般都是运用Probit分析模型。此外,在第二阶段分析中,当引入IMR予以控制后,选择偏误调整项IMR系数如果通过显著性检验,这表明虚拟变量选择的内生性偏误一定程度是存在的,这表明采取文章分析样本自选择问题是必要的,这将进一步提升文章研究结论的稳健性。

    2. 将IMR放入第二阶段可能会造成多重共线问题,因此需要在回归结果中报告VIFs(Variance Inflaction Factors)。通常认为VIFs值超过10,即存在多重共线问题。

    3. 需要注意的是,方法一中Heckman直接命令代码的运用具有明显的局限性,这里的因变量一般要求为“连续性变量”,而当因变量为哑变量(0-1)或其他非连续性变量时,上述方法一的直接运用将存在明显的统计偏误。为此,当在实证研究过程中,遇到因变量为非连续性变量时,方法一不再适用,可借鉴方法二,将Heckman二阶段分析进行拆分。

    4. 多数论文使用两步法省略了报告第一阶段。有必要明确报告第一阶段模型使用了哪些变量,以便清楚地识别排除性约束变量。第二阶段的回归模型中,除排除性约束变量外,需加入第一阶段模型的所有控制变量。

    5. 在使用过程中,可以综合借鉴和学习如下这三篇文章。
      Lennox C S, Francis J R, Wang Z. Selection models in accounting research[J]. The accounting review, 2012, 87(2): 589-616.
      Kim C, Zhang L. Corporate political connections and tax aggressiveness[J]. Contemporary Accounting Research, 2016, 33(1): 78-114.
      李小荣, 刘行. CEO vs CFO: 性别与股价崩盘风险[J]. 世界经济, 2012, 12: 102-129.

    展开全文
  • 浅析大M法与两阶段法的一致性,很不错的一篇论文
  • 运用两阶段法解决LP问题,这是一个实验报告,里面有两个例子可供初学者看懂程序。
  • Word Word文档 GUILIN UHiVfRSITY OF ELECTHCNIC TfCMNOLO&Y 最优化方法 课程设计 题 目 两阶段法分析与实现 院 系 数学与计算科学学院 专 业 统计学 学号 雨坤 1200720216 指导教师 丰兵 日 期 2015 年 01 月 22 日...
  • 10分钟看明白大M法和两阶段法

    千次阅读 多人点赞 2020-10-16 14:49:04
    相信学习本章节的朋友都是掌握了单纯形法后,准备学习大M和两阶段法,但是却不知道如何下手;亦或是知道大概过程但是又不清楚中间原理如何实现的。那么这篇文章将会解决以上两种情况给大家带来的困惑。 首先我们先...

    相信学习本章节的朋友都是掌握了单纯形法后,准备学习大M和两阶段法,但是却不知道如何下手;亦或是知道大概过程但是又不清楚中间原理如何实现的。那么这篇文章将会解决以上两种情况给大家带来的困惑。

    首先我们先提出几个问题:
    1. 为何学过单纯形法后还要继续学习大M法和两阶段法。
    2. 大M法和两阶段法的过程有何不同,不同应用场景怎样灵活使用。


    针对问题一: 在运用单纯性法解题时,我们通常会苦恼于其繁琐的过程----换基迭代,一个不小心就会计算错误,但是除了这个问题以外,我们在还没有进行画表,即进行选择基向量时也有可能不知所措。这是因为我们平时遇到最多的情况就是不用进行初等行变换就可以得到单位矩阵,进而直接将其作为基向量进行单纯性表的计算,从而忽视了一些特殊情况。这种情况就是无法直接得到单位矩阵----即无法直接得出基向量,在这种情况下我们就需要运用大M法和两阶段法来进行寻找基变量。


    针对问题二: 在讲解问题二之前,我们先来说明以下大M法和两阶段法的应用是如何实现的,相信这也是大多数人点进来的原因。接下来的讲解中我们以下面这个线性规划问题为例。

    minS = 2x1 + 3x2 + x3

    x1 + 4x2 + 2x3 ≥ 8

    3x1 + 2x2 ≥ 6

    x1,x2,x3 ≥ 0


    下面使用 大M法进行大致解答(解题过程中会省略迭代,建议看完后自己动手写一遍):

    1. 首先,我们要将不等式化为标准形式,但化完之后----也就是添加过‘-x4’和‘-x5’后,并不能直接得到单位矩阵,正如上文所说,这就是大M法等要引入人工变量的情况。为了得到单位矩阵,我们要将原式化成:

    在这里插入图片描述

    1. 根据上图,我们可以发现x6和x7已经构成了单位矩阵,所以接下来我们就可以将其按照一般单纯形法的解题过程进行求解。特别说明:当人工变量出基之后就不要再让其入基,毕竟我们的目的就是以人工变量为跳板求出需要的基变量。最终结果为X{4/5,9/5,0,0,0}; 最优值S = 7(博主自己求解的,答案仅供参考,不一样请留言)

    其中M指的是一个绝对值无限大的值,一般情况下在函数为Min时要用’M‘,在Max情况下要用'-M'。目的是保证人工变量一定能够被替换----出基,因为最后大M法中所引入的人工变量最后的赋值均为0,否则等式也不会成立。


    接下来讲解一下 两阶段法 的求解过程:

    (下文部分引自知乎网友:饭饭。原文有改动)

    第一阶段: 首先,构造一个只含有人工变量的目标函数,并求其极小值(标准化)。如果,最后能求得Z=0(Z = y1+y2+y3…)。说明原目标函数存在基可行解。因为添加的人工变量本来是作为基变量,最后得到的最优单纯型表显然是把人工变量转变成了非基变量,因为非基变量等于零才有Z=0(也就是所有的人工变量都已经出基)。所以,此时一定在原有变量的之中找到了基变量,构成了一个单位阵,即找到了存在的初始可行解。既然找到了初始可行解,那么第二阶段就可以进行了。
    第二阶段:(因为之前做的各种行变化,都并不影响约束条件本身。)去掉人工变量,把价值系数换成原本的系数。就可以像初始单纯型表那样直接计算了。

    对于仍然不理解为何Z值为0,就说明原式有可行解的朋友。我先抛砖引玉的大概说下:y变量是我们为了找到基变量所引入的人工变量,而人工变量只能从原有的x中去寻找,所以最终基变量中一定是不会存在y变量的(若有可行解的话),那么此时y变量一定是出基变成了非基变量,也就是最后赋0,因此Z=0。

    (下文部分引自知乎网友:常枫浩。原意无改动)

    我的想法:人工变量是强行引入的(比如国足引入里皮),与原变量无关,所以如果确定的初始可行解含有人工变量(必须有里皮才可以,离不开里皮),则说明原问题必须引入外变量才有解(说明国足必须引入外援才行),这说明原问题无解(说明国足真的不行)。反之,若最终确定的可行解不含人工变量(最后赶走里皮国足还行),则说明原问题有可行解,在这个基础上求最优解即可。

    用两阶段法怎样解题

    如上文所说,首先构造一个只含人工变量的目标函数,并将人工变量加入等式中,有几个等式就创建几个人工变量(这里忽略标准化过程),博主没有查到为何要将人工变量加入等式中,知道的朋友可以在评论区说一下。
    在这里插入图片描述
    接下来就是以y变量为基变量进行单纯形法的计算,最终如果能够使得所有的人工变量均出基说明有可行解,并且这时只看X等变量,即忽略人工变量的系数值。就可得到目标函数最优解和对应的x解值。最终答案与上文相同。

    原创不易,你的鼓励是最大的支持。(约耗时1小时47分钟)

    展开全文
  • 两阶段法在物流园区选址中的应用,聂冉冉,,物流园区的选址方法主要有模型分析法和层次分析法(AHP)等,采用重心法模型和AHP相结合的选址方法,具有简单易行、定性定量相结合
  • 这是一个用delphy实现的运筹学的两阶段法的源码 欢迎下载
  • 两阶段法解决LP问题

    2009-09-15 15:57:37
    两阶段法解决LP 问题,其中有程序代码,此文件是我个人写的实验报告。
  • 两阶段法-Python实现

    千次阅读 2020-04-18 16:02:59
    Python单纯形法-两阶段法单纯形法简介Python代码如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学...

    单纯形法简介

    在这里插入图片描述
    在这里插入图片描述

    Python代码

    import numpy as np
    import time

    首先设法找到一个(初始)基可行解,然百后再根据最优性条件判断这个基可行解是否最优解。若度是最优解,则输出结果,计算停止;若不是最优解,则设法由当前的基本可行解产生一个目标值更优的新的基本可行解,再利用最优性条件对所知得的新基可行解进行判断,看其是否最优解,这样就构成一个迭代道算法。由于基本可行解只有有限个,而每次目标值都有所改进,因而必可在有限步版内终止。如果原问题确有最优解,必可在有限步内达到;若原问权题无最优解,也可根据最优性理论及时发现,停止计算,避免错误及无效运算。
    由于要解决等式约束,先添加人工变量,求解第一阶段的最小值;再删去人工变量列,添加z=cx的系数矩阵c

    下面将介绍两阶段法的主要结构:

    【求解类型】-最小化问题,等式约束与不等式约束(<=)

    1.主函数

    if __name__ == '__main__':
        #问题求解
    '''
    Min Z=0.4*x1+0.5*x2+0*x3
    st. 0.5*x1+0.5*x2=6
        0.6*x1+0.4*x2-x3=6
        0.3*x1+0.1*x2<=2.7
    ''' 
        c = np.array([-2,3,0,0])
        # 不等式约束<=
        A_ub = np.array([])
        b_ub = np.array([])
        # 等式约束
        A_eq = np.array([[1,-1,1,0],
                     [-3,1,0,1]])
        b_eq = np.array([2,4])
        time.perf_counter()
        digit = 2
        Problem=Simplex(c, A_ub, b_ub, A_eq, b_eq)
        Problem.Main()
        print('Running time: %s Seconds', time.perf_counter())

    2.定义Simplex()大类

    class Simplex(object):
        def __init__(self,c,A_ub,b_ub,A_eq, b_eq):  #初始化函数
            self.c=c            #系数矩阵
            self.A_ub=A_ub      #不等式约束矩阵
            self.b_ub=b_ub      #不等式约束边界
            self.A_eq=A_eq      #等式约束矩阵
            self.b_eq=b_eq      #等式约束边界
            self.N_x=0          #变量个数
            self.meq=0          #等式约束个数
            self.mub = 0        #不等式约束个数
            self.m=0            #约束的总数
            self.T=[]           #将所有数据放入单纯形表T
            self.sign=[]        #记录基变量序号
            self.F=1            #判断迭代进行的情况:
                                # 1——继续迭代
                                # 0——无界解,停止迭代

    3. 将初值全部放入大矩阵T中

    数据初始化函数:

    输入等式约束矩阵A_eq,b_eq,不等式约束矩阵A_ub,b_ub以及求解函数的系数矩阵c(当只有某一个约束时,用空矩阵【】代替);将所有已知参数全部放入单纯形表矩阵T中。获得基变量列表sign

    def Initial_value(self):
        self.N_x=len(self.c)
        # 按照约束类型求解
        if self.b_eq.any():  # 判断等式约束的有无
            self.meq = len(self.b_eq)
        if self.b_ub.any():  # 判断不等式约束的有无
            self.mub = len(self.b_ub)
        self.m = self.mub + self.meq  # 所有约束的行数
        # 建立第一阶段单纯型表。
        self.T = np.zeros([self.m + 1, self.N_x + self.m + 1], dtype='float')
        b = self.T[:-1, -1]
        # 判断两种约束的有无,
        # T矩阵上半部分为等式约束,下半部分为不等式约束
        if self.meq > 0:
            self.T[:self.meq, :self.N_x] = self.A_eq
            b[:self.meq] = self.b_eq
        if self.mub > 0:
            self.T[self.meq:self.m, :self.N_x] = self.A_ub
            b[self.meq:self.m] = self.b_ub
        #人工变量与松弛变量系数设为1
        np.fill_diagonal(self.T[:self.m, self.N_x:self.N_x + self.m], 1)
        # T矩阵最后一行表示(-c)
        # 第一阶段
        self.T[-1, self.N_x:self.N_x + self.meq] = -1 * np.ones(self.meq)
        for i in range(0, self.meq):
            self.T[-1] += self.T[i]
        l = [i for i in range(self.N_x, self.N_x + self.m)]  # 记录基变量列标,也可自行输入列标
        self.sign = list(l)

    4.最优性检验函数

    由于是最小化,当非基变量检验数都小于等于0即可停止运算。1.先判断非基变量检验数是否都小于0,决定是否进行迭代运算;否则,进行迭代运算 def
    calculate(),每一次迭代只会让一个变量离基,一个变量进基。迭代次数由num统计。

    def solve(self):  # 判断是否到达最优解
        num = 0
        flag = True
        while flag:
            # 直至所有非基变量检验数小于等于0
            # 合并多个解的情况,即使非基变量检验数等于0也停止迭代
            if max(list(self.T[-1][:-1])) <= 0:
                flag = False
            # 迭代,直至某个非基变量检验数等于0
            else:
                num += 1
                self.F=self.calculate()
            # 判断无界解,防止无限迭代
            if self.F==0:
                break
    

    5.迭代函数:

    1. 选出最大的检验数,选出出该列bj/yj中最小的一行,变为1,进行迭代运算。运算过程中,用sign【】列表记录并更新基变量的序号。
    # 进行迭代运算
    
    ```python
    def calculate(self):
        H = list(self.T[-1, :-1])
        j_num = H.index(max(H))
        D = []
        for i in range(0, self.m):
            if self.T[i][j_num] == 0:
                D.append(float("inf"))
            else:
                D.append(self.T[i][-1] / self.T[i][j_num])
        if max(D) <= 0:# 判断无界解
            return 0
        # 找出最小比值所在行、列—i_num,j_num
        i_num = D.index(min([x for x in D if x >= 0]))
        self.sign[i_num] = j_num
        t = self.T[i_num][j_num]

    2.高斯消元法换基迭代

    #换基迭代
    self.T[i_num] /= t
    for i in [x for x in range(0, self.m + 1) if x != i_num]:
        self.T[i] -= self.T[i_num] * self.T[i][j_num]
    return 1

    6. 去人工变量

    对于混合约束,需要采用两阶段法,去掉人工变量列,替换上最优化函数的系数的相反数-C。

    两阶段衔接函数:

    def change(self):#人工变量所在列变为0,替换上第二阶段的c
        self.T[:, self.N_x:self.N_x + self.meq] = 0
        self.T[-1, 0:self.N_x] = -self.c
        for i in range(0, self.m):
            self.T[-1] -= self.T[i] * self.T[-1][int(self.sign[i])]
    

    7.两阶段法和单纯形法选择

    两阶段法增加了等式约束,且两个阶段运算方法相同,可根据等式约束的有无决定是否进行第二阶段,不进行第二阶段则为常规单纯形法。

    def Main(self):#主函数
        self.Initial_value()
        if self.meq > 0:  # 采用两阶段法
            # 第一阶段求解
            print("phase 1")
            self.solve()
            # 消去人工变量列
            self.change()
            #第二阶段求解
            print("phase 2")
            self.solve()
        else:
            # 直接进入第二阶段求解,消去人工变量列
            print("simple")
            self.change()
            self.solve()
        if self.F==1:
            print("Optimal solution:")
            j = 0
            for i in range(0, self.N_x):
                if i not in self.sign:
                    print("x" + str(i + 1) + "=0")
                else:
                    print("x" + str(i+1) + "=", self.T[j][-1])
                    j+=1
            print("Best Value:\n", self.T[-1][-1])
        else:
            print("出现无界解")
    

    8.求解结果

    在这里插入图片描述

    总结

    本程序求解5000个变量以内的线性规划问题效率较高,10s以内;但没考虑无解的情况(随机矩阵经常导致无解),遇到无解线性规划耗时极长
    缺点:
    1.
    没考虑无解的情况(随机矩阵经常导致无解),遇到无解矩阵耗时极长。多个解的情况无法判断,只能获得一个最优解。

    2.
    只能求解等式约束和“小于等于”的不等式约束,不能直接求解“大于等于 ”的约束,需要转化成等式约束,操作不简便。

    3.
    程序没有直接调用等式约束矩阵A_eq,b_eq,不等式约束矩阵A_ub,b_ub以及求解函数的系数矩阵c,产生了新的矩阵T,占用内存较大。

    展开全文
  • 一个例子搞懂单纯形法大M法和两阶段法

    千次阅读 多人点赞 2020-09-22 22:29:39
    两阶段法 1. 题目 目标函数: min⁡z=4x1+x2 \min z = 4x_1 + x_2 minz=4x1​+x2​ 约束条件: s.t.{3x1+x2=34x1+3x2≥6x1+2x2≤4x1,x2≥0 \text{s.t.} \begin{cases} 3x_1 + x_2 = 3 \\ 4x_1 + 3x_2 \geq 6 \\ x_...
  • 两阶段法 线形规划求解 delphi源码
  • 两阶段法 第一阶段:构造如下的线性规划问题 目标函数仅含人工变量,若其最优函数值不为0,则元线性规划问题无可行解,求解结束 第二阶段:去掉人工变量,还原目标函数系数,用单纯形法求解即可 例子: 单纯...
  • 如果有等式约束,那么就没法通过添加松弛变量直接给出初始可行解,需要用大M法或者两阶段法求初始可行解。计算机求解一般使用二阶段法,即首先给等式约束条件添加人工变量,使得问题有一个初始可行解。注意人工变量...
  • 提出评价决策单元DEA有效的两阶段法,不仅解决了对所有决策单元的排序问题,而且对非DEA有效的决策单元解决了如何调整技入产出水平使之达到相时有效的有关管理决策信息
  • 最优化两阶段法

    千次阅读 2018-01-03 19:38:57
    有大神会MATLAB吗
  • 两阶段法求解线性规划求解

    千次阅读 2009-10-26 22:32:00
    两阶段法求解min f=2x1-x2+x3 s.t x1+2x2- x3=1 2x1+ x2+ x3=5 x1- x2+2x3=4 xi>=0,i=1,2,3 引入人工变量x4,x5,x6,使min g=x4+x5+x6s.t x1+2x2-x3+x4=1 2x1+x2+x3+x5=5 x1-x2+2x3+x6=4 xi>=0,i=1,...,6其...
  • 两阶段法 第一步,先识别出一些可靠的负例; 第二步,利用第一步的负例和原有的正例,去训练一个分类器,便可以实现分类了。 两阶段法有多种实现手段,这里介绍的S-EM算法,也就是spy-EM算法。 S-EM step1: ...
  • * 找出两阶段法中第一阶段中目标函数的系数向量c */ public double[] c(){ for(int i=0;i;i++){ if(i){ c[i]=0; } else c[i]=1; } return c; } public boolean[] psegma(){ boolean...
  • 四.单纯形两阶段和大M

    万次阅读 多人点赞 2013-06-06 20:29:47
    两阶段法   单纯形法三要素: 初始基本可行解,解的迭代,最优性检验 后两个已解决,现考虑如何获得一个初始基可行解.   我们考虑具有标准形式的线性规划问题    两阶段的第一阶段就是用单纯形...
  • 该代码用matlab实现了两阶段单纯形的求解,只需要输入参数就可以了,注解很详细
  • 初始解----两阶段的单纯形

    千次阅读 2019-04-10 23:22:57
    两阶段法当然是分为两阶段了 第一阶段: 1.找出秩的个数,(秩的个数看有几行约束条件,有几行就是几个秩)增加相应个数的人工变量,得到辅助问题LP; 2.列出行列式 从上至下依次是 目标函数,辅助函数,约束条件 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 183,874
精华内容 73,549
关键字:

两阶段法