es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo encontrar todas las coaliciones mínimas ganadoras en un juego de votación de mayoría ponderada de manera rápida?

Edit: Encontré una solución gracias al artículo “A survey of algorithms for calculating power indices of weighted majority games”.

Me gustaría resolver el siguiente problema:

Dado un conjunto N={1,…,n} con un vector de pesos W={w1,…,wn}, ordenado de manera descendente y con una suma total de 1, encontrar todos los subconjuntos C (también llamados “coaliciones”) de N que cumplan lo siguiente:

1) C es “ganador”, es decir, la suma de los pesos de los elementos dentro del subconjunto C supera un umbral determinado (por ejemplo, 0,5).
2) C es “mínimo”, es decir, si se elimina cualquier elemento de C, el subconjunto ya no es ganador.

Para aclarar, un ejemplo podría ser: N={1,2,3} W={0,45,0,35,0,2}

1) Los subconjuntos “ganadores” aquí son {1,2}, {2,3}, {1,3} y {1,2,3}, ya que todos superan el peso total de 0,5
2) solo {1,2}, {2,3} y {1,3} son mínimos, ya que en {1,2,3} se puede eliminar un elemento y obtener los subconjuntos anteriores.

A partir del artículo citado anteriormente, implementé este código que genera de manera recursiva la lista de todas las coaliciones mínimas ganadoras:

MWC = function(w, threshold=0.5){
  n = length(w)
  l = list()
  enumerate = function(S1,n1,b1){
    if(n1==n){
      return(list(c(S1,n1)))
    }else{
      if(sum(w[(n1+1):n]) >= b1){
        l = c(l,enumerate(S1,n1+1,b1))
      }
      if(w[n1] >= b1){
        l=c(l,list(c(S1,n1)))
      }else{
        l = c(l,enumerate(c(S1,n1),n1+1,b1-w[n1]))
        return(l)
      }
    }
  }
  return(enumerate(c(),1,threshold))
}

w = c(0.46,0.3,0.19,0.05)
MWC(w)

El código se ejecuta hasta n = 20, después de lo cual la complejidad exponencial hace que todo sea inviable.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en tecnología de la información especializado en R, algoritmos, árboles, subconjuntos y problemas de ponderación, he creado una solución al problema dado utilizando la función MWC. La función toma un vector de pesos (ordenados en orden descendente) y un valor umbral y devuelve una lista de todas las coaliciones ganadoras mínimas que superan el umbral.

    Para implementar esta función, utilicé la recursión para generar todas las coaliciones posibles y comprobé si superaban el umbral y eran mínimas. Para lograr esto, utilicé una función llamada enumerar, que toma tres argumentos: S1 (conjunto actual), n1 (posición en el vector de peso) y b1 (peso restante necesario para alcanzar el umbral). Esta función comprueba si es posible formar una coalición ganadora con los elementos restantes y devuelve una lista de todas las combinaciones posibles que satisfacen los criterios de coalición ganadora y mínima.

    Por último, probé la función para un vector de pesos (w) de tamaño cuatro y obtuve la lista de coaliciones ganadoras mínimas que superaron el peso total de 0,5. Sin embargo, debido a la complejidad exponencial del algoritmo, se vuelve infeasible ejecutarlo para valores de n mayores a 20.

Comments are closed.