2015-05-27 15 views
6

मैं स्थानीय कार्य को न्यूनतम करने का प्रयास कर रहा हूं, और पैरामीटर के पास निश्चित राशि है। उदाहरण के लिए,समानता और असमानता बाधाओं के साथ आर अनुकूलन

Fx = 10 - 5x1 + 2x2 - x3

और शर्तों इस प्रकार हैं,

x1 + x2 + x3 = 15

(x1, x2, x3)> = 0

जहां x1, x2, और x3 का योग ज्ञात मान है, और वे शून्य से अधिक हैं। आर में, यह कुछ इस तरह,

Fx = function(x) {10 - (5*x[1] + 2*x[2] + x[3])} 
opt = optim(c(1,1,1), Fx, method = "L-BFGS-B", lower=c(0,0,0), upper=c(15,15,15)) 

मैं भी constrOptim साथ असमानता का उपयोग करने के योग तय किया करने के लिए मजबूर करने की कोशिश की लगेगा। मुझे अभी भी लगता है कि यह एक व्यावहारिक काम हो सकता है, लेकिन मैं इसे काम करने में असमर्थ था। यह असली समस्या का एक सरल उदाहरण है, लेकिन किसी भी मदद की सराहना की जाएगी।

उत्तर

6

इस अवसर पर optim स्पष्ट रूप से काम नहीं करेगा क्योंकि आपके पास समानता बाधाएं हैं। constrOptim इसी कारण से काम नहीं करेगा (मैंने समानता को दो असमानताओं में परिवर्तित करने की कोशिश की है यानी 15 से अधिक और कम से कम लेकिन यह constrOptim के साथ काम नहीं करता है)।

हालांकि, इस तरह की समस्या के लिए समर्पित एक पैकेज है और यह Rsolnp है।

आप इसे निम्नलिखित तरीके से उपयोग:

#specify your function 
opt_func <- function(x) { 
    10 - 5*x[1] + 2 * x[2] - x[3] 
} 

#specify the equality function. The number 15 (to which the function is equal) 
#is specified as an additional argument 
equal <- function(x) { 
    x[1] + x[2] + x[3] 
} 

#the optimiser - minimises by default 
solnp(c(5,5,5), #starting values (random - obviously need to be positive and sum to 15) 
     opt_func, #function to optimise 
     eqfun=equal, #equality function 
     eqB=15, #the equality constraint 
     LB=c(0,0,0), #lower bound for parameters i.e. greater than zero 
     UB=c(100,100,100)) #upper bound for parameters (I just chose 100 randomly) 

आउटपुट:

> solnp(c(5,5,5), 
+  opt_func, 
+  eqfun=equal, 
+  eqB=15, 
+  LB=c(0,0,0), 
+  UB=c(100,100,100)) 

Iter: 1 fn: -65.0000  Pars: 14.99999993134 0.00000002235 0.00000004632 
Iter: 2 fn: -65.0000  Pars: 14.999999973563 0.000000005745 0.000000020692 
solnp--> Completed in 2 iterations 
$pars 
[1] 1.500000e+01 5.745236e-09 2.069192e-08 

$convergence 
[1] 0 

$values 
[1] -10 -65 -65 

$lagrange 
    [,1] 
[1,] -5 

$hessian 
      [,1]  [,2]  [,3] 
[1,] 121313076 121313076 121313076 
[2,] 121313076 121313076 121313076 
[3,] 121313076 121313076 121313076 

$ineqx0 
NULL 

$nfuneval 
[1] 126 

$outer.iter 
[1] 2 

$elapsed 
Time difference of 0.1770101 secs 

$vscale 
[1] 6.5e+01 1.0e-08 1.0e+00 1.0e+00 1.0e+00 

तो जिसके परिणामस्वरूप इष्टतम मान हैं:

$pars 
[1] 1.500000e+01 5.745236e-09 2.069192e-08 

जिसका अर्थ है कि पहले पैरामीटर है 15 और शेष शून्य और शून्य। यह वास्तव में आपके फ़ंक्शन में वैश्विक न्यूनतम है क्योंकि x2 फ़ंक्शन में जोड़ रहा है और 5 * x1 के परिणाम पर x3 की तुलना में बहुत अधिक (नकारात्मक) प्रभाव है। 15, 0, 0 की पसंद बाधाओं के अनुसार समाधान के लिए समाधान और वैश्विक न्यूनतम है।

समारोह बहुत अच्छा काम करता है!

4

यह वास्तव में एक रैखिक प्रोग्रामिंग समस्या है, इसलिए एक प्राकृतिक दृष्टिकोण एक रैखिक प्रोग्रामिंग सॉल्वर जैसे lpSolve पैकेज का उपयोग करना होगा। आप एक उद्देश्य समारोह और एक बाधा मैट्रिक्स प्रदान करने की आवश्यकता है और solver आराम करना होगा:

library(lpSolve) 
mod <- lp("min", c(-5, 2, -1), matrix(c(1, 1, 1), nrow=1), "=", 15) 

तो फिर तुम इष्टतम समाधान और उद्देश्य मूल्य उपयोग कर सकते हैं (निरंतर अवधि 10 है, जो करने के लिए प्रदान नहीं की है जोड़ने solver):

mod$solution 
# [1] 15 0 0 
mod$objval + 10 
# [1] -65 

एक रैखिक प्रोग्रामिंग solver एक अच्छा सौदा एक सामान्य nonlinear अनुकूलन solver से जल्दी होना चाहिए और उस गोलाई त्रुटियों के अधीन हो सकता सटीक इष्टतम समाधान (लौटने के पास के एक बिंदु के बजाय मुसीबत नहीं होना चाहिए)।

+1

अच्छा है! जब ओपी कहता है: "यह वास्तविक समस्या का एक सरल उदाहरण है" यह मुझे सोचता है कि वास्तविक समस्या nonlinear हो सकती है। तो, बस यह सुनिश्चित करने के लिए कि मैंने एक nonlinear विधि का सुझाव दिया है (जो कि धीमा होने पर भी काम करता है)। यदि गति एक मुद्दा है तो ढाल प्रदान करना (इस मामले के लिए सरल) इसे और भी तेज बनाता है। वैसे भी, मेरा मतलब बुरा नहीं है, यह वाकई अच्छा है कि आपने यह जवाब जोड़ा, निश्चित रूप से सहायक। – LyzandeR

संबंधित मुद्दे