Sistema D'hondt de reparto de escaños en PHP - Brainum

Sistema D'hondt de reparto de escaños en PHP

Volver atrás

Publicado por |

¿Qué es el sistema D'hondt?

Es un algoritmo empleado generalmente para resultados electorales. Tomando como referencia los votos de cada partido, el número total de votos y la cantidad de escaños a repartir, asigna un número de escaños a cada partido.

¿Cómo funciona el sistema D'hondt?

Método 1.

  1. Tenemos un número n de escaños y varios partidos políticos con sus correspondientes votos.
  2. El partido que más votos tiene se suma un escaño. El número de votos será ahora el número de votos totales entre el número de escaños que tiene más 1 (en el caso del primer escaño, se dividen sus votos entre 2).
  3. Se vuelve a repetir el paso 2 hasta que se repartan todos los escaños.

Método 2.

También es común que se suela hacer mediante una tabla:

  1. Se hace una tabla con tantas filas como partidos políticos haya, y se pone en una primera columna su nombre o identificador.
  2. En las siguientes columnas irá el número de votos dividido por el número de la columna (sin contar la que le corresponde al nombre). Es decir, en la primera se dividirá por 1 el número de votos, y en las siguientes por 2,3,4,5...
  3. Siendo n el número de escaños a repartir, encuentra los n valores más grandes. 
  4. Cada uno de los partidos tendrá tantos escaños como valores tenga dentro de esos n valores más grandes.

Ejemplo del método 2

Además de aplicar el sistema D'hondt, en las elecciones también se puede imponer un porcentaje mínimo de votos: aquello que no lo superen, no participarán en el reparto de escaños. Esta funcionalidad estará incluida en el código, junto a la de contar los votos en blanco.

Sistema D'hondt en PHP

He preparado un código con Programación Orientada a Objetos para facilitar la tarea y para presentarlo de una forma más elegante. El código es el siguiente:

function sortPartiesCmp($a, $b) {
    if ($a['votes'] == $b['votes']) return 0;
    else return ($a['votes'] > $b['votes']) ? -1 : 1;
}
class Dhondt {
    public $seats = 0,$min = 0,$blankVotes = 0;
    private $votes = 0,$parties = array();

    public function addParty($ent,$votes) {
        $this->parties[] = array('ent'=>$ent,'votes'=>$votes,'seats'=>0,'ok'=>true);
        $this->votes += $votes;
    }
    public function addParties($parties) {
        if(is_array($parties)) 
            foreach($parties as $party) { 
                if(isset($party['ent']) && isset($party['votes'])) {
                    $party['seats'] = 0; $party['ok'] = true;
                    $this->parties[] = $party; 
                    $this->votes += $party['votes'];
                }
            }
    }
    public function process() {
        $this->totalVotes = ($this->blankVotes+$this->votes);
        $minVotes = $this->totalVotes*$this->min/100;

        foreach($this->parties as $p) { 
            if($p['votes'] <= $minVotes) $p['ok'] = false; 
        }

        for($i = 0;$i<$this->seats;$i++) {
            foreach($this->parties as $id=>$p) { 
                if($p['ok'] && $p['votes']/(1+$p['seats'])>@$max[1]) 
                    $max = array($id,$p['votes']/(1+$p['seats'])); 
            }
            $this->parties[$max[0]]['seats']++;
            $max = array();
        }
        usort($this->parties, "sortPartiesCmp");
    }
    public function getParties() {
        return $this->parties;
    }
    public function getVotes() {
        return $this->totalVotes;
    }
}

Sistema D'hondt en PHP: Cómo usarlo

Usando esta clase podremos aplicar el método D'hondt, con unos partidos políticos y unas opciones puestas por nosotros. Ahora, vamos a explicar cómo utilizarlo:

Iniciamos la clase. En primer lugar llamaremos a la clase, que guardaremos en una variable.

$d = new Dhondt;

Configuramos. Asignamos el número de escaños a repartir, el número de votos en blanco y el % mínimo para participar.

$d->seats = 8;
$d->blankVotes = 0;
$d->min = 3;

Damos información electoral. Añadimos los partidos políticos y su número de votos. El primer parametro no influirá en el algoritmo, servirá para que el usuario identifique a los partidos como desee.

$d->addParty('Partido A',1289);
$d->addParty('Partido B',2956);
$d->addParty('Partido C',4268);
$d->addParty('Partido D',769);

Y finalmente, procesamos:

$d->process();


Para saber la asignación de escaños totales usaremos la función getParties() de la clase. Esto nos devolverá un array que podremos manejar, con los partidos políticos ordenados por votos.

$data = $d->getParties()

El array que obtendremos si hacemos un print_r() en este caso será el siguiente:

Array
(
    [0] => Array
        (
            [ent] => Partido C
            [votes] => 4268
            [seats] => 4
            [ok] => 1
        )

    [1] => Array
        (
            [ent] => Partido B
            [votes] => 2956
            [seats] => 3
            [ok] => 1
        )

    [2] => Array
        (
            [ent] => Partido A
            [votes] => 1289
            [seats] => 1
            [ok] => 1
        )

    [3] => Array
        (
            [ent] => Partido D
            [votes] => 769
            [seats] => 0
            [ok] => 1
        )

)


Información de cada partido.

Cada partido tiene una información, que es la siguiente:

  • $party['ent']: corresponderá al identificador que le damos al partido al principio.
  • $party['votes']: número de votos que ha obtenido.
  • $party['seats']: escaños que le tocan.
  • $party['ok']: valor booleano que indica si ha participado en el reparto. Si no ha participado significa que se ha queado por debajo del umbral de votos requerido.

Imprimiendo los resultados.

foreach($parties as $p) {
    echo $p['ent']." ha conseguido ".$p['seats']." escaños con ".$p['votes']." votos (".round(($p['votes']/$d->getVotes())*100,2)."%)
\n"; }


PHP sistemas electoralesmatemáticaspoo

Programación

Redes sociales

Twitter BrainumGoogle Plus BrainumFacebook Brainum


Política de privacidad