ограниченная оптимизация в R, устанавливающая ограничения

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

Проблема довольно проста, и я могу настроить функцию нормально, но я немного не понимаю, как передать ограничения.

например Проблема, которую я определил, такова (я собираюсь начать с N, фиксированного на 1000, скажем, поэтому я просто хочу решить для X, в конечном итоге я хотел бы выбрать как N, так и X для максимальной прибыли):

поэтому я могу настроить функцию как:

fun <- function(x, N, a, c, s) {   ## a profit function
    x1 <- x[1]
    x2 <- x[2]
    x3 <- x[3]    
    a1 <- a[1]
    a2 <- a[2]
    a3 <- a[3]
    c1 <- c[1]
    c2 <- c[2]
    c3 <- c[3]
    s1 <- s[1]
    s2 <- s[2]
    s3 <- s[3]  
    ((N*x1*a1*s1)-(N*x1*c1))+((N*x2*a2*s2)-(N*x2*c2))+((N*x3*a3*s3)-(N*x3*c3))
}

Мне нужно реализовать следующие ограничения:

x1>=0.03
x1<=0.7
x2>=0.03
x2<=0.7
x3>=0.03
x2<=0.7
x1+x2+x3=1

X здесь представляет собой сегменты, в которых мне нужно оптимально распределить N, поэтому x1 = процент от N для размещения в сегменте 1 и т. Д., Причем каждый сегмент имеет не менее 3%, но не более 70%.

Любая помощь очень ценится ...

например вот пример, который я использовал для проверки того, что функция делает то, что я хочу:

    fun <- function(x, N, a, c, s) {   ## profit function
        x1 <- x[1]
        x2 <- x[2]
        x3 <- x[3]    
        a1 <- a[1]
        a2 <- a[2]
        a3 <- a[3]
        c1 <- c[1]
        c2 <- c[2]
        c3 <- c[3]
        s1 <- s[1]
        s2 <- s[2]
        s3 <- s[3]  
        ((N*x1*a1*s1)-(N*x1*c1))+((N*x2*a2*s2)-(N*x2*c2))+((N*x3*a3*s3)-(N*x3*c3))
    };

    x <-matrix(c(0.5,0.25,0.25));

    a <-matrix(c(0.2,0.15,0.1));

    s <-matrix(c(100,75,50));

    c <-matrix(c(10,8,7));

    N <- 1000;

fun(x,N,a,c,s);

person andrewm4894    schedule 20.12.2012    source источник
comment
Итак ... x[1:3] - переменные, а a[1:3], s[1:3] и c[1:3] - значения? Не могли бы вы уточнить формулировку, которая вам нужна? Мне непонятно ...   -  person digEmAll    schedule 20.12.2012
comment
да, именно так - a [1: 3], s [1: 3], c [1: 3] представляют среднюю историческую скорость активации, расходы, стоимость приобретения ... я пытаюсь выбрать x [1: 3], чтобы максимизировать функция   -  person andrewm4894    schedule 20.12.2012


Ответы (2)


Вы можете использовать пакет lpSolveAPI.

## problem constants
a <- c(0.2, 0.15, 0.1)
s <- c(100, 75, 50)
c <- c(10, 8, 7)
N <- 1000


## Problem formulation
# x1          >= 0.03
# x1          <= 0.7
#     x2      >= 0.03
#     x2      <= 0.7
#          x3 >= 0.03
# x1 +x2 + x3  = 1
#N*(c1- a1*s1)* x1 + (a2*s2 - c2)* x2 + (a3*s3-  c3)* x3

library(lpSolveAPI)
my.lp <- make.lp(6, 3)

Наилучший способ построения модели в решении lp - по столбцам;

#constraints by columns
set.column(my.lp, 1, c(1, 1, 0, 0, 1, 1))
set.column(my.lp, 2, c(0, 0, 1, 1, 0, 1))
set.column(my.lp, 3, c(0, 0, 0, 0, 1, 1))
#the objective function ,since we need to max I set negtive max(f) = -min(f)
set.objfn (my.lp, -N*c(c[1]- a[1]*s[1], a[2]*s[2] - c[2],a[3]*s[3]-  c[3]))
set.rhs(my.lp, c(rep(c(0.03,0.7),2),0.03,1))
#constraint types 
set.constr.type(my.lp, c(rep(c(">=","<="), 2),">=","="))

взгляни на мою модель

my.lp
Model name: 

 Model name: 
             C1     C2     C3          
Minimize  10000  -3250   2000          
R1            1      0      0  >=  0.03
R2            1      0      0  <=   0.7
R3            0      1      0  >=  0.03
R4            0      1      0  <=   0.7
R5            1      0      1  >=  0.03
R6            1      1      1   =     1
Kind        Std    Std    Std          
Type       Real   Real   Real          
Upper       Inf    Inf    Inf          
Lower         0      0      0      
 solve(my.lp)

[1] 0    ## sucess :)

get.objective(my.lp)
[1] -1435
get.constraints(my.lp)
[1] 0.70 0.70 0.03 0.03 0.97 1.00
## the decisions variables
get.variables(my.lp)
[1] 0.03 0.70 0.27
person agstudy    schedule 20.12.2012
comment
это здорово, спасибо, посмотрю, смогу ли я понять это. Нет ли N в спецификации, которую вы дали (например, у меня было N = 1000 для простого начала). также как я могу найти оптимальные значения для x [1: 3] после того, как я запустил команду solution (my.lp) ...? огромное спасибо - person andrewm4894; 20.12.2012
comment
@ user1919374 Да N отсутствует, но вы можете добавить его. Но более важно увидеть, есть ли у вас ограничения на тип переменных решений? все целые, двоичные, например? - person agstudy; 20.12.2012
comment
@ user1919374 Я добавляю N и переменные решений. Но вам нужно интегрировать типы переменных решений, например sset.type (my.lp, c (1,2,3), integer). - person agstudy; 20.12.2012

Привет На всякий случай, если кому-то понадобится, я также нашел ответ, как показано ниже:

Прежде всего, ваша целевая функция может быть написана намного более кратко, используя векторные операции:

> my_obj_coeffs <- function(N,a,c,s) N*(a*s-c)


> fun <- function(x,N,a,c,s) sum(my_obj_coeffs(N,a,c,s) * x)

Вы пытаетесь решить линейную программу, поэтому вы можете использовать ее с помощью симплексного алгоритма. В пакете boot есть облегченная реализация.

> library(boot)

> solution <- function(obj) simplex(obj, diag(3), rep(0.7,3), diag(3), rep(0.03,3), rep(1,3), 1, maxi=TRUE)

Then for the example parameters you used, you can call that solution function:

> a <- c(0.2,0.15,0.1)
> s <- c(100,75,50)
> c <- c(10,8,7)
> N <- 1000
> solution(my_obj_coeffs(N,a,c,s))

Linear Programming Results

Call : simplex(a = obj(N, a, s, c), A1 = diag(3), b1 = rep(0.7, 3), 
    A2 = diag(3), b2 = rep(0.03, 3), A3 = matrix(1, 1, 3), b3 = 1, 
    maxi = TRUE)

Maximization Problem with Objective Function Coefficients
      [,1]
[1,] 10000
[2,]  3250
[3,] -2000
attr(,"names")
[1] "x1" "x2" "x3"


Optimal solution has the following values
  x1   x2   x3 
0.70 0.27 0.03 
The optimal value of the objective  function is 7817.5.
person andrewm4894    schedule 21.12.2012
comment
Я также должен сказать, что проблема, поскольку я сформулировал ее, всегда имеет простое решение, которое состоит в том, чтобы разделить как можно больше на «лучшие» сегменты с учетом ограничений - что довольно очевидно в ретроспективе! - person andrewm4894; 21.12.2012