Как я могу добавить дополнительное ограничение в lp () (чтобы все значения были ненулевыми)? — R

#r #constraints #linear-programming

#r #ограничения #линейное программирование

Вопрос:

 u    <- runif(8,min=1,max=7) 
prob <- runif(8)
prob <- prob/sum(prob)
U    <- prob%*%u
  

Выше U представляет собой взвешенную сумму из 8 значений u (все от 1 до 7). Я хотел бы написать простой lp (), который поддерживает решение для весов, где все веса ненулевые. Это будут начальные значения для весов кандидатов.

Пока у меня есть следующее (которое просто находит веса, большинство из которых равно 0, поскольку это самое простое решение):

 obj.fun <- rep(1,8)
constr <- rbind(q,rep(1,8))
constr.dir <- c("==","==")
rhs <- c(Q,1)
p.start <- lp("max",obj.fun,constr,constr.dir,rhs)$sol  
  

Как я могу добавить другое ограничение, согласно которому я хочу, чтобы все веса были ненулевыми?

Комментарии:

1. Добавить нижнюю границу для каждого веса?

2. Да, это именно то, чего я хочу достичь, но я не смог заставить код работать. Я добавил «>» в constr.dir и 0s в constr, но это не работает…

3. Хотя lpsolve поддерживает границы, этот R-пакет этого не делает. Это означает, что вам нужно указать x(i) >= lo как явное ограничение. Итак, вам нужно добавить идентификационную матрицу в constr

4. Ага, хорошо! Я попробую! Спасибо за вашу помощь 🙂

5. @ErwinKalvelagen это близко к тому, что мне нужно? Пока не работает… obj.fun <- rep(1,8) <br/> constr <- rbind(q,rep(1,8),rep(1,8)) <br/> constr.dir <- c("==","==",">=") <br/> rhs <- c(Q,1,0) <br/> <br/> p.start <- lp("max",obj.fun,constr,constr.dir,rhs)$sol