Оптимизация с учетом неравенства с использованием R - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь свести к минимуму функцию:

f(x) = -x[1]*x[2]*x[3] 

с учетом ограничений:

0 <= x[1] + 2*x[2] + 2*x[3] <= 72.

До сих пор я писал, что я записал ограничение в виде двух отдельных ограничений:

constraint_1: -x[1] - 2*x[2] - 2*x[3] <=0
constraint_2: x[1] + 2*x[2] + 2*x[3] <= 72

Затем я использовал следующие коды, однако я не могу понять, что я должен написать для цели.in:

library(lpSolve)
lp(direction = "min", objective.in, const.mat, const.dir, const.rhs)
const.mat = matrix(c(-1,-2,-2,1,2,2), nrow = 2, ncol = 3, byrow=TRUE)
constraint_1 = 0
constraint_2 = 72
const.rhs = c(constraint_1, constraint_2)
const.dir = c("<=", "<=")

РЕДАКТИРОВАТЬ:

Я использовалПакет nloptr, но у меня появляется эта ошибка: «Ошибка в .checkfunargs (eval_f, arglist,« eval_f »):

eval_f требует аргумент« x_2 », но это не было передано функции« nloptr ». "

Когда я применяю эти коды:

Целевая функция

eval_f0 <-функция (x_1, x_2, x_3) {</p>

return (-x_1 *)x_2 * x_3)

}

eval_grad_f0 <-функция (x_1, x_2, x_3) {</p>

возврат (c (-x_2 * x_3, -x_1 * x_3, -x_1 * x_2))

}

функция ограничения

eval_g0 <- функция (x_1, x_2, x_3) {</p>

return ((- x_1 -2 * x_2 - 2 * x_3),

(x_1 + 2 * x_2 + 2 * x_3 - 72))

}

eval_jac_g0 <- функция (x_1, x_2, x_3) {</p>

return (rbind (c (-1, -2, -2),

*)1048 * c (1,2,2)))

}

res0 <-nloptr (x0 = c (0,0,0), </p>

eval_f = eval_f0,

eval_grad_f = eval_grad_f0,

lb = c (-Inf, -Inf, -Inf),

ub = c (Inf, Inf, Inf),

eval_g_ineq = eval_g0,

eval_jac_g_ineq = eval_jac_g0,

opts = list ("алгоритм" = "NLOPT_LD_MMA",

"xtol_rel" = 1.0e-8,

"print_level" = 3,

"check_derivatives" = TRUE,

"check_derivatives_print" = "all"))

...