Я пытаюсь свести к минимуму функцию:
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"))