运筹说 第47期 | 算法介绍之目标规划

在上一期的学习中,我们对目标规划的相关概念和模型进行了讲解,本期我们进行运筹学之目标规划算法的讲解。我们将对目标规划的基础知识进行一个简单的回顾,并介绍求解目标规划的Excel方法、LINGOMATLAB以及Python相关代码,以帮助大家利用工具快速求解目标规划问题,做到事半功倍。话不多说,我们一起来看看吧!

一、基础知识

1、目标规划问题的数学模型

线性规划与目标规划的异同

目标规划数学模型的一般形式

 

 模型中, 为第k个目标约束的预期目标值,优先因子对应各目标的权系数。

 

2、目标规划问题的求解

目标规划问题的建模步骤

(1)根据要研究的问题所提出的各目标与条件,列出绝对约束;

(2)可根据决策者的需要,将某些或全部绝对约束转化为目标约束。这时只需要给绝对约束加上负偏差变量减去正偏差变量即可;

(3)给各目标赋予相应的优先因子Pk (k=1,2…,K);

(4)对同一优先等级中的各偏差变量,若需要可按其重要程度的不同赋予相应的权系数

(5)根据决策者的要求,构造一个由优先因子和权系数相对应的偏差变量组成的要求实现极小化的目标函数。

目标规划问题的求解方法

(1)单纯形法

目标规划的数学模型实际上是最小化型的线性规划,可以用单纯形法求解。

在用单纯形法解目标规划时,检验数是各优先因子的线性组合。因此,在判别各检验数的正负及大小时,必须注意P1P2P3。当所有检验数都已满足最优性条件cj-zj≥0时,从最终单纯形表上就可以得到目标规划的解。具体流程图如下所示。后续算法实现部分用Excel方法以及Python平台求解目标规划问题采用的就是此方法。

(2)序贯式解法

序贯式解法是按照目标函数中各目标的优先级别,顺序将目标规划分解为一系列单目标的线性规划,用单纯形法逐一求解。在求解过程中确定出基变量、进基变量以及迭代的原则与线性规划的单纯形法相同。不同的是要以不影响较高级目标的最优值为前提求解较低级目标的最优值。如此反复进行迭代,直到最低级目标的目标函数达到最优为止。后续算法实现部分用LINGO求解目标规划问题采用的就是此方法。

二、算法实现

1、例题介绍

某工厂生产两种产品,受到原材料和设备工时的限制。单件利润等有关数据已知,具体数据如下表:

计划人员被要求考虑如下的意见:

(1)由于产品Ⅱ销售疲软,故希望产品Ⅱ的产量不超过产品Ⅰ的一半;

(2)原材料严重短缺,生产过程中应避免过量消耗;

(3)最好能节约4h设备工时;

(4)计划利润不少于48元。

面对这些意见,计划人员需要会同有关各方做进一步的协调,最后达成了一致意见:原材料使用限额不得突破;产品Ⅱ产量要求必须优先考虑;设备工时问题其次考虑,最后考虑计划利润的要求。

上述例题的数学模型如下:

2、平台实现

此次我们以上述例题为例,借助ExcelLINGOMATLABPython这4个平台分别介绍实现求解目标规划的相关代码。由于篇幅有限,小编接下来只展示部分代码,小伙伴们可以关注“运筹学”公众号→后台回复“目标规划之LINGO”及“目标规划之MATLAB”、“目标规划之Python分别获取对应的完整代码。

(1)Excel

准备工作

依次在相应的单元格内输入数据和公式如下,优先因子间的关系可以自行定义,这里我们令P1=100,P2=50,P3=1,表示P1≫P2≫P3

 求解流程

设置规划求解参数如图所示,本题我们求解目标函数的最小值,设定好相应的约束条件,在“使无约束变量为非负数”前的方框里打对钩,选择求解方法处选择“单纯线性规划”,点击求解即可返回运算结果。

点击“求解”后,出现“规划求解结果”对话框,我们可以看到,规划求解找到一解,在报告位置还可以选择生成运算结果报告。 

运行结果

可以看到,x1=4.8,x2=2.4,d1+=0,d1-=0,d2+=0,d2-=7.2,d3+=0,d3-=0,因此,可获得在上述约束条件下的满意解,并求得最优利润为48元。

 

(2)LINGO

平台介绍

LINGO可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等,功能十分强大,是求解优化模型的最佳选择。其特色在于内置建模语言,提供十几个内部函数,可以允许决策变量是整数(即整数规划,包括0-1整数规划),方便灵活,而且执行速度非常快,能方便与Excel数据库等其他软件交换数据

 

 代码展示

 

小伙伴们可以关注“运筹学”公众号→后台回复“目标规划之LINGO获取完整代码。

代码调用及运行结果

当程序运行时,会出现一个对话框,由于该目标规划共有3个优先因子P1P2P3,因此我们需要做三次运算

在做第一级目标计算时,ctr输入1,goal(1)和goal(2)输入两个较大的值,表明这两项约束不起作用。求得第一级的最优偏差为0,进行第二级目标计算;

在第二级目标的运算中,ctr输入2。由于第一级的偏差为0,因此goal(1)的输入值为0,goal(2)输入一个较大的值。求得第二级的最优偏差仍为0,进行第三级计算;

在第三级的计算中,ctr输入3。由于第一级、第二级的偏差均是0,因此,goal(1)和goal(2)的输入值也均是0,第三级的最优偏差为0。

最终运行结果展示如下:

分析计算结果,x1=8,x2=0,d1+=8,d1-=0,d2+=0,d2-=4,d3+=0,d3-=0,因此,可获得在上述约束条件下的满意解为生产产品Ⅰ 8 件,不生产产品Ⅱ,最优利润48元。

(2)MATLAB

MATLAB平台有多种求解目标规划问题的方法,现在介绍两种:fgoalattain函数和gamultiobj。

(2.1)fgoalattain

函数介绍

fgoalattain函数常用来求解多个决策函数的规划问题。

语法为:[x,fval] = fgoalattain(fun, x0, goal, A, b, Aeq, beq, lb, ub)。

其中,x为最终解,fval为最终的目标函数值。fun 是定义的决策函数,通常通过M文件或者匿名函数进行定义;x0 为初始值;goal 为欲达到的目标;weight为权重;A和b用于定义不等式约束A*x ≤ b;Aeq和beq用于定义等式约束Aeq*x=beq;lb和ub表示解的范围。   

代码展示

 

运行结果

运行之后,得出如下结果,即当x1=6,x2=3时,求得在权重weight=[10,2,1]情况下目标规划的满意解,即生产产品I 6件,产品Ⅱ3件,最优利润为60元。

 

(2.2)gamultiobj

函数介绍

gamultiobj是Optimization Toolbox中使用遗传算法来解多目标问题的一个函数,其使用方法同fgoalattain类似。与fgoalattain不同的是,gamultiobj直接返回多个满足条件的解,如何选择看决策者实际要求。

本文中用到的语法为:[x,fval] = gamultiobj (fun, 2, goal, A, b, Aeq, beq, lb, ub)。

其中,x为最终解,fval为最终的目标函数值。fun 是定义的决策函数,通常通过M文件或者匿名函数进行定义;goal 为欲达到的目标;A和b用于定义不等式约束A*x ≤ b;Aeq和beq用于定义等式约束Aeq*x=beq;lb和ub表示解的范围。

代码展示

 

运行结果

运行之后,得到如下结果,其中x的每一行都代表了一组满意解,fx中第三列的相反数代表的就是相应的满意解所对应的目标函数值。

 

(4)Python

通过查阅相关资料,小编发现目前使用Python算法求解目标规划问题的资料甚少,因此,为进一步锻炼小编的编程能力同时也为方便大家对于运筹学算法相关知识的学习,小编根据单纯形法求解原理,自行编写了求解目标规划问题的Goal programming文件。

准备工作

在运行代码之前,我们首先要将初始单纯形表写入模型输入表中,书写格式如下图所示。为方便代码运行,单纯形表中的所有信息均采用数字表示,各个变量均有相应的数字代号。此外,表格中A1:C1为无用单元格,为保证代码正常运行,将其赋值为0.1。同时我们令P1=100,P2=50,P3=1,表示P1≫P2≫P3。

 

代码展示

Goal programming文件包含从模型输入表中读取数据、确定换入变量、确定换出变量、更新相关数据(包括单纯形表中的约束系数矩阵、XBCB以及b)、将更新后的单纯形表写入结果输出表以及在Python界面输出此时的检验数六大部分。部分代码如下图所示,小伙伴们可以关注运筹学公众号后台回复目标规划之Python”获取完整代码。

 

 

 

运行结果

首先我们需要将初始单纯形表按照“准备工作”中提到的格式要求写入“模型输入表”中。

然后运行Goal programming文件,我们可以得到“结果输出表”,该表记录了新生成的单纯形表,同时我们可以得知当前最小的检验数为-20。

 

 由于我们目标函数求最小,因此不应存在检验数为负的情况,所以我们需要将“结果输出表”中的数据复制到“模型输入表”,再次运行Goal programming文件,发现运行完成后生成的单纯形表最小的检验数为0。

此时我们便求得该目标规划问题的一个满意解,通过查看新生成的“结果输出表”及“准备工作”中提到的变量和代号之间的关系,我们可以知道,此时的满意解为:x1=4.8,x2=2.4。

 

 

3、算法总结

线性规划立足于求满足所有约束条件的最优解,而在实际问题中,可能存在相互矛盾的约束条件。这些相互矛盾的约束条件以及优先因子的存在决定了目标规划的找到的只能是满意解。

上面我们给出了ExcelLingoMATLABPython求解目标规划的四种方法,四种算法的优缺点总结如下,小伙伴们可以根据实际需要自行选择哦!

三、注意事项

运行MATLAB中的目标规划函数fgoalattain时,由于fgoalattain解的是极小化问题,因此当第i个目标fun(i)为最大时,fun(i)和goal(i)的系数需变为负。

四、参考资料

【Excel实现】利用“规划求解”求解目标规划问题

(五)目标规划的Excel求解 - 百度文库

【LINGO实现】利用序贯式算法求解目标规划问题

目标规划模型:求解思路、序贯式算法_冷月无声的博客-CSDN博客_目标规划模型

【MATLAB实现】利用目标规划函数求解目标规划问题

第四天:目标规划(goal programming)_m0_54690727的博客-CSDN博客

本期的内容就介绍到这里,想要进一步了解运筹学,关注本公众号,快快学起来吧!

作者 |尹萌娟 曹贵玲 

责编 | 何洋洋

审核 | 徐小峰

 

 

 

 

 

 

 

 

 

  • 6
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值