2012-03-12 7 views
2

Я пытаюсь настроить сценарий оптимизации, который будет рассматривать набор моделей, подгонять кривые к моделям и затем оптимизировать их по нескольким параметрам.Проблемы оптимизации оптимизации в R

По существу, у меня есть доход как функция стоимости, в уменьшающейся функции, и у меня есть это для нескольких портфелей, скажем 4 или 5. В качестве ввода у меня есть показатели затрат и доходов с установленными приращениями. То, что я хочу сделать, соответствует кривой портфеля формы Revenue = A * cost^B, а затем оптимизируется в разных портфелях, чтобы найти оптимальное соотношение затрат между каждым портфелем для заданного бюджета.

Код (я извиняюсь за его неэффективность, я уверен, что есть много улучшений!) По существу читает в моих данных, в этом случае симуляция создает необходимые кадры данных (это вероятно, где моя inelegance приходит), вычисляет необходимые переменные для кривых для каждой моделировки и производит графику для проверки встроенной кривой на данные.

Моя проблема заключается в том, что теперь у меня есть 5 кривых вида:

доход = A * Стоимость^B (разные A, B и стоимость для каждой функции)

И я хочу знать, , учитывая 5 переменных, как я должен разделить свою стоимость между ними, так что я хочу, чтобы оптимизировать сумму 5 кривых, подлежащих

стоимость < = бюджет

Я знаю, что мне нужно использовать constrOptim, но я потратил буквально часы, ударяя головой о мой стол (буквально часы, а не буквально ударяя головой ...), и я до сих пор не могу понять, как настроить функцию так что он максимизирует доход при условии ограничения затрат ...

Любая помощь здесь будет принята с благодарностью, это беспокоило меня в течение нескольких недель.

Спасибо!

Rich

## clear all previous data 

rm(list=ls()) 
detach() 
objects() 

library(base) 
library(stats) 

## read in data 

sim<-read.table("input19072011.txt",header=TRUE) 
sim2<-data.frame(sim$Wrevenue,sim$Cost) 

## identify how many simulations there are - here you can change the 20 to the number of steps but all simulations must have the same number of steps 

portfolios<-(length(sim2$sim.Cost)/20) 

## create a matrix to input the variables into 

a<-rep(1,portfolios) 
b<-rep(2,portfolios) 
matrix<-data.frame(a,b) 

## create dummy vector to hold the revenue predictions 

k<-1 
j<-20 

for(i in 1:portfolios){ 

test<-sim2[k:j,] 

rev9<-test[,1] 
cost9<-test[,2] 

ds<-data.frame(rev9,cost9) 

rhs<-function(cost, b0, b1){ 
b0 * cost^b1 

m<- nls(rev9 ~ rhs(cost9, intercept, power), data = ds, start = list(intercept = 5,power = 1)) 

matrix[i,1]<-summary(m)$coefficients[1] 
matrix[i,2]<-summary(m)$coefficients[2] 

k<-k+20 
j<-j+20 

} 

## now there exists a matrix of all of the variables for the curves to optimise 

matrix 
multiples<-matrix[,1] 
powers<-matrix[,2] 
coststarts<-rep(0,portfolios) 

## check accuracy of curves 

k<-1 
j<-20 

for(i in 1:portfolios){ 

dev.new() 

plot(sim$Wrevenue[k:j]) 
lines(multiples[i]*(sim$Cost[k:j]^powers[i])) 

k<-k+20 
j<-j+20 

} 
+0

Связанные вопрос: http://stackoverflow.com/questions/9592369/in-r-how-do-i-find-the-optimal-variable-to-maximize-or-minimize-correlation-bet/9593809 # 9593809 –

ответ

5

Если вы хотите найти значение cost[1] ..., cost[5] , которые максимизируют revenue[1]+...+revenue[5] при ограничениях cost[1]+...+cost[5]<=budget0 <= cost[i] <= budget), вы можете Параметризуете набор возможные решения следующим образом

cost[1] = s(x[1]) * budget 
cost[2] = s(x[2]) * (budget - cost[1]) 
cost[3] = s(x[3]) * (budget - cost[1] - cost[2]) 
cost[4] = s(x[4]) * (budget - cost[1] - cost[2] - cost[3]) 
cost[5] = budget - cost[1] - cost[2] - cost[3] - cost[4] 

, где x[1], ..., x[4] - это параметры для поиска (без ограничений на них) и s - любое взаимное отклонение между реальной линией R и отрезком (0,1).

# Sample data 
a <- rlnorm(5) 
b <- rlnorm(5) 
budget <- rlnorm(1) 

# Reparametrization 
s <- function(x) exp(x)/(1 + exp(x)) 
cost <- function(x) { 
    cost <- rep(NA,5) 
    cost[1] = s(x[1]) * budget 
    cost[2] = s(x[2]) * (budget - cost[1]) 
    cost[3] = s(x[3]) * (budget - cost[1] - cost[2]) 
    cost[4] = s(x[4]) * (budget - cost[1] - cost[2] - cost[3]) 
    cost[5] = budget - cost[1] - cost[2] - cost[3] - cost[4] 
    cost 
} 

# Function to maximize 
f <- function(x) { 
    result <- sum(a * cost(x)^b) 
    cat(result, "\n") 
    result 
} 

# Optimization 
r <- optim(c(0,0,0,0), f, control=list(fnscale=-1)) 
cost(r$par) 
+0

Спасибо! Я собираюсь потратить tomorrpw утром, пытаясь понять, что вы написали, и я вернусь к вам, если у меня возникнут вопросы (я неизбежно буду). Но большое спасибо за вашу помощь! –

+0

Привет, спасибо, это было действительно полезно, и теперь это работает.Единственное, что я пытаюсь сделать сейчас, это оптимизация, чтобы быть переменной в зависимости от того, сколько портфелей у меня (может быть в любом случае от 2 до 100). Но я уверен, что я это выясню :). Благодаря! –

+0

Был ли у вас взгляд на пакет LIM? http://cran.r-project.org/package=LIM – user2030503

Смежные вопросы