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.
Partido | Votos |
CREEMOS | 6791 |
MAS-IPSP | 148452 |
FPV | 6178 |
PAN-BOL | 1996 |
CC | 139176 |
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 |
CREEMOS | 6,791.00 | 3,395.50 | 2,263.67 | 1,697.75 |
MAS-IPSP | 148,452.00 | 74,226.00 | 49,484.00 | 37,113.00 |
FPV | 6,178.00 | 3,089.00 | 2,059.33 | 1,544.50 |
PAN-BOL | 1,996.00 | 998.00 | 665.33 | 499.00 |
CC | 139,176.00 | 69,588.00 | 46,392.00 | 34,794.00 |
Una vez realizado los calculos, buscamos los valores mayores, en este ejemplo, los primeros 4.
Ranking | Partido | Divisor | Cociente | Escaño Asignado |
1 | MAS-IPSP | 1 | 148,452.00 | Si |
2 | CC | 1 | 139,176.00 | Si |
3 | MAS-IPSP | 2 | 74,226.00 | Si |
4 | CC | 2 | 69,588.00 | Si |
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:
Partido | Escaños Asignados |
CREEMOS | 0 |
MAS-IPSP | 2 |
FPV | 0 |
PAN-BOL | 0 |
CC | 2 |
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!!!
En este post te hablaremos sobre una interesante herramienta para le lectura y edición de metadatos que no te debe de fa[...]
Continuación del tutorial «Google Circles en java» o.O 🙂 La Interfaz El proyecto consta de una sola interfaz la cual es[...]
De las pocas herramientas disponibles entre librerías, frameworks, engines, etc para el desarrollo de videojuegos en len[...]
El patrón de desbloqueo es una medida de seguridad que tienen algunos teléfonos inteligentes para evitar el acceso al di[...]
«MyBatis es una herramienta de persistencia Java que se encarga de mapear sentencias SQL y procedimientos almacenados co[...]
Melody.ml es un aplicación online que usa la I.A (Inteligencia Artificial) para procesar archivos MP3 y separar en pist[...]