Ограничить задачи оптимизации в R - PullRequest
2 голосов
/ 12 марта 2012

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

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

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

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

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

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

Стоимость <= Бюджет </strong>

Я знаю, что мне нужно использовать 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

}

1 Ответ

5 голосов
/ 12 марта 2012

Если вы хотите найти значения 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...