Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的约束优化_R_Optimization_Constraints - Fatal编程技术网

R中的约束优化

R中的约束优化,r,optimization,constraints,R,Optimization,Constraints,我试图在R中使用一些给定的线性约束进行优化,但无法找出如何设置问题 例如,我需要最大化$f(x,y)=log(x)+\frac{x^2}{y^2}$,以约束$g_1(x,y)=x+y0$和$g_3(x,y)=y>0$。我在R怎么做?这只是一个假设的例子。不要担心它的结构,相反,我想知道如何在R中设置它 谢谢 设置函数很简单: fr <- function(x) { x1 <- x[1] x2 <- x[2] -(log(x1) + x1^2/x2^2)

我试图在R中使用一些给定的线性约束进行优化,但无法找出如何设置问题

例如,我需要最大化$f(x,y)=log(x)+\frac{x^2}{y^2}$,以约束$g_1(x,y)=x+y<1$,$g_2(x,y)=x>0$和$g_3(x,y)=y>0$。我在R怎么做?这只是一个假设的例子。不要担心它的结构,相反,我想知道如何在R中设置它


谢谢

设置函数很简单:

fr <- function(x) {      x1 <- x[1]
    x2 <- x[2]
    -(log(x1) + x1^2/x2^2)  # need negative since constrOptim is a minimization routine
}
因此,我为每个约束/边界放了一行:

constrOptim(c(0.99,0.001), fr, NULL, ui=rbind(c(-1,-1),  # the -x-y > -1
                                              c(1,0),    # the x > 0
                                              c(0,1) ),  # the y > 0
                                           ci=c(-1,0, 0)) # the thresholds
对于这个问题,有一个潜在的困难,对于x的所有值,函数以y->0的形式转到Inf。即使当我把起始值推到“角点”时,我也会在x=.95和y=0附近得到一个最大值,但我有点怀疑这不是真正的最大值,我会猜到它在“角点”。 编辑: 为此,我推断梯度可能提供额外的“方向”,并添加了梯度函数:

grr <- function(x) { ## Gradient of 'fr'
    x1 <- x[1]
    x2 <- x[2]
    c(-(1/x[1] + 2 * x[1]/x[2]^2),
       2 * x[1]^2 /x[2]^3 )
}
注意:Hans Werner Borchers在R-Help上发布了一个更好的示例,通过设置稍微远离边缘的约束,成功地获得了角点值:

> constrOptim(c(0.25,0.25), fr, NULL, 
              ui=rbind( c(-1,-1), c(1,0),   c(0,1) ),  
              ci=c(-1, 0.0001, 0.0001)) 
$par
[1] 0.9999 0.0001

@G和其他人——有人能解释为什么不赞成交叉张贴吗?您是否可以提及您正在使用链接进行交叉发布?我并没有强烈的感觉,但在这个问题上有些清晰可能是必要的。如果这是R社区以前处理过的事情,我想链接到这些讨论将是一个好的开始。如果你在Meta选项卡上搜索“交叉发布”,你会发现各种各样的观点,其中大多数都相对接受交叉发布。(然而,同时交叉发帖似乎让大多数人感到烦恼。)《r-help发帖指南》中规定了r-help和表亲组强烈的反交叉发帖道德。我很难把发帖指南看作是一种证明,当人们越过帖子,不让任何人知道的时候,很有可能有人为一个已经解决的问题写一个解决方案,这可能会浪费他们的时间。我个人不在乎人们是否会越位,只要他们让人知道(而且这并不过分)。如果有人需要从越位看到Rhelp上的答案,这里就是:这非常有用。我发布的示例并不理想,但我可以看到如何设置函数。什么是可行域?可行域是满足所有约束的点集。您的规格中有一个三角形。
 constrOptim(c(0.99,0.001), fr, grr, ui=rbind(c(-1,-1),  # the -x-y > -1
                                               c(1,0),    # the x > 0
                                               c(0,1) ),  # the y > 0
                                            ci=c(-1,0, 0) )
$par
[1]  9.900007e-01 -3.542673e-16

$value
[1] -7.80924e+30

$counts
function gradient 
    2001       37 

$convergence
[1] 11

$message
[1] "Objective function increased at outer iteration 2"

$outer.iterations
[1] 2

$barrier.value
[1] NaN
> constrOptim(c(0.25,0.25), fr, NULL, 
              ui=rbind( c(-1,-1), c(1,0),   c(0,1) ),  
              ci=c(-1, 0.0001, 0.0001)) 
$par
[1] 0.9999 0.0001