Encontrar las mejores opciones de combinaciones basado en ponderaciones
El problema que presento es distribuir 8 profesores en ciertas materias teórico-prácticas, donde la parte de teoría es dada por un solo profesor y la parte práctica por cada 8 alumnos hay dos profesores.
Mi forma de plantear este problema fue a través de ponderaciones, donde existe cirta preferencia a qué determinado profesor la imparta, y otros que definitivamente prefieres excluirlos. Así mismo se consideran casos donde en la parte practica hay más de 8 alumnos pero menos de 16 y más de 16 pero menos de 24. Para esto ocupé permutaciónes, la principal que es en condiciones ideales solo seria una permutación de 8 en 2, uno profesor en teoría y otro en práctica, si hay más de 8 alumnos, entonces sería una permutación de 8 en 3 y asi sucesivamente.
Uno de los principales problemas que encontramos es como determinar las permutaciónes óptimas, para esto ocupamos la media de la permutación seleccionada, y basado en un determinado valor mínimo que deba cumplir esa permutación es selecionada o es rechazada. Otro de los problemas que tenemos es que tan solo hacer el segundo caso de 8 en 3 se obtenien 336 permutaciones, lo cual vuelve tedioso los cálculos y muy tardado, por lo que opt por programarlo en lenguaje R, que anexo al final de esta publicación.
La primera parte del programa es donde se ingresan los valores necesarios, la ponderación de profesores (A,...,H), los casos (n), Nuestro valor mínimo que debe cumplir la permutación(Max).
El resultado nos da un matriz con las permutaciónes seleccionadas.
#ponderación
A <- 5
B <- 3
C <- 2
D <- 4
E <- 5
f <- 1
G <- 3
H <- 4
#espacios disponibles de acuerdo a numero de alumnos
n <-3
#Medida de preferencia
Max <- 4.4
#Vector de profesores
Profesores <- c("A","B","C","D","E","f","G","H")
#Permutación
Convi <- permutations(8,n,Profesores)
#Propuestas
Convi.2 <- t(Convi)
#Numero de propuestas
b<- Convi.2[1,]
u<- length(b)
#Definimos nuevs matrices para inspeccionar las propuestas
m<- matrix(0,nrow = n, ncol = u)
New <- matrix(0,nrow = n, ncol = u)
#Empezamos el analisis
for (j in 1:u) {
for (i in 1:n) {
t<- Convi.2[i,j]
if (t=="A") m[i,j]= A
else if(t=="B") m[i,j]=B
else if(t=="C") m[i,j]=C
else if(t=="D") m[i,j]=D
else if(t=="E") m[i,j]=E
else if(t=="f") m[i,j]=f
else if(t=="G") m[i,j]=G
else if(t=="H") m[i,j]=H
}
if (mean(m[,j])>Max) New[,j] <- m[,j] else NULL
}
#Para encontrar los selecionados preferentes
Posicion <- c(1:u)
Media <- c(1:u)
for (o in 1:u) {
Media[o] <- mean(New[,o])
}
Detect<- Media>Max
Buenas <- Posicion[Detect]
p<- length(Buenas)
#Definimos la matriz final
Finales <- matrix(0,nrow = n,ncol = p)
for (i in 1:p) {
Finales[,i]<- Convi.2[,Buenas[i]]
}
#Resultado
View(Finales)
i<- Finales[1,]
length(i)
Comentarios
Publicar un comentario