2016-12-02 4 views
4

Я новичок в stackoverflow и много искал, но не смог найти ответ на мой вопрос , Я пытаюсь свести к минимуму проблему с пакетом оптимизации Rsolnp. Хотя решатель дает мне решение, каждый раз, когда я запускаю код, появляется следующее предупреждающее сообщение:Rsolnp: В cbind (temp, funv): количество строк результата не кратно векторной длины (arg 1)

Предупреждающие сообщения: 1: В cbind (temp, funv): Число строк результата не кратно вектору length (arg 1)

Кроме того, решение полностью отличается от решений, которые я получаю с помощью ipop и solve.QP. Их решения практически одинаковы (0,2480, 0,0000, 0,0121, 0,7400). Я пробовал много разных формулировок проблемы, но не мог понять, что я сделал не так. Я благодарен за всю помощь и информацию!

library(Rsolnp) 
# Starting Values 
x0 <- c(0.25,0,0.01,0.75) 


fn <- function(x){ 
    d <- c(0.0308, 0.0269, 0.0145, 0.0130) 
    d <- -d 
    D <- cbind(c(0.1486, 0.0778, -0.0240, -0.0154), 
     c(0.0778, 0.1170, 0.0066, 0.0029), 
     c(-0.0240, 0.0066, 0.0444, 0.0193), 
     c(-0.0154, 0.0029, 0.0193, 0.0148)) 
out <- t(d) %*% x + 0.5 * (t(x) %*% D %*% x) 
out 
} 


# Inequality Constraint: 0 =< x 0 =< 1 
lx <- rep(0,4) 
ux <- rep(1,4) 



sol <- solnp(pars = x0, 
     fun = fn, 
     eqfun = sum, 
     eqB = 1, 
     ineqLB = lx, 
     ineqUB = ux) 
sol$pars 

ответ

2

Добро пожаловать в SO.

У вас есть две проблемы: a) проблема w.r.t результата и b) предупреждение, о котором вы не можете понять.

ad a) Это просто потому, что оптимизация LaGrange часто выполняется путем минимизации отрицательного значения вместо максимизации положительного значения. Это была разница. При настройке d на -d (я сделал это в редактировании) решение такое же, как решение, созданное другими решателями.

ad b) сообщение об ошибке является несколько сложным. Само сообщение означает, что пытается связать два столбца разной длины. То, что делает R, повторяет значения в более коротком столбце так часто, как необходимо, чтобы связать две колонки равной длины. Если дольше не кратно, чем короче, вы получите это предупреждение, но R продолжает повторять значения более коротких, если это означает, что есть неиспользованный остаток.

Однако, похоже, что в пакете есть ошибка. При запуске

options(warn = 2) # turns warnings to errors and breaks code 
debug(solnp) 
sol <- solnp(pars = x0, 
    fun = fn, 
    eqfun = sum, 
    eqB = 1, 
    ineqLB = lx, 
    ineqUB = ux) 

вы понимаете, что есть объект, называемый tempdf создается, что вызывает проблему. Однако этот объект никогда больше не используется в коде solnp. Я спрошу авторов, может быть, они могут подтвердить, что это ошибка или показать иначе.

1

сделать результат вашей целевой функции, п, явно числовая:

fn <- function(x){ 
    d <- c(0.0308, 0.0269, 0.0145, 0.0130) 
    d <- -d 
    D <- cbind(c(0.1486, 0.0778, -0.0240, -0.0154), 
      c(0.0778, 0.1170, 0.0066, 0.0029), 
      c(-0.0240, 0.0066, 0.0444, 0.0193), 
      c(-0.0154, 0.0029, 0.0193, 0.0148)) 
    out <- t(d) %*% x + 0.5 * (t(x) %*% D %*% x) 
    as.numeric(out) 
} 

и я получаю

ИТЭР: 1 сноска: -0,01153 Pars: 0,24798607502 0,00000002295 0,01205720515 0,73995669928 ИТЭР: 2 fn: -0.01153 Парс: 0.247984418270 0,000000003318 0,012080555874 0,739935021900 solnp -> Выполнено в 2-х итерациях

sol $ pars [1] 2.479 844e-01 3.317577e-09 1.208056e-02 7.399350e-01

 Смежные вопросы

  • Нет связанных вопросов^_^