2011-03-25 37 views
12

Tôi đang cố gắng sử dụng http://rss.acs.unt.edu/Rdoc/library/stats/html/constrOptim.html trong R để tối ưu hóa trong R với một số ràng buộc tuyến tính nhất định nhưng không thể tìm ra cách thiết lập sự cố.tối ưu hóa ràng buộc trong R

Ví dụ: tôi cần tối đa hóa $ f (x, y) = nhật ký (x) + \ frac {x^2} {y^2} $ chịu ràng buộc $ g_1 (x, y) = x + y < 1 $, $ g_2 (x, y) = x> 0 $ và $ g_3 (x, y) = y> 0 $. Làm thế nào để làm điều này trong R? Đây chỉ là một ví dụ giả định. Đừng lo lắng về cấu trúc của nó, thay vào đó tôi muốn biết cách thiết lập điều này trong R.

cảm ơn!

+1

@G và những người khác - ai đó có thể giải thích lý do tại sao đăng chéo không được? Nó có thể được chấp nhận để đề cập đến rằng bạn đang chéo gửi bài với một liên kết? Tôi không có cảm xúc mạnh mẽ theo cách này hay cách khác, nhưng một số rõ ràng về vấn đề này có thể được bảo đảm. Nếu đây là thứ mà cộng đồng R ở quy mô lớn đã xử lý trước đây, tôi đoán việc liên kết với các cuộc thảo luận đó sẽ là một khởi đầu tốt. – Chase

+0

Nếu bạn thực hiện tìm kiếm trên tab Meta cho "cross posting", bạn tìm thấy nhiều ý kiến ​​khác nhau, hầu hết nó đều tương đối chấp nhận đối với việc đăng tải chéo. (Tuy nhiên, việc đăng quảng cáo đồng thời dường như làm phiền hầu hết mọi người.) Có một đạo đức chống chéo mạnh mẽ trên các nhóm trợ giúp và người anh em họ do R-Help Posting Guide đặt ra. Tôi gặp khó khăn khi nhìn thấy Hướng dẫn đăng bài như đang được thử nghiệm trong SO. –

+0

@Chase Khi mọi người vượt qua bài đăng và không cho bất kỳ ai biết rằng sau đó có thể ai đó viết ra giải pháp cho một vấn đề đã được giải quyết có thể lãng phí thời gian của họ. Cá nhân tôi không quan tâm nếu mọi người vượt qua bài viết miễn là họ làm cho nó được biết đến (và nó không quá mức). – Dason

Trả lời

16

Thiết lập chức năng là tầm thường:

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

Thiết lập ma trận hạn chế là có vấn đề do thiếu các tài liệu nhiều, và tôi đành để thử nghiệm. Trang trợ giúp cho biết "Vùng khả thi được xác định bởi ui% *% theta - ci> = 0". Vì vậy, tôi đã kiểm tra và điều này dường như để "làm việc":

> 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 

Vì vậy, tôi đặt trong một hàng cho mỗi chế/ranh giới:

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 

Đối với vấn đề này có một khó khăn tiềm tàng trong đó cho tất cả các giá trị của x chức năng đi đến Inf là y -> 0. Tôi nhận được một tối đa xung quanh x = .95 và y = 0 ngay cả khi tôi đẩy các giá trị bắt đầu ra đến "góc", nhưng tôi hơi nghi ngờ rằng đây là không phải là mức tối đa thực sự mà tôi đoán là ở "góc". EDIT: Theo đuổi này, tôi lập luận rằng gradient có thể cung cấp thêm "chỉ đạo" và bổ sung thêm một chức năng 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) 
} 

này đã "chỉ đạo" việc tối ưu hóa một chút gần gũi hơn với các c (0,999 ..., 0) góc, thay vì di chuyển ra khỏi nó, như nó đã làm cho một số giá trị bắt đầu. Tôi vẫn hơi thất vọng rằng quá trình này dường như "đầu cho vách đá" khi các giá trị bắt đầu là gần trung tâm của khu vực khả thi:

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 

Lưu ý: Hans Werner Borchers gửi một ví dụ tốt về R-Help rằng đã thành công trong việc nhận các giá trị góc bằng cách đặt ràng buộc hơi xa mép:

> 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

Điều này rất hữu ích. Ví dụ tôi đăng không phải là lý tưởng, nhưng tôi có thể xem cách thiết lập chức năng. Vùng khả thi là gì? – user236215

+0

Vùng khả thi là tập hợp các điểm thỏa mãn tất cả các ràng buộc. Một hình tam giác trong đặc tả của bạn. –