Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / PHP / Distribución de escaños con el método D’Hondt caso práctico (Bolivia)

Distribución de escaños con el método D’Hondt caso práctico (Bolivia)

Por jc mouse miércoles, junio 4, 2025

El sistema D’Hondt creado por el jurista belga Victor d’Hondt en 1878, es un método de promedio mayor para asignar escaños en los sistemas de representación proporcional por listas electorales.

Los métodos de promedio mayor se caracterizan por dividir mediante sucesivos divisores los totales de los votos obtenidos por los distintos partidos, dando secuencias de cocientes decrecientes para cada partido y asignando los escaños a los promedios más altos. El Sitema D’Hont es bastante proporcional, pero tiende a favorecer un poco más que otros a los grandes partidos.

Actualmente es utilizada por varios paises en todo el mundo, incluido Bolivia.

¿Como funciona el método D’Hont?

En el caso boliviano, se emplea para la distribución de escaños en el senado, 4 por departamento.

A continuación se realizara el ejemplo para la distribución de escaños segun los resultados del departamento de Chuquisaca en las elecciones generales del año 2020.

Paso 1. Establecer partidos y votos.

PartidoVotos
CREEMOS6791
MAS-IPSP148452
FPV6178
PAN-BOL1996
CC139176

Paso 2. Escaños: Como ya mencionamos, el numero de escaños a distribuir es de 4

Paso 3. Implementar el método D’Hondt

Como los escaños a distribuir son 4, se debe ir dividiendo los votos por partido desde 1 hasta el numero de escaños a asignar, en este ejemplo, 4.

Tenemos:

Partido/1/2/3/4
CREEMOS6,791.003,395.502,263.671,697.75
MAS-IPSP148,452.0074,226.0049,484.0037,113.00
FPV6,178.003,089.002,059.331,544.50
PAN-BOL1,996.00998.00665.33499.00
CC139,176.0069,588.0046,392.0034,794.00
Cocientes Calculados y Asignación de Escaños

Una vez realizado los calculos, buscamos los valores mayores, en este ejemplo, los primeros 4.

RankingPartidoDivisorCocienteEscaño Asignado
1MAS-IPSP1148,452.00Si
2CC1139,176.00Si
3MAS-IPSP274,226.00Si
4CC269,588.00Si
Cocientes Ordenados (de Mayor a Menor)

Paso 4. Resultados finales.

Una vez ordenados los cocientes de mayor a menor en el paso anterior, ya se puede asignar los escaños. Para este ejemplo los resultados son:

PartidoEscaños Asignados
CREEMOS0
MAS-IPSP2
FPV0
PAN-BOL0
CC2

Y si comparamos los resultados obtenidos con los resultados oficiales «SEPARATA RESULTADOS EG 2020» vemos que son dos senadores para el partido CC y dos senadores para el partido MAS-IPSP.

Implementando el método D’Hondt en PHP

<?php

class Dhondt {

    private $parties;
    private $seats;
    private $results;

    public function __construct() {
        $this->parties = [];
        $this->seats = 0;
        $this->results = [];
    }

    /**
     * Establece los datos de los partidos políticos y sus votos.
     *
     * @param array $parties Un array asociativo donde la clave es la sigla del partido y el valor son los votos.
     * Ejemplo: ['Partido A' => 10000, 'Partido B' => 8000, 'Partido C' => 3000]
     */
    public function setParties(array $parties) {
        if (empty($parties)) {
            throw new InvalidArgumentException("La lista de partidos no puede estar vacía.");
        }
        // Validar que los votos sean números enteros no negativos
        foreach ($parties as $partyName => $votes) {
            if (!is_int($votes) || $votes < 0) {
                throw new InvalidArgumentException("Los votos para '{$partyName}' deben ser un número entero no negativo.");
            }
        }
        $this->parties = $parties;
    }

    /**
     * Establece el número total de escaños a asignar.
     *
     * @param int $seats El número total de escaños.
     */
    public function setSeats(int $seats) {
        if ($seats <= 0) {
            throw new InvalidArgumentException("El número de escaños debe ser mayor que cero.");
        }
        $this->seats = $seats;
    }

    /**
     * Procesa la información utilizando el sistema D'Hondt para asignar los escaños.
     *
     * @return array Un array asociativo con los resultados de la asignación de escaños por partido.
     * Ejemplo: ['Partido A' => 5, 'Partido B' => 3, 'Partido C' => 1]
     * @throws RuntimeException Si no se han establecido los partidos o el número de escaños.
     */
    public function processResults(): array {
        if (empty($this->parties)) {
            throw new RuntimeException("No se han establecido los datos de los partidos. Use setParties().");
        }
        if ($this->seats === 0) {
            throw new RuntimeException("No se ha establecido el número de escaños. Use setSeats().");
        }

        // Inicializar los escaños de cada partido a cero
        foreach ($this->parties as $partyName => $votes) {
            $this->results[$partyName] = 0;
        }

        // Crear una lista de cocientes para cada partido
        $quotients = [];
        foreach ($this->parties as $partyName => $votes) {
            for ($i = 1; $i <= $this->seats; $i++) {
                $quotient = $votes / $i;
                $quotients[] = [
                    'party' => $partyName,
                    'quotient' => $quotient
                ];
            }
        }

        // Ordenar los cocientes de mayor a menor
        usort($quotients, function($a, $b) {
            return $b['quotient'] <=> $a['quotient'];
        });

        // Asignar escaños hasta que se hayan repartido todos los escaños disponibles
        for ($i = 0; $i < $this->seats; $i++) {
            if (isset($quotients[$i])) {
                $assignedParty = $quotients[$i]['party'];
                $this->results[$assignedParty]++;
            }
        }

        return $this->results;
    }

    /**
     * Retorna los resultados de la asignación de escaños.
     * Se debe llamar a processResults() primero para que haya resultados disponibles.
     *
     * @return array Un array asociativo con los resultados de la asignación de escaños por partido.
     */
    public function getResults(): array {
        return $this->results;
    }

}

Y ejecutando el algoritmo con los datos de ejemplo tenemos:

<?php 
include "Dhondt.php";

try {
    $dhondt = new Dhondt();

    // 1. Establecer los partidos y sus votos
    $partiesData = [
        'CREEMOS' => 6791,
        'MAS-IPSP' => 148452,
        'FPV' => 6178,
        'PAN-BOL' => 1996,
        'CC' => 139176,
    ];
    $dhont->setParties($partiesData);

    // 2. Establecer el número total de escaños a asignar
    $totalSeats = 4;
    $dhont->setSeats($totalSeats);

    // 3. Procesar los resultados
    $allocatedSeats = $dhont->processResults();
    
    // 4. Obtener y mostrar los resultados
    echo "Asignación de escaños según el Sistema D'Hondt para {$totalSeats} escaños:<br>";
    print("<pre>".print_r($allocatedSeats,true)."</pre>");

} catch (InvalidArgumentException $e) {
    echo "Error de argumento: " . $e->getMessage() . "\n";
} catch (RuntimeException $e) {
    echo "Error de ejecución: " . $e->getMessage() . "\n";
} catch (Exception $e) {
    echo "Error inesperado: " . $e->getMessage() . "\n";
}

Obtenemos:

Enjoy!!!

Tags

Artículos similares

Criba de Eratóstenes animado

Eratóstenes era un matemático griego del siglo  III a.C. el cual ideó una manera rápida de obtener todos los números pri[...]

SQLite: Encriptación de datos

SQLite es un sistema de gestión de bases de datos relacional,  escrita en C, si se desea hacer uso de encriptación con S[...]

Pruebas funcionales con AssertJ Swing

AssertJ Swing es una biblioteca para Java que proporciona una interfaz fluida para la realización automatizada de prueba[...]

HSQLDB: Gestor de bases de datos libre en java

HyperSQL DataBase (HSQLDB) es un moderno administrador de bases de datos relacionales, es portátil e implementado en jav[...]

Camara de Seguridad por Internet (LiveCam)

Existen muchas camaras de seguridad por internet algunas protegidas por contraseña pero la mayoria no, utilizando el hac[...]

FOCA: Herramienta para recolección y análisis de Metadatos

La recolección de información (Information Gathering) es una de las partes más importantes en la planificación y ataques[...]