Оптимизация функции с двумя параметрами (одно непрерывное и одно целочисленное значение) - PullRequest
0 голосов
/ 02 июля 2019

Используя язык R, я пытаюсь оптимизировать двухпараметрическую функцию f (x, y) так, чтобы x, y были неотрицательными, а y - целым числом. Однако я не получаю простого ответа, который можно было бы получить на бумаге.

Определение

f = function(param){
  x=param[1] ; y=round(param[2])
  temp = (x-1.3)^2+(y-1.7)^2
  return(temp)
}

Ясно, что ответом является x = 1,3 и y = 2, но, учитывая настройку, любое значение y в (1.5,2.49) приемлемо как раунд (y) = 2. Вот что я получаю из функции constrOptim:

constrOptim(c(1,4),f,ui=rbind(c(1,0),c(0,1)),ci=c(0,0) , method="Nelder-Mead")

$par
[1] 1.299810 4.016033

$value
[1] 5.29

$counts
function gradient 
      43       NA 

$convergence
[1] 0

$message
NULL

$outer.iterations
[1] 2

$barrier.value
[1] -6.084598e-05

1 Ответ

1 голос
/ 02 июля 2019

Я думаю, это потому, что ваша начальная точка для y равна 4. Если вы установите значение 2, это даст вам то, что вы ожидаете. Я думаю, что проблема заключается в том, что ваша целевая функция совершенно плоская в определенных регионах и имеет разрывы, поэтому не всегда есть значимый градиент, которому нужно следовать к глобальному минимуму. для х = 0,1 ваша функция выглядит так: enter image description here

так что процедуре оптимизации будет нелегко дать правильный результат. один из вариантов - заменить функцию round () более плавной версией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...