Você está na página 1de 32

UNIVERSIDAD PERUANAS DE CIENCIAS

APLICADAS

INGENIERÍA DE SISTEMAS - EPE

Proyecto IOP

Optimización de la Distribución de Tareas por

Capacidades

Empresa: Colegio San Silvestre

VERÓNICA BALLARTA SANTILLÁN (U902025)

FIORELLA FLORES VALDIVIESO (U913713)

JUAN VICTOR NÚÑEZ VIRRUETA (U91375)

KRYSTHIAM LUCIANO DIAZ AYASTA (U913915)

SERGIO ZAPATA URBINA (U913739)

PROFESOR(A): Ulfe Vega, Luis

Surco, Abril de 2011


Resumen

Nuestro equipo de trabajo busca con el desarrollo de este proyecto aplicar en un


caso real los conceptos fundamentales de la programación lineal, desarrollando
inicialmente un modelamiento del problema, para luego de este análisis,
implementar un sistema que brinde soporte a las decisiones basado en un motor de
optimización.

San Silvestre es una entidad educativa especializada en la formación de mujeres


emprendedoras. Busca formar personas capaces de lograr sus retos en la vida y
alcanzar su mayor potencial a través de su proceso educativo.

2
Índice de Contenidos

Introducción......................................................................................................................................4

1. Análisis y determinación del problema.................................................................................5

2. Perfil comercial del tema del problema.................................................................................6

3. Consideraciones y supuestos de implementación usados................................................7

4. Estructura y especificación del modelo matemático...........................................................7

5. Modelo de implementación LINGO.....................................................................................14

6. Diseño de la base de datos y descripción de formularios................................................16

7 Pruebas...................................................................................................................................22

8 Archivos fuentes.....................................................................................................................24

9 Posibilidades de mejoras e innovaciones del Proyecto....................................................29

Glosario...........................................................................................................................................30

Siglario............................................................................................................................................30

Bibliografía......................................................................................................................................31

3
Introducción

Como colegio de alto nivel académico, San Silvestre (SSS) brinda a cada una
de sus alumnas la oportunidad de lograr sus metas personales dentro de un
entorno alegre, amigable y solidario.

En la mayoría de organizaciones y durante el proceso de aprendizaje la


tecnología se ha convertido en un elemento importante e infaltable. Es por esta
razón que nacen los equipos de soporte tecnológico, los cuáles buscan brindar
a los diferentes usuarios las mayores facilidades para la utilización de la
tecnología en su día a día.

En este proyecto se va a analizar y modelar dicha .casuística, para lograr la


mejor distribución de los recursos que forman parte de los equipos de soporte
tecnológico de SSS.

4
1. Análisis y determinación del problema

En un centro escolar se cuenta con un área de Soporte Técnico, conformada por


3 personas, que se encargan de atender los requerimientos de los usuarios que
forman parte de las diferentes áreas del colegio. Este equipo de trabajo tiene la
labor de resolver las incidencias que se vayan registrando durante el día. Las
áreas a las que se les debe brindar atención en el colegio son: Administración y
Finanzas, Admisiones, Imagen Institucional, Dirección académica, Staff de
profesores y alumnado en general.

Al observar el proceso de atención de incidencias, se ha podido identificar que


no siempre el recurso más calificado atiende determinado tipo de incidencia. Por
esta razón, algunas incidencias no pueden ser atendidas dentro del margen de
tiempo que deberían (tiempo límite de atención), ocasionando disgustos y
problemas en el área de tecnología.

Se identificó que para lograr cumplir con la resolución de todas las incidencias
en el tiempo mínimo se debe asignar los recursos en base a sus capacidades
(velocidad para resolución de una determinada incidencia).

Por esta razón se ha hecho un trabajo de análisis para identificar los tipos de
incidencia que llegan normalmente al área de soporte, y en base a dichos tipos,
se ha evaluado la velocidad que tiene cada recurso para su resolución.

Los tipos de incidencia identificados son:

CÓDIGO TIPO DE INCIDENCIA INDICE


TINC001 Instalaciones 1
TINC002 Diseños 2
TINC003 Problemas de software 3
TINC004 Problemas de hardware 4
TINC005 Problemas de red 5
TINC006 Problemas de accesos 6
Cuadro de Tipos de Incidencias

5
Además, se han obtenido también las capacidades que cada uno de los
recursos tiene por tipo de incidencia:

CÓDIGO RECURSO TIPO DE INCIDENCIA VELOCIDAD (H)


1 Moisés Becerra Instalaciones 1
2 Moisés Becerra Diseños 1
3 Moisés Becerra Problemas de software 2
4 Moisés Becerra Problemas de hardware 2
5 Moisés Becerra Problemas de red 3
6 Moisés Becerra Problemas de accesos 3
7 Lizardo Butrón Instalaciones 2
8 Lizardo Butrón Diseños 2
9 Lizardo Butrón Problemas de software 3
10 Lizardo Butrón Problemas de hardware 3
11 Lizardo Butrón Problemas de red 1
12 Lizardo Butrón Problemas de accesos 1
13 Iván Moyano Instalaciones 2
14 Iván Moyano Diseños 2
15 Iván Moyano Problemas de software 1
16 Iván Moyano Problemas de hardware 1
17 Iván Moyano Problemas de red 3
18 Iván Moyano Problemas de accesos 3
Cuadro de Capacidades

2. Perfil comercial del tema del problema

Un objetivo que comparten la mayoría de organizaciones en estos días, es el de


buscar minimizar el tiempo de cumplimiento de las responsabilidades que
asumen cada uno de los recursos disponibles. Ante esto, es común también,
que las distribuciones de tareas no siempre sean las óptimas, por lo que no se
aprovecha al 100% la capacidad real de cada uno de los recursos con los que
cuentan.

En esta ocasión, se está aterrizando dicha realidad dentro del área de soporte
de un colegio, buscando la óptima distribución de tareas (incidencias) entre los
recursos de soporte.

También, podría utilizarse esta casuística para la distribución de tareas dentro


de un grupo de desarrollo, como soporte de las nuevas tendencias ágiles de
desarrollo, como Scrum.

6
3. Consideraciones y supuestos de implementación usados

Dentro de la implementación del modelo de distribución de tareas se está


considerando que cada uno de los recursos presenta una capacidad
diferenciada para cada uno de los tipos de incidencia registrados. Con esto, se
evita contar con recursos que tengan, para un tipo de incidencia, la misma
capacidad (velocidad para la resolución de la tarea en horas).

Además, por el giro del negocio actual, se está considerando que los tipos de
incidencia no van a variar en el tiempo.

También, se debe considerar que el modelo creado está diseñado para ser
ejecutado de manera diaria, ya que realiza la distribución de tareas para 8 horas
(un día normal de trabajo).

4. Estructura y especificación del modelo matemático

Para realizar el proyecto solicitado por el colegio SSS se utilizo los


conocimientos adquiridos en el curso de IOP usando como herramienta principal
al modelador de problemas lineales LINGO. A continuación se detalla cada parte
del modelo matemático desarrollado para la implementación del proyecto.

4.1 Variables Primitivas

Para la implementación del proyecto fue necesario el uso de 4 variables


primitivas. A continuación se detalla cada una de estas:

RECURSO

Esta variable se utilizo para almacenar la información de los recursos que


trabajan en el área de sistemas. Estos datos se extraen de base de datos,
específicamente de la tabla TB_RECURSO.

7
TIPO_INCIDENCIA

Esta variable se utilizo para almacenar la información de los tipos de


incidencia a los que pertenecen las incidencias. Estos datos se extraen de
base de datos, específicamente de la tabla TB_TIPO_INCIDENCIA.

HORA

Esta variable se utilizo para almacenar las horas sobre las que se
distribuirán las tareas. Estos datos se extraen de base de datos,
específicamente de la tabla TB_HORA. Adicionalmente a esta variable se
ha declarado 1 atributo “VALOR_HORA” el que corresponde al valor
numérico de la hora que se está evaluando.

INCIDENCIA

Esta variable se utilizo para almacenar la información de las incidencias


registradas en la base de datos. Estos datos se extraen de base de datos,
específicamente de la tabla TB_INCIDENCIA. Adicionalmente a esta
variable se ha declarado 2 atributos. El primero “LIMITE”, almacena el
tiempo máximo en que puede estar abierta dicha incidencia. El segundo
“INDICE”, almacena el índice en el que se buscara la capacidad de un
recurso para un tipo de incidencia.

8
4.2 Variables Derivadas

Para la implementación del proyecto fue necesario el uso de 3 variables


derivadas. A continuación se detalla cada una de estas:

CAPACIDAD

Esta variable se utilizo para almacenar la velocidad que tiene cada recurso
para resolver un determinado tipo de incidencia. Estos datos se extraen de
base de datos, específicamente de la tabla TB_CAPACIDAD.
Adicionalmente a esta variable se ha declarado 1 atributo “VELOCIDAD” el
que corresponde al valor numérico de la velocidad para resolver una
incidencia de cada recurso por tipo de incidencia.

TAREA

Esta variable se utilizo para almacenar la incidencia que se asigna a un


único recurso. Para realizar esto se ha declarado una variable binaria “H”
que se prendera cuando una incidencia sea asignada a un recurso.

GANTT

Esta variable se utilizo para almacenar la asignación de las tareas por cada
recurso para resolver una determinada incidencia. Estos datos se calculan
con el modelo matemático. Estos datos se almacenan en base de datos,
específicamente de la tabla TB_GANTT. Para realizar esto se ha declarado
una variable binaria “B” que se prendera cuando una incidencia sea
asignada a un recurso en una determinada hora.

4.3 Restricciones

9
Para la implementación del proyecto fue necesario el uso de 4 restricciones.
A continuación se detalla cada una de estas:

4.3.1 Mayor Velocidad

Esta restricción busca que el modelo asigne el recurso más veloz a


una determinada incidencia. Para ello se uso la variable binaria “B” y
se sumo las horas que debería tomar una incidencia como máximo
igualando a la velocidad de cada incidencia por un determinado
recurso.

4.3.2 Una Incidencia se hace por 1 solo recurso

Esta restricción busca que el modelo asigne una incidencia a un


único recurso. Para ello se uso la variable binaria “H” y se sumo los
binarios de cada recurso por incidencia de tal manera que esta sea
igual a 1.

10
4.3.3 Una Incidencia se hace por 1 solo recurso

Esta restricción busca que el modelo asigne a un recurso en una


determinada hora solo una única incidencia. Para ello se uso la
variable binaria “B” y se sumo los binarios de cada recurso en una
misma hora de tal manera que sumen 1.

4.3.4 Un recurso no puede tener horas vacías

Esta restricción busca que el modelo asigne a un recurso incidencias


seguidas, evitando que en su planing existan horas vacías. Para ello

11
se uso la variable binaria “B” y se obligo a que la suma de los
binarios de una hora x sea mayor o igual que una hora x+1.

4.4 Variables Binarias

Para la implementación del proyecto fue necesario el uso de 2 variables


binarias. La primera definía las horas en las que se hacia una incidencia por
recurso y la segunda la incidencia que era asignada a un recurso:

12
4.5 Definición de la función objetivo

Es un requerimiento del colegio aminorar el tiempo de resolución de


incidencias. Por ello la función objetivo es minimizar los bits que se prenden
por incidencia, hora y recurso.

13
4.6 Lectura de Variables y envió de respuesta

En esta sección se lee el valor de la “VELOCIDAD” de cada recurso para


resolver una determinada incidencia. Luego se debe leer el “LIMITE” que
tiene cada incidencia para su resolución. Seguidamente se debe leer el
“INDICE” donde se buscara la velocidad de cada recurso. Adicionalmente
se debe leer el “VALOR_HORA” que indica el valor numérico que
representa cada hora. Finalmente se envía la solución optima a la base de
datos.

5. Modelo de implementación LINGO

El modelo lingo que se implemento es el siguiente:

14
15
16
6. Diseño de la base de datos y descripción de formularios

6.1 Diseño de la base de datos

A continuación, el diagrama de base de datos del proyecto

17
Descripción de tablas:

TB_RECURSO: Tabla que almacena la información del recurso

CAMPO DESCRIPCION

ID_RECURSO Código identificador del recurso

NOMBRES Nombre del recurso

APELLIDOS Apellidos del recurso

DIRECCION Dirección del recurso

TELEFONO Teléfono del recurso

TB_CAPACIDAD: Tabla que almacena la información de la capacidad por


recurso

CAMPO DESCRIPCION

ID_CAPACIDAD Código identificador de la capacidad

ID_RECURSO Código identifica el recurso

ID_TIPO_INCIDENCIA Código que identifica la incidencia

VELOCIDAD Velocidad con la que realiza la


incidencia un recurso especifico en
horas

18
TB_TIPO_INCIDENCIA: Tabla que almacena la información del tipo de
incidencia

CAMPO DESCRIPCION

ID_TIPO_INCIDENCIA Código identificador del tipo de la


incidencia

DESCRIPCION Descripción del tipo de incidencia

INDICE Valor numérico que almacena el índice


de una variable del lingo en el que se
busca la velocidad de un recurso para
resolver una determinada incidencia

TB_INCIDENCIA: Tabla que almacena las incidencias registradas por el sistema

CAMPO DESCRIPCION

ID_INCIDENCIA Código identificador de la incidencia

ID_TIPO_INCIDENCIA Código identificador del tipo incidencia

INDICE Valor numérico que almacena el índice


de una variable del lingo en el que se
busca la velocidad de un recurso para
resolver una determinada incidencia

DESCRIPCION Descripción de la incidencia

TIEMPO_MAXIMO Tiempo límite (en horas) que se debe


resolver la incidencia

19
TB_HORA: Tabla que almacena las horas de trabajo durante el día

CAMPO DESCRIPCION

ID_HORA Código identificador de la hora

VALOR_HORA Número de hora

TB_GANTT: Tabla que almacena la asignación de tareas por incidencia y


registro

CAMPO DESCRIPCION

ID_GANTT Código identificador de la asignación


de tarea

ID_RECURSO Código identificador del recurso


asignada a la incidencia

ID_HORA Código identificador de la hora


asignada

ID_INCIDENCIA Código de la incidencia asignada

B Binario que se calculará y se obtendrá


por el modelo matemático y definirá si
una incidencia se hace por un recurso
en una determinada hora.

20
6.2 Descripción de formularios

6.2.1 FrmMDIContenedor

Formulario que contiene el menú principal del sistema. En ella se tiene


acceso a los módulos principales: Mantenimiento y Transacciones.

21
6.2.2 Registro de Incidencias

Formulario en la que se registra una incidencia asignándole un tipo de


incidencia, y un tiempo límite en la que debe ser atendida.

6.2.3 Asignación de tareas

Formulario donde se muestra la asignación más óptima de tareas por


incidencia y recurso.

22
7. Pruebas

Para la revisión de modelamiento creado, se han considerado algunas pruebas


que permitan corroborar el correcto funcionamiento del mismo.

En una primera prueba, se ingresaron 6 incidencias (una por cada tipo de


incidencia registrado – ver Cuadro de Tipos de Incidencias) que debían ser
distribuidas entre 3 recursos, cada uno con diferentes capacidades (ver Cuadro
de Capacidades).

23
Con los registros mostrados, se obtuvo el siguiente cuadro de distribución:

Se puede ver que se cumple con la distribución óptima de recursos, tomando


como base los siguientes puntos:
24
- El recurso Becerra tiene una velocidad de una hora para la resolución de
incidencias del tipo Instalaciones y Diseños.

- El recurso Butrón tiene una velocidad de una hora para la resolución de


incidencias del tipo Problemas de red y Problemas de acceso.

- El recurso Moyano tiene una velocidad de una hora para la resolución de


incidencias del tipo Problemas de software y Problemas de hardware.

8. Archivos fuentes

Código fuente del formulario de Asignación de Tareas por Recurso:

private List<Gant> loadData()


{
// 1. Instantiate the connection
SqlConnection conn = new SqlConnection(Utils.getConnection());

SqlDataReader rdr = null;

try
{
// 2. Open the connection
conn.Open();

// 3. Pass the connection to a command object


SqlCommand cmd = new SqlCommand("SELECT TB_G.ID_GANTT, TB_R.APELLIDOS,
TB_G.ID_HORA, TB_I.DESCRIPCION, TB_G.B"
+ " FROM TB_GANTT TB_G"
+ " JOIN TB_RECURSO TB_R ON TB_R.ID_RECURSO = TB_G.ID_RECURSO "
+ " JOIN TB_INCIDENCIA TB_I ON TB_I.ID_INCIDENCIA = TB_G.ID_INCIDENCIA ", conn);

// 4. Use the connection

// get query results


rdr = cmd.ExecuteReader();

// print the CustomerID of each record

Gant objGant;
List<Gant> lstGant = new List<Gant>();

while (rdr.Read())
{
objGant = new Gant();
objGant.RECURSO = rdr[1].ToString();
objGant.HORA = rdr[2].ToString();
objGant.INCIDENCIA = rdr[3].ToString();
objGant.ASIGNADA = (rdr[4] == DBNull.Value) ? false : Convert.ToBoolean(rdr[4]);
lstGant.Add(objGant);
}
return lstGant;
25
}
finally
{
// 5. Close the reader
if (rdr != null)
{
rdr.Close();
}

// 6. Close the connection


if (conn != null)
{
conn.Close();
}

private void loadGridView(List<Gant> lstGant)


{
List<Gant> lstIncidenciasAsignadas = new List<Gant>(lstGant);
DataTable dtIncidenciasAsignadas = ((DataTable)dataGridView1.DataSource);
DataRow dataRow = null;
Int32 index = 0;
int indexRow = 0;
int indexRowRecurso = 0;
int indexColumm;
string strHoraTemp = string.Empty;
string strRecurso = string.Empty;

while (index < lstIncidenciasAsignadas.Count - 1)


{

if (!lstIncidenciasAsignadas[index].RECURSO.Equals(strRecurso))
{
dataRow = dtIncidenciasAsignadas.NewRow();
dataRow[0] = lstIncidenciasAsignadas[index].RECURSO;
strRecurso = lstIncidenciasAsignadas[index + 1].RECURSO;
indexRow++;
}

List<Gant> lstGantTemp;
for (indexColumm = 1; indexColumm < dtIncidenciasAsignadas.Columns.Count;
indexColumm++)
{
lstGantTemp = lstIncidenciasAsignadas.FindAll(delegate(Gant objGantTemp) { return
(objGantTemp.RECURSO.Equals(dataRow[0].ToString()) && objGantTemp.HORA.Equals("H"
+ indexColumm)); });

foreach(Gant objGantTempHora in lstGantTemp)


{
if (objGantTempHora.ASIGNADA)
{
dataRow[indexColumm] = objGantTempHora.INCIDENCIA;
break;
26
}
else
{
dataRow[indexColumm] = "-";
}
}
}

List<Gant> lstGantTempRec = lstIncidenciasAsignadas.FindAll(delegate(Gant objGantTemp)


{ return (objGantTemp.RECURSO.Equals(dataRow[0].ToString())); });
index = index + lstGantTempRec.Count + 1;

dtIncidenciasAsignadas.Rows.Add(dataRow);
}
dataGridView1.DataSource = dtIncidenciasAsignadas;
this.dataGridView1.AllowUserToAddRows = false;
}

private void loadCabeceras(List<Gant> lstGant)


{
List<Gant> lstHoras = new List<Gant>(lstGant);
DataTable dtCabecera = new DataTable();
Int32 index = 0;
string strHoraTemp = string.Empty;

dtCabecera.Columns.Add("RECURSOS");

while (index < lstHoras.Count - 1)


{
if (lstHoras[index].RECURSO.Equals(lstHoras[index + 1].RECURSO))
{
if (!(lstHoras[index].HORA.Equals(strHoraTemp)))
{
dtCabecera.Columns.Add(lstHoras[index].HORA);
strHoraTemp = lstHoras[index + 1].HORA;
}
}
else
{
break;
}
index++;
}
dataGridView1.DataSource = dtCabecera;
}
private void btnGenerarGant_Click(object sender, EventArgs e)
{
try
{
PreparaGant();
EjecutarLingo();
List<Gant> lstGant = loadData();
loadCabeceras(lstGant);
loadGridView(lstGant);

27
MessageBox.Show("Se distribuyeron las tareas correctamente", "Administrar Incidencias",
MessageBoxButons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show("Lo sentimos, el Lingo no soporta esta cantidad de incidencias, contacte
con su profesor", "Asignar Tareas", MessageBoxButons.OK, MessageBoxIcon.Error);
}
}

private void PreparaGant()


{
Snipped.DALDelete();

List<String> ListaRecurso = new List<String>();


ListaRecurso = Snipped.DAL("SELECT ID_RECURSO FROM TB_RECURSO");

List<String> ListaHora = new List<String>();


ListaHora = Snipped.DAL("SELECT ID_HORA FROM TB_HORA ORDER BY VALOR_HORA");

List<String> ListaIncidencia = new List<String>();


ListaIncidencia = Snipped.DAL("SELECT ID_INCIDENCIA FROM TB_INCIDENCIA");

for (int i = 0; i <= ListaRecurso.Count - 1; i++)


{
for (int j = 0; j <= ListaHora.Count - 1; j++)
{
for (int k = 0; k <= ListaIncidencia.Count - 1; k++)
{
Snipped.DALSave(ListaRecurso[i].ToString(), ListaHora[j].ToString(),
ListaIncidencia[k].ToString());
}
}
}
}

private void EjecutarLingo()


{
try
{
int pLingoEnv;
int nError = -1;

// Get a pointer to a Lingo environment


pLingoEnv = lingo.LScreateEnvLng();
if (pLingoEnv == 0)
{
Console.WriteLine("Unable to create Lingo environment.\n");
goto FinalExit;
}

// Open LINGO's log file


nError = lingo.LSopenLogFileLng(pLingoEnv, "lingo.log");
if (nError != lingo.LSERR_NO_ERROR_LNG) goto ErrorExit;

// Here is the script we want LINGO to run.


string cScript =
28
"set echoin 1 \n take D:\\UPC\\2011-0\\IOP\\proyecto\\ProyectoIOP.lng \n go \n quit \n";

// Run the script


nError = lingo.LSexecuteScriptLng(pLingoEnv, cScript);
if (nError != lingo.LSERR_NO_ERROR_LNG) goto ErrorExit;

// Any problems?
if (nError != 0)
{
// Had a problem
Console.WriteLine("Unable to solve!");
MessageBox.Show("Unable to solve!");
}
else
{
// Everything went OK ... print results
Console.WriteLine("Solved");
// Close the log file
lingo.LScloseLogFileLng(pLingoEnv);
}

goto NormalExit;

ErrorExit:
Console.WriteLine("LINGO Error Code: {0}\n", nError);

NormalExit:
// Free Lingo's envvironment to avoid a memory leak
lingo.LSdeleteEnvLng(pLingoEnv);

FinalExit:
Console.WriteLine("press enter...");
String sTemp = Console.ReadLine();
}
catch (Exception e)
{
throw new Exception();
}
}

29
9. Posibilidades de mejoras e innovaciones del Proyecto

Como posibilidades de mejora e innovaciones se puede mencionar lo siguiente:

 Para buscar la solución óptima del proyecto ha sido necesario declarar


una variable de 3 dimensiones que crece en progresión geométrica cada
vez que se agrega un recurso, hora o incidencia. Se recomienda buscar
nuevas formas de realizar el cálculo de la asignación de tareas como
puede ser el uso de filtros en las restricciones.

 Una mejora importante en el proceso sería la inclusión de prioridades por


incidencia. Esto obligaría a cambiar el modelo pero permitiría que el
modelo contemple una casuística muy común en otros escenarios
reales.

 Respecto a la aplicación sería necesario agregar un formulario que


permita modificar las capacidades de los recursos para resolver
determinadas incidencias.

 Para cerrar el flujo de la aplicación, sería de gran ayuda que se agregue


módulos de administración de las tablas maestras así como un modulo
de reporte e impresión del GANTT

 Actualmente solo se puede trabajar con una cantidad limitada de


incidencias, recursos y horas. Esto se debe a la poca capacidad de
binarios con los que puede trabajar el lingo. Se recomienda migrar a una
versión mayor que la 10.0

 Actualmente el modelo no contempla el hecho de si un recurso está


ocupado o no. Esto se debe a la cantidad limitada de variables binarias
que soporta la versión 10.0 del lingo.

30
Glosario

Capacidad/Velocidad: Tiempo que un recurso utiliza para la resolución de


alguna incidencia (en horas)

Tiempo Límite: Tiempo máximo del cual se puede disponer para cumplir con
la resolución de una incidencia (en horas).

Lingo: Software de optimización y modelamiento lineal.

Siglario

SSS – San Silvestre School

31
Bibliografía
AULA VIRTUAL UPC (2011) (http://moodle.upc.edu.pe/) Sitio web del material de
consulta del curso de Investigación Operacional.

ULFE VEGA, Luis (2011) Consultas para definición del modelo en Lingo.

ORTIZ, Christiam (2011) Entrevista personal con la responsable de la Jefatura del


Área de Sistemas del colegio San Silvestre. 29 de marzo.

32

Você também pode gostar