Una aplicación del método Sainte-Laguë en C++ - Brainum

Una aplicación del método Sainte-Laguë en C++

Volver atrás

Publicado por |

Antes de empezar, quisiera explicar en qué consiste el método Sainte-Laguë. Hablamos de un sistema de reparto electoral que permite una distribución proporcional de los escaños en las cámaras asamblearias o parlamentarias.

Mi aplicación es básicamente un conjunto de clases a exponer utilizando un árbol UML (Unified Markup Language):

Image title


Las clases hijas de "Circunscipción" gozan de un carácter polivalente. No solo se pueden implementar en una aplicación de distribución electoral ni relacionada en sí con las circunscripciones.

Mientras, la clase madre, puede servir para diseñar una amplia gama de programas de consulta/gestión de información sobre circunscripciones u, obedeciendo a una finalidad que consiste en el reparto de escaños en base a votos. Solo cabría modificar el métododistribuirEscaniosCandidaturas(), que es el que vamos a explicar, puesto que es el que procede a la aplicación de este método, también conocido como "el de la media más alta".

El código del método mencionado, que será posteriormente comentado, es el siguiente:

void distribuirEscaniosCandidaturas()
{
    for (int i = 0; i < this->escanos; i++)
    {
        int codigo_masvotada = 0;
        int votos = 0;
        for (int j = 0; j < this->numero_candidaturas; j++)
        {
            if (distribucion[i][j] > votos)
            {
                codigo_masvotada = j;
                votos = distribucion[i][j];
            }
        }

        Candidatura *masvotada = NULL;
        bool encontrada = false;
        this->candidaturas->marcar1aCandidatura();
        while (!this->candidaturas->seMarcaFinRelacionCandidaturas() && !encontrada)
        {
            this->candidaturas->consultarCandidaturaMarcada(masvotada);
            if (masvotada->consultarCodigo() == codigo_masvotada)
                encontrada = true;
            else
                this->candidaturas->avanzarMarcadorCandidaturas();
        }

        int esc_havegot = masvotada->consultarEscanosObtenidos();
        masvotada->definirEscanosObtenidos(esc_havegot + 1);
        this->candidaturas->marcar1aCandidatura();

        if (i + 1 < this->escanos)
        {
            distribucion[i + 1][codigo_masvotada] = distribucion[0][codigo_masvotada] / (2 * masvotada->consultarEscanosObtenidos() + 1);
            int k = 0;
            while (k < this->numero_candidaturas)
            {
                if (k != codigo_masvotada)
                    distribucion[i + 1][k] = distribucion[i][k];
                k++;
            }
        }
    }
}


El método debería ejecutarse cuando las candidaturas se hayan cargado en la lista con punto de interés (los datos con respecto a las mismas, se toman de un fichero de texto) y los votos de estas, en la primera fila de la matriz distribución.

Se harán tantas iteraciones como escaños haya que repartir. Estas las hace un bucle bajo el cual se llevan a cabo estos procesos:

1. Búsqueda del valor mayor en cada fila, considerado coloquialmente como mayor nº de votos (en contraste con la primera fila, donde la consideración será formal).

2. Una vez obtenida la posición de columna donde se almacene el valor más elevado, busquemos en la lista de candidaturas, a través del código, cuál ha sido la candidatura más votada. El código debe coincidir con el valor de posición de columna al que hemos hecho referencia.

3. Si no se termina la distribución, almacenaremos, en la siguiente fila, valores que resulten de esta fórmula: 

nvotos responderá al valor de la coordenada que responda a la fila anterior pero, a la misma columna. Cada candidatura tendrá su columna; y la variable e  responderá al número de escaños que ese partido más con mayor cociente ha obtenido hasta el momento.

El código del conjunto de clases se encuentra almacenado aquí, tanto en castellano como en inglés.

En conclusión, considérese esta aplicación como una oportunidad óptima para que, con el tiempo, se digitalice el sistema electoral. Asimismo, quisiera remarcar que el código está bajo una licencia MIT.

C/C++ sistemas electoralesmatemáticaspoo

Programación

Redes sociales

Twitter BrainumGoogle Plus BrainumFacebook Brainum


Política de privacidad