前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【R语言在最优化中的应用】用goalprog包求解 线性目标规划

【R语言在最优化中的应用】用goalprog包求解 线性目标规划

作者头像
统计学家
发布2019-04-10 10:30:55
4.2K0
发布2019-04-10 10:30:55
举报
文章被收录于专栏:机器学习与统计学

标规划问题及其数学模型

目标规划(goal programming) 是运筹学中的一个重要分支,它是为解决多目标决策问题而发展起来的一种数学方法。目标规划可以按照确定的若干目标值及其实现的优先次序,在给定约束条件下寻找偏离目标值最小的解的数学方法。它在处理实际决策问题时,承认各项决策要求 (即使是冲突的)的存在有合理性;在做最终决策时,不强调其绝对意义上的最优性。由于目标规划在一定程度上弥补了线性规划的局限性,因此,目标规划被认为是一种较之线性规划更接近于实际决策工程的工具。

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

(2)

模型2的约束条件中,第一行有偏差变量,为目标约束,第二行没有偏差变量,同线性规划里的约束条件一样,为绝对约束。可以证明,在模型2有解的情况下,可以将其化为只含有目标约束的目标规划问题,方法是给所有的绝对约束赋予足够高级别的优先因子,从这个角度来看,线性规划为目标规划的特殊情况,而目标规划则为线性规划的自然推广。根据以上分析,可将模型 (2) 简化并用矩阵和向量记为:

(3)

模型(3)中,所有的约束都为目标约束,每一个目标约束都对应一对偏差变量。

用goalprog包求解目标规划

R中,goalprog包 (Novomestky, 2008) 可以求解形式为模型(3) 的目标规划问题,核心函数为llgp(),用法如下:

llgp(coefficients, targets,achievements, maxiter = 1000, verbose = FALSE)

参数中,

coefficients为约束变量(不包括偏差变量) 的系数矩阵,即模型 (3) 中的矩阵 A。

targets为系数矩阵对应的约束向量,即模型 (3) 中的向量 g。

achievements为关于目标函数 (默认求最小值) 的数据框,是由 4 个向量构成:objective、priority、p和 n。其中数据框的每一行对应一个软约束条件,objective和 priority 为正整数,分别表示针对第几对偏差变量 (第 n 对偏差变量必须出现在第 n 个目标约束中) 和该偏差变量的优先级别,p 和 n 分别表示 d+(正偏差变量)、d−(负偏差变量) 的权系数。

maxiter为最大迭代次数,取正整数,默认为 1000。

verbose为逻辑变量(取 TRUE或 FALSE ),决定是否输出中间过程,默认不输出。

某工厂生产两种产品,受到原材料供应和设备工时的限制,在单位利润等有关数据已知的条件下,要求制定一个获利最大的生产计划,具体数据见表在决策时,按重要程度的先后顺序,要考虑如下意见:

1.原材料严重短缺,生产中应避免浪费,不得突破使用限额;

2.由于产品 B 销售疲软,故希望产品 B 的产量不超过产品 A 的一半;

3.最好能节约 4 h 的设备工时;

4.计划利润不少于 48 元。

以上四条意见中,显然第一条为绝对约束,第二至四条为目标约束。请根据这些要求决定两种产品生产量。

解:

这是典型的多目标规划问题,建立目标规划模型如下:

该模型中含绝对约束条件,将绝对约束条件转化为一级目标约束条件,得到模型如下:

该模型符合模型 (3) 的形式,可以直接调用 llgp() 函数来求解该问题,注意:R中根据achievements数据框中的 priority 来判断绝对优先级别,不用再设置 P1,P2,P3。R代码和部分输出结果如下:

> library(goalprog) > coefficients=matrix(c(5,1,4,6,10,-2,4,8),4) > targets=c(60,0,36,48) > achievements=data.frame(objective=1:4,priority=c(1,2,3,4),p=c(1,0,1,0),n=c(0,1,0,1)) > soln=llgp(coefficients,targets,achievements) > soln$converged [1] TRUE > soln$out Decision variables X X1 4.800000e+00 X2 2.400000e+00

观察输出结果,可以知道该问题已经得到最优解 (soln$converged 为 TRUE 时,表示最优解已经

找到),此时 x1,x2分别取 4.8,2.4,即应生产 A 产品 4.8 个单位,B 产品 2.4 个单位。需要说明的是,由于约束较少,本题有四个满意解,这里仅仅得到一个。此外,程序结果输出较多,上面的soln$out 仅选取了一部分。

下面再看一个稍微复杂的例子。

求下列目标规划问题:

解:这是一个多目标规划问题,可以直接调用 llgp() 函数求解。R代码及运行结果如下 (为了便于展示,输出了一些参数的信息):

代码语言:javascript
复制
> library(goalprog)
代码语言:javascript
复制
> coefficients=matrix(c(1,1,5,1,1,0,3,1),4)
代码语言:javascript
复制
> targets=c(10,4,56,12)
代码语言:javascript
复制
> achievements=data.frame(objective=1:4,priority=c(1,1,2,3),p=c(2,3,0,1),n=c(0,0,1,0))
代码语言:javascript
复制
> soln=llgp(coefficients,targets,achievements)
代码语言:javascript
复制
> soln$converged
代码语言:javascript
复制
[1] TRUE
代码语言:javascript
复制
> soln$out
代码语言:javascript
复制
代码语言:javascript
复制
Decision variables
代码语言:javascript
复制
                X
代码语言:javascript
复制
X1   4.000000e+00
代码语言:javascript
复制
X2   6.000000e+00

析输出结果,可以知道该问题已经得到最优解,此时 x1,x2分别为 4,6。

求个红包

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与统计学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档