R:具有等式约束的非线性优化

时间:2017-11-17 22:05:34

标签: r optimization nonlinear-optimization nonlinear-functions nlopt

我有一个TxN矩阵M和一个Nx1权重向量w,其中sum(w)=1
我需要找到w,这会最大化Mw中的正元素数量 如果没有单w,则需要Mw的最大可能值。

更正式地,用M_t表示t - M中的行,然后我需要

max_w  Sum_t I(M_t w)
sub    1'w=1    

其中1是1的向量,函数I(x)返回1,如果x为正,则0

注意:如果将目标函数除以T,则可以将加数视为随机变量加权和的频率。

数据可以模拟如下:

N <- 4
set.seed(1)
M <-  matrix(rnorm(200), ncol=N)
w <- as.matrix(rep(1/N, N))
one <- as.matrix(rep(1, N))

目标函数和约束是:

I <- function(r) as.numeric(r>0)
f <- function(x) -sum(sapply(M %*% x, I))
h <- function(x) t(one) %*% x - 1

现在在R中,一种可能性是nloptr

library(nloptr)
local_opts <- list( "algorithm" = "NLOPT_LN_AUGLAG_EQ",
                    "xtol_rel" = 1.0e-7 )
opts <- list( "algorithm" = "NLOPT_LN_AUGLAG_EQ",
              "xtol_rel" = 1.0e-7,
              "maxeval" = 100000,
              "local_opts" = local_opts,
              "print_level" = 2)

nloptr( x0=as.vector(w),  eval_f=f, eval_g_eq=h, opts=opts)

我明白了:

  

NLopt求解器状态:-4(NLOPT_ROUNDOFF_LIMITED:舍入错误导致a   优化算法的细分。在这种情况下,返回的最小值可以   仍然有用。
  迭代次数....:17530
  终止条件:xtol_rel:1e-07 maxeval:1e + 05
  [...]
  目标函数的当前值:-33
  对照的当前值:0.5175225 0.1124845 0.1598906 0.2101024

请注意,17530次迭代远小于maxeval(100000)。

我不知道如何正确使用NLOPT_GN_ISRES,这可能会提高速度。用NLOPT_LN_AUGLAG_EQ替换NLOPT_GN_ISRES会产生:

  

NLopt求解器状态:-2(NLOPT_INVALID_ARGS:无效参数(例如,较低       边界大于上限,指定了未知算法,       等等)。 )

我是nloptr的新手,所以我想知道接下来的内容。

据我所知,f( - 33)的结果是可靠的,容差为1.0e-7。这是对的吗? 如何说明w的值是否唯一?
NLOPT_GN_ISRES的语法是什么? 目标f包含隐式if条件,我还可以使用(数字)渐变吗? 其他包装,如阿拉巴马州,在这类问题上更好吗?

更新将起点更改为w

0 个答案:

没有答案