Problema de maximización con restricciones en R.
Tengo un problema de maximización bajo ciertas restricciones.
Tengo 3 jugadores diferentes en una cadena. Cada uno debe “anunciar” una cantidad (x) de (e) para consumir. Todos tienen la misma función de utilidad que es u(x) = sqrt(x).
Ahora quiero maximizar la suma de todas las u(x) (jugador 1, jugador 2 y jugador 3). Sin embargo, la elección de x para el jugador 2 depende de la elección del jugador 1, y la elección del jugador 3 depende de la elección del jugador 2 (y, por lo tanto, indirectamente, de la elección del jugador 1). (Como ejemplo: el jugador 1 tiene e=3 pero elige x=2, ahora el jugador 2 tiene x=2 + la diferencia entre x1 y e1, en este caso 1)
Por lo tanto, las siguientes restricciones:
x1<=e1
x1+x2<=e1+e2
x1+x2+x3<=e1+e2+e3-x1-x2
y
x1+x2+x3=sum(e)
con todos los e: 0<=e<=10 (e es un número aleatorio generado entre 0 y 10)
Como ejemplo:
e1=4, e2=1, e3=2, e4=1
En este caso, para maximizar la suma de u(x)=sqrt(x), el jugador 1 anunciará x1=2, lo que dará sqrt(2)=1.41 y por lo tanto envía 2 unidades a lo largo de la cadena.
El jugador 2 ahora se enfrenta a: x2<=e1+e2-x1 => x2<=4+1-2 y elegirá x2=2 para maximizar la suma de u(x)=sqrt(x) y, por lo tanto, enviará 1 unidad a lo largo de la cadena.
El jugador 3 luego se enfrentará a x3=e1+e2+e3-x1-x2 => x3<=4+1+2-2-2 y elegirá x3=2 y enviará 1 unidad a lo largo de la cadena.
En este punto, el jugador 4 no tiene ninguna elección, pero para el entendimiento: el jugador 4 se enfrenta a x4<=e1+e2+e3+e4-x1-x2-x3 => x4<=4+1+2+1-2-2-2 y elegirá x4=2.
La parte complicada para mí es que la elección del siguiente jugador depende de la elección del jugador anterior y realmente estoy teniendo dificultades con la programación de esto.
¿Alguna idea de cómo maximizar u(x) dada este problema?
davy.ai
Para resolver este problema de maximización, podemos utilizar la función
optim()
en R. Sin embargo, debido a las restricciones e interdependencia de las elecciones de los jugadores, necesitamos definir una función de optimización personalizada que tenga en cuenta las restricciones.Así es como podemos definir la función de optimización personalizada:
“`{r}
u <- function(x) sqrt(x) # función de utilidad
custom_optim <- function(x, e) {
x1 <- x[1]
x2 <- x[2]
x3 <- x[3]
# comprobar si se cumplen las restricciones
if (x1 > e[1]) return(Inf)
if (x1 + x2 > e[1] + e[2]) return(Inf)
if (x1 + x2 + x3 > e[1] + e[2] + e[3] – x1 – x2) return(Inf)
# calcular la utilidad total
utilidad_total <- u(x1) + u(x2) + u(x3)
# devolver la utilidad total negativa para maximizar
return(-utilidad_total)
}
En este ejemplo, las elecciones óptimas de
x
sonc(2, 2, 1)
, lo que corresponde a una utilidad total deu(2) + u(2) + u(1) = 2.83 + 2.83 + 1 = 6.66
.