Está en la página 1de 27

Desarrollo de un modelo de

programacin entera mixta (MIP) en


GNU/Linux para asignar la carga
acadmica de un colegio
Camilo Bernal
11 de marzo de 2016

ndice
1. Introduccin

2. Qu es GLPK

3. Qu es GNU MathProg

4. Cmo usar GNU MathProg en GLPK

5. Descripcin del caso de estudio

6. Construccin del modelo de programacin


6.1. Elementos del modelo . . . . . . . . . .
6.2. Funcin objetivo . . . . . . . . . . . .
6.3. Restricciones . . . . . . . . . . . . . .

lineal
10
. . . . . . . . . . . . . . . . . . . 10
. . . . . . . . . . . . . . . . . . . 11
. . . . . . . . . . . . . . . . . . . 11

7. Discusin de resultados

12

8. Conclusiones

18

A. Codificacin del modelo de asignacin

20

B. Codificacin de los datos del modelo

22

C. Instrucciones bsicas para el uso del software

24

1.

Introduccin

Aunque la realidad es compleja y la mayora de los problemas computables que se presentan no se pueden expresar como relaciones lineales (frecuentemente ni siquiera se
conocen sus relaciones), dentro de las matemticas aplicadas hay una vasta disciplina
que se llama Investigacin de Operaciones, y dentro de esta se encuentra un gnero
particular de problemas que recibe el nombre de programacin lineal.
La programacin lineal se encarga de encontrar soluciones a problemas complejos cuyas
relaciones entre sus elementos se pueden expresar como relaciones lineales. Esta tcnica
tiene buenas posibilidades de aplicacin a problemas de asignacin de recursos, gestin
logstica, bsqueda del mnimo costo o de la mxima utilidad. . . sujetos a una serie de
restricciones.
Este documento tiene como objetivo presentar una propuesta para resolver un problema de asignacin de carga acadmica a un colegio dedicado a la educacin secundaria mediante un modelo de programacin entera mixta usando el sistema operativo
GNU/Linux, el programa GLPK y el lenguaje de modelamiento GNU MathProg. Se busca ofrecer una metodologa relativamente simple e intuitiva para resolver problemas de
programacin entera mixta (MIP por sus siglas en ingls) para la asignacin de recursos.

2.

Qu es GLPK

GLPK (GNU Linear Programming Kit) es un conjunto de rutinas escritas en el lenguaje


de programacin ANSI C, organizadas en forma de libreras que se pueden invocar. Su
intencin es resolver problemas de programacin lineal (LP), Programacin entera mixta
(MIP), y otros problemas relacionados [Markhorin, 2010a].
Es importante aadir que GLPK, aparte de ser software libre y poder usarse gratuitamente, permite resolver problemas de gran escala (miles de variables y miles de restricciones). Aunque existen paquetes de software privativo en el mercado con estas capacidades,
la gran diferencia es que GLPK se puede adquirir sin ningn costo de licencia ni limitacin, adems, se puede descargar el cdigo fuente para realizar todas las modificaciones
que se deseen a la herramienta para adaptarlo a necesidades especficas.

3.

Qu es GNU MathProg

GNU MathProg es un lenguaje de modelamiento que sirve para escribir modelos de


programacin lineal. Estos modelos consisten en una serie de bloques de sentencias y
datos construidos por el usuario [Markhorin, 2010b].
En un proceso llamado traduccin, un programa llamado el traductor del modelo analiza
la descripcin del modelo y lo traduce a estructuras de datos internos, los cuales pueden
ser usados tanto para generar una instancia del problema de programacin matemtica
como para obtener una solucin numrica del problema con un programa llamado solver
[bid].

4.

Cmo usar GNU MathProg en GLPK

El paquete GLPK incluye el programa glpsol, que acta como solver de problemas
LP/MIP. Este programa se puede lanzar desde la lnea de comandos para resolver modelos escritos en el lenguaje GNU MathProg [Markhorin, 2010b, Op. Cit.].

5.

Descripcin del caso de estudio

En el caso de estudio se considera un colegio de formacin en educacin secundaria que


tiene 6 cursos (6, 7, 8, 9, 10 y 11), dicta cuatro (4) bloques de dos (2) horas cada
da (8 horas diarias de clase) empezando a las 8 de la maana y terminando a las 17:00
horas, con una hora de almuerzo (bloque 1: 8:00-10:00 hrs, bloque 2: 10:00-12:00 hrs,
almuerzo: 12:00-13:00 hrs, bloque 3: 13:00-15:00 hrs y bloque 4: 15:00-17:00 hrs).
El colegio est especialmente enfocado al rea de matemticas y fsica, razn por la cual
se asigna un mayor nmero de horas semanales a estas asignaturas para cada curso. En
las tablas 1, 2, 3, 4, 5 y 6 se muestra el nmero de horas semanales de cada asignatura
para cada curso.
Cuadro 1: Horas de cada asignatura para el curso 6



Fuente: Elaboracin propia

Cuadro 2: Horas de cada asignatura para el curso 7





Fuente: Elaboracin propia

Cuadro 3: Horas de cada asignatura para el curso 8





Fuente: Elaboracin propia

Cuadro 4: Horas de cada asignatura para el curso 9





Fuente: Elaboracin propia

Cuadro 5: Horas de cada asignatura para el curso 10





Fuente: Elaboracin propia

Cuadro 6: Horas de cada asignatura para el curso 11





Fuente: Elaboracin propia

Para algunas asignaturas la carga de trabajo es suficientemente alta para justificar el


trabajo de dos profesores. En otros casos, un mismo profesor puede dictar varias asignaturas. En la tabla 7 se muestra el nmero de horas semanales para cada asignatura.
Las asignaturas marcadas con * sern dictadas por un mismo profesor.

Cuadro 7: Horas semanales de cada asignatura





Fuente: Elaboracin propia

Adems de las caractersticas presentadas hasta ahora, estas son algunas condiciones
adicionales para la asignacin de carga acadmica en el colegio:
Un profesor puede dictar mximo 6 horas de clase (3 bloques) en un da
Se dictan mximo dos horas de cada asignatura a un curso en un da
Se desea que los estudiantes reciban las clases de matemticas y fsica preferiblemente por la maana (esto se debe a que en las horas de la maana las mentes
despejadas trabajan mejor el pensamiento abstracto)
Se desea que los estudiantes reciban las clases de filosofa, geografa e historia
preferiblemente por la tarde (estas asignaturas son menos abstractas, y pueden
dejarse para el final del da)
Se desea que en las asignaturas con varios profesores, estos tengan una carga laboral
similar (el objetivo de esto es equilibrar la carga de trabajo y que el tiempo libre
para preparar clases y exmenes tenga una magnitud similar)

6.

Construccin del modelo de programacin lineal

6.1.

Elementos del modelo

6.1.1.

Conjuntos

C: Conjunto de cursos (C = 6, 7, 8, 9, 10, 11)

P : Conjunto de profesores (P = Bio, Soci, F is1, F is2, Inf o1, Inf o2, Ing1, Ing2, M ate1, M ate2, Qu
A: Conjunto de asignaturas (A={Biologia, Filosofia, Fisica, Geografia, Historia, Informatica, Ingles, Matematicas, Quimica})
H: Conjunto de horas (H = 8, 10, 13, 15)
D: Conjunto de das (D = Lunes, M artes, M iercoles, Jueves, V iernes)

6.1.2.

Parmetros

HACac : # Horas semanales de cada asignatura a para cada curso c


APap : Asignaturas a que dicta cada profesor p
M AD: Maximo numero de asignaturas que dicta un profesor en un da (M AD =
3 bloques)
M HACD: Mximo numero de horas de una asignatura que recibe un curso en un da
(M HACD = 2 horas, 1 bloque)
P Mah : Puntaje para incentivar la asignacin de las clases de matemticas y fsica por
la maana (Magnitud adimensional)
P Tah : Puntaje para incentivar la asignacin de las clases de filosofa, geografa e historia
para la tarde (Magnitud adimensional)

10

6.1.3.

Variables

xapchd =

Si la asignatura a es dictada por el prof esor p al curso c en la hora h el da d

0 En otro caso

a A, p P, c C, h H, d D

6.2.

Funcin objetivo

M aximizar z =

xapchd (P Mah + P Tah )

a A, p P, c C, h H, d D +

apchd

|xap1 chd xap2 chd |

a A, {p1 , p2 } P, c C, h H, d D

achd

6.3.

Restricciones
Un profesor dicta un maximo de seis horas diarias:
P

ach

xapchd 2 M AD

p P, d D

Se dictan mximo dos horas de una asignatura a un curso en un da:


P

ph

xapchd 2 M HACD

a A, c C, d D

Un curso puede recibir una nica asignatura en cualquier hora de cualquier da:
P

ap

xapchd 1

c C, h H, d D

Un profesor solo puede dictar una asignatura a un curso en cualquier hora de


cualquier dia:
P

ac

xapchd 1

p P, h H, d D

Cada curso debe recibir sus respectivas horas de cada asignatura en una semana:
P

phd

xapchd 2 APap HACac

a A, c C

11

7.

Discusin de resultados

En las tablas 8, 9, 10, 11, 12 y 13 se muestran los resultados de asignacin de carga


acadmica para cada curso. Se puede observar que se intenta hacer la mejor asignacin
dentro de las posibilidades que permiten las restricciones.
Cuadro 8: Asignacin de carga acadmica para el curso 6



Fuente: Elaboracin propia

12

Cuadro 9: Asignacin de carga acadmica para el curso 7





Fuente: Elaboracin propia

13

Cuadro 10: Asignacin de carga acadmica para el curso 8





Fuente: Elaboracin propia

14

Cuadro 11: Asignacin de carga acadmica para el curso 9





Fuente: Elaboracin propia

15

Cuadro 12: Asignacin de carga acadmica para el curso 10





Fuente: Elaboracin propia

16

Cuadro 13: Asignacin de carga acadmica para el curso 11





Fuente: Elaboracin propia

Este pequeo ejemplo de caso de estudio consta de 11880 variables y 713 restricciones,
y necesit un tiempo de cmputo de 110 segundos. El modelo se resolvi en un PC HP
Pavilion con Memoria RAM de 2 GB, Procesador Intel Core 2 a 1.73 GHz, Sistema
Operativo Linux Mint Debian Edition (LMDE). Como se mencion desde el comienzo,
se us el lenguaje MathProg para modelar el problema y el programa GLPK para la
resolucin.
La asombrosa cantidad de variables y restricciones para un problema relativamente pequeo, demuestra que la utilizacin de un modelo matemtico junto con un buen software
puede resultar de gran ayuda para resolver los problemas de asignacin de cargas acadmicas en las instituciones educativas, ya que estos problemas aparentemente sencillos
ocultan una inmensa complejidad.

17

8.

Conclusiones
Herramientas de Software Libre como GLPK y MahtProg puede resultar de gran
ayuda para resolver problemas de programacin lineal de gran escala (miles de
variables y miles de restricciones) sin tener que pagar costosas licencias por software
comercial con prestaciones similares. Adems, estas herramientas de software libre
permiten modificar el cdigo fuente y adaptarlo a las necesidades de cualquier
usuario.
La asignacin de cargas acadmicas para las instituciones educativas es un problema aparentemente sencillo que oculta una asombrosa complejidad. Un pequeo
ejemplo de escuela secundaria con pocas asignaturas puede involucrar decenas de
miles de variables y cientos de restricciones.

18

Referencias
[Markhorin, 2010a] Makhorin, Andrew. GNU Linear Programming Kit - Reference Manual. Department for Applied Informatics, Moscow Aviation Institute, Moscow, Russia. 2010.
[Markhorin, 2010b] Makhorin, Andrew. Modeling Language GNU MathProg - Language
Reference for GLPK Version 4.45. Department for Applied Informatics, Moscow Aviation Institute, Moscow, Russia. 2010.

19

A.

Codificacin del modelo de asignacin


/*CONJUNTOS*/
set C;
/* Cursos */
set P;
/* Profesores */
set A;
/* Asignaturas */
set H;
/* Horas */
set D;
/* Dias */
/*PARAMETROS*/
param HAC{a in A, c in C};
/* # Horas semanales de cada asignatura para cada curso */
param AP{a in A, p in P};
/* Asignaturas que dicta cada profesor */
param MAD;
/* Maximo numero de asignaturas que dicta un profesor en un dia */
param MHACD;
/* Maximo numero de horas de una asignatura q recibe un curso. en un dia */
param PM{a in A, h in H};
/* Puntaje para incentivar la asignacion de las clases de matematicas y
fisica por la manhana */
param PT{a in A, h in H};
/* Puntaje para incentivar la asignacion de las clases de filosofa, geografa
e historia para la tarde */
/*VARIABLES*/
var x{a in A, p in P, c in C, h in H, d in D} binary;
/* 1 si la asignatura a es dictada por el profesor p al curso c en la hora h el
dia d; 0 en otro caso */
/*FUNCION OBJETIVO*/
maximize z:sum{a in A, p in P, c in C, h in H, d in D} x[a, p, c, h, d] *
(PM[a, h] + PT[a, h]) + sum{a in A, c in C, h in H, d in D} (x[a, Fis1,
c, h, d] - x[a, Fis2, c, h, d]) + sum{a in A, c in C, h in H, d in D}

20

(-x[a, Fis1, c, h, d] + x[a, Fis2, c, h, d]) + sum{a in A, c in C, h in H,


d in D} (x[a, Info1, c, h, d] - x[a, Info2, c, h, d]) + sum{a in A, c in C,
h in H, d in D} (-x[a, Info1, c, h, d] + x[a, Info2, c, h, d]) + sum{a in A,
c in C, h in H, d in D} (x[a, Ing1, c, h, d] - x[a, Ing2, c, h, d]) +
sum{a in A, c in C, h in H, d in D} (-x[a, Ing1, c, h, d] + x[a, Ing2, c, h, d])
+ sum{a in A, c in C, h in H, d in D} (x[a, Mate1, c, h, d] - x[a, Mate2, c, h, d]) +
sum{a in A, c in C, h in H, d in D} (-x[a, Mate1, c, h, d] + x[a, Mate2, c, h, d]);
/*RESTRICCIONES*/
subject to
mhd{p in P, d in D}: sum {a in A, c in C, h in H} x[a, p, c, h, d] * 2 <= MAD;
/* Un profesor dicta un maximo de seis horas diarias */
macd{a in A, c in C, d in D}: sum {p in P, h in H} x[a, p, c, h, d] * 2 <= MHACD;
/* Se dictan maximo dos horas de una asignatura a un curso en un dia */
cuahd{c in C, h in H, d in D}: sum{a in A, p in P} x[a, p, c, h, d] <= 1;
/* Un curso puede recibir una unica asignatura en cualquier hora d cualq. dia*/
puachd{p in P, h in H, d in D}: sum{a in A, c in C} x[a, p, c, h, d] <=1;
/* Un profesor solo puede dictar una asignatura a un curso en cualquier hr d cualquier dia */
ac{a in A, c in C}: sum{p in P, h in H, d in D} x[a, p, c, h, d] * 2 * AP[a, p] >= HAC[a,c];
/* Cada curso debe recibir sus respectivas horas de cada asignatura en una semana */
solve;
/* Las siguientes expresiones sirven para guardar el resultado en un formato bonito */
printf

"Asignatura, Profesor, Curso, Hora, Dia" > "Resultado_asignacion.csv";

printf{a in A, p in P, c in C, h in H, d in D}: if x[a, p, c, h, d] > 0 then


"\n %s, %s, %s, %s, %s" else "", a, p, c, h, d >> "Resultado_asignacion.csv";
printf "\n\n";
/* terminar */
end;

21

B.

Codificacin de los datos del modelo


/*CONJUNTOS*/
set C:= 6 7 8 9 10 11;
/* Cursos */
set P:= Bio Soci Fis1 Fis2 Info1 Info2 Ing1 Ing2 Mate1 Mate2 Quim;
/* Profesores */
set A:= Biologia Filosofia Fisica Geografia Historia Informatica Ingles Matematicas Quimica;
/* Asignaturas */
set H:= 8 10 13 15;
/* Horas */
set D:= Lunes Martes Miercoles Jueves Viernes;
/* Dias */
/*PARAMETROS*/
param HAC default 0
/* # Horas semanales de cada asignatura para cada curso */
:
6
7
8
9
10
11
:=
Biologia
4
4
4
4
2
2
Filosofia
.
.
.
2
4
4
Fisica
6
6
6
6
6
6
Geografia
2
2
2
2
2
.
Historia
2
2
2
2
.
.
Informatica
6
6
6
6
8
8
Ingles
6
6
6
6
6
8
Matematicas
10
10
10
10
10
10
Quimica
4
4
4
2
2
2;
param AP default 0
/* Asignaturas que dicta cada profesor */
:
Bio
Soci Fis1 Fis2 Info1
Biologia
1
.
.
.
.
Filosofia
.
1
.
.
.
Fisica
.
.
1
1
.
Geografia
.
1
.
.
.
Historia
.
1
.
.
.
Informatica
.
.
.
.
1

22

Info2
.
.
.
.
.
1

Ing1
.
.
.
.
.
.

Ing2
.
.
.
.
.
.

Mate1
.
.
.
.
.
.

Mate2
.
.
.
.
.
.

Quim
.
.
.
.
.
.

:=

Ingles
Matematicas
Quimica

.
.
.

.
.
.

.
.
.

.
.
.

.
.
.

.
.
.

1
.
.

1
.
.

.
1
.

.
1
.

.
.
1;

param MAD := 6;
/* Maximo numero de asignaturas que dicta un profesor en un dia */
param MHACD := 2;
/* Maximo numero de horas de una asignatura q recibe un curso en un dia */
param PM default 0
/* Puntaje para incentivar la asignacion de las clases de matematicas y fisica por la manhana
:
Biologia
Filosofia
Fisica
Geografia
Historia
Informatica
Ingles
Matematicas
Quimica

8
.
.
2
.
.
.
.
2
.

10
.
.
1
.
.
.
.
1
.

13
.
.
.
.
.
.
.
.
.

15
.
.
.
.
.
.
.
.
.;

:=

param PT default 0
/* Puntaje para incentivar la asignacion de las clases de filosofa, geografa e historia para
:
Biologia
Filosofia
Fisica
Geografia
Historia
Informatica
Ingles
Matematicas
Quimica

8
.
.
.
.
.
.
.
.
.

10
.
.
.
.
.
.
.
.
.

13
.
1
.
1
1
.
.
.
.

15
.
2
.
2
2
.
.
.
.;

:=

end;

23

C.

Instrucciones bsicas para el uso del software

Para los que no estn acostumbrados, trabajar con terminales de texto puede resultar
confuso al principio. Sin embargo, es una costumbre muy extendida entre los usuarios de
sistemas operativos Linux y BSD. Bsicamente se trata una interfaz en la que el usuario,
en vez de hacer click sobre iconos, le enva instrucciones al sistema operativo a travs
de rdenes escritas.
Figura 1: Sesin de Terminales en Linux resolviendo el problema de asignacin de cargas
acadmicas



Fuente: Elaboracin propia

La instruccin con la que se resolvi el problema especfico en la terminal es la siguiente:


glpsol math -m Profesores.mod -d Profesores.dat
Donde:
glpsol: Invoca al solucionador del programa GLPK
-m Profesores.mod: Le indica al solucionador que el modelo se encuentra en un fichero
llamado Profesores.mod

24

-d Profesores.dat: Le indica al solucionador que los datos del modelo se encuentran en


un fichero llamado Profesores.dat

Y listo. Una vez ejecutada esta orden en la terminal, el programa se encarga de resolver
todo.

25

También podría gustarte