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

Lectura y edición de metadatos con ExifTool

En este post te hablaremos sobre una interesante herramienta para le lectura y edición de metadatos que no te debe de fa[...]

Botones circulares de Google Plus en java

Continuación del tutorial «Google Circles en java» o.O 🙂 La Interfaz El proyecto consta de una sola interfaz la cual es[...]

Desarrollo de juegos con Libgdx y Android Studio

De las pocas herramientas disponibles entre librerías, frameworks, engines, etc para el desarrollo de videojuegos en len[...]

Crea patrón de desbloqueo para tus aplicaciones en java

El patrón de desbloqueo es una medida de seguridad que tienen algunos teléfonos inteligentes para evitar el acceso al di[...]

Ejemplo de operaciones CRUD con MyBatis 3

«MyBatis es una herramienta de persistencia Java que se encarga de mapear sentencias SQL y procedimientos almacenados co[...]

Melody ML: Separa fácilmente pistas de audio usando IA

Melody.ml  es un aplicación online que usa la I.A (Inteligencia Artificial) para procesar archivos MP3 y separar en pist[...]