2011-03-25 17 views
12

Próbuję użyć http://rss.acs.unt.edu/Rdoc/library/stats/html/constrOptim.html w R, aby wykonać optymalizację w R z pewnymi liniowymi ograniczeniami, ale nie jestem w stanie dowiedzieć się, jak skonfigurować problem.Ograniczona optymalizacja w R

Na przykład muszę zmaksymalizować $ f (x, y) = log (x) + \ frac {x^2} {y^2} $ z zastrzeżeniem $ g_1 (x, y) = x + y < 1 $, $ g_2 (x, y) = x> 0 $ i $ g_3 (x, y) = y> 0 $. Jak mam to zrobić w R? To tylko hipotetyczny przykład. Nie martw się o jego strukturę, zamiast tego chciałbym wiedzieć, jak to ustawić w R.

dziękuję!

+1

@G i inne - czy ktoś może wyjaśnić, dlaczego krzyżyk jest marszczony? Czy byłoby dopuszczalne, aby wspomnieć, że jesteś przekierowany z linkiem? Nie mam silnych uczuć w ten czy inny sposób, ale pewna jasność w tej kwestii jest prawdopodobnie uzasadniona. Jeśli to jest coś, co wcześniej zajmowała się społeczność R, myślę, że połączenie z tymi dyskusjami byłoby dobrym początkiem. – Chase

+0

W przypadku wyszukiwania w zakładce Meta w celu "przeksięgowania" można znaleźć różne opinie, z których większość jest względnie akceptowana w celu przeksięgowania. (Jednoczesne przekierowanie zdaje się jednak irytować większość ludzi). Istnieje silna etyka anty-cross-postingowa dla grup r-help i kuzynów, które zostały określone w przewodniku po publikacji R-Help. Trudno mi się przekonać, że Przewodnik wysyłkowy jest dowodem w języku SO. –

+0

@Chase Gdy ludzie przechodzą przez post i nie pozwalają nikomu o tym wiedzieć, to jest możliwe, aby ktoś napisał rozwiązanie problemu, który jest już rozwiązany, co może być stratą czasu. Osobiście nie dbam o to, czy ludzie przekraczają posty, o ile je ujawniają (i nie są nadmierne). – Dason

Odpowiedz

16

Konfiguracja funkcji trywialny:

fr <- function(x) {  x1 <- x[1] 
    x2 <- x[2] 
    -(log(x1) + x1^2/x2^2) # need negative since constrOptim is a minimization routine 
} 

Konfiguracja macierzy ograniczenie było problematyczne ze względu na brak wiele dokumentacji i ucieka się do eksperymentów. Strona pomocy mówi "Możliwy region jest zdefiniowany przez ui% *% theta - ci> = 0". Więc przetestowane i wydawało się, że „praca”:

> rbind(c(-1,-1),c(1,0), c(0,1)) %*% c(0.99,0.001) -c(-1,0, 0) 
     [,1] 
[1,] 0.009 
[2,] 0.990 
[3,] 0.001 

więc umieścić w rzędzie dla każdego więzów/granicy:

constrOptim(c(0.99,0.001), fr, NULL, ui=rbind(c(-1,-1), # the -x-y > -1 
               c(1,0), # the x > 0 
               c(0,1)), # the y > 0 
              ci=c(-1,0, 0)) # the thresholds 

tego problemu istnieje potencjalne trudności w tym, że dla wszystkich wartości z x funkcja idzie do Inf jako y -> 0. Mam max około x = .95 i y = 0, nawet gdy wypycham wartości wyjściowe do "rogu", ale jestem nieco podejrzany, że to jest nie prawdziwym maksimum, które mogłem odgadnąć było w "rogu". EDIT: Zajmując to ja uznał, że gradient może dostarczyć „kierunek” i dodaje dodatkową funkcję gradient:

grr <- function(x) { ## Gradient of 'fr' 
    x1 <- x[1] 
    x2 <- x[2] 
    c(-(1/x[1] + 2 * x[1]/x[2]^2), 
     2 * x[1]^2 /x[2]^3) 
} 

To nie „wół” optymalizacji nieco bliżej C (.999 ... 0) narożnik, zamiast odsuwać się od niego, tak jak w przypadku niektórych wartości początkowych. I pozostanie nieco rozczarowany, że proces wydaje się „głowa do urwiska”, gdy wartości wyjściowe są blisko centrum regionu to wykonalne:

constrOptim(c(0.99,0.001), fr, grr, ui=rbind(c(-1,-1), # the -x-y > -1 
               c(1,0), # the x > 0 
               c(0,1)), # the y > 0 
              ci=c(-1,0, 0)) 
$par 
[1] 9.900007e-01 -3.542673e-16 

$value 
[1] -7.80924e+30 

$counts 
function gradient 
    2001  37 

$convergence 
[1] 11 

$message 
[1] "Objective function increased at outer iteration 2" 

$outer.iterations 
[1] 2 

$barrier.value 
[1] NaN 

Uwaga: Hans Werner Borchers napisali lepszy przykład na R-help że udało się uzyskać wartości narożne, nieznacznie ustawiając ograniczenie od krawędzi:

> constrOptim(c(0.25,0.25), fr, NULL, 
       ui=rbind(c(-1,-1), c(1,0), c(0,1)), 
       ci=c(-1, 0.0001, 0.0001)) 
$par 
[1] 0.9999 0.0001 
+0

Jest to bardzo pomocne. Zamieszczony przeze mnie przykład nie był idealny, ale widzę, jak skonfigurować tę funkcję. Jaki jest możliwy region? – user236215

+0

Możliwy region to zbiór punktów spełniających wszystkie ograniczenia. Trójkąt w swojej specyfikacji. –