Академический Документы
Профессиональный Документы
Культура Документы
Camilo Bernal
15 de enero de 2016
ndice
1. Introduccin
2
2
3
4
5
6
A. Solucin del modelo lineal convencional usando GLPK y MathProg en la plataforma GNU/Linux
10
B. Solucin del modelo lineal con la metodolga propuesta usando GLPK y MathProg en la plataforma
GNU/Linux
13
C. Plantilla en LibreOffice Calc para el pre-procesamiento multicriterio de los factores
16
17
1.
Introduccin
Los modelos de optimizacin lineal usualmente consideran un nico factor para encontrar la solucin ideal. Es comn
que se pretenda minimizar costos, maximizar utilidades o reducir tiempos al mnimo, entre otros. Se considera adems
que la informacin es objetiva, determinista y completa.
Estos supuestos contrastan con las condiciones que comnmente nos presenta el mundo real, donde en muchos casos
la toma de decisiones involucra la consideracin de mltiples factores simultneamente, y donde la informacin que
poseemos frecuentemente es una mezcla de objetividad con subjetividades1 , posee un alto componente probabilstico
y casi siempre es imperfecta e incompleta.
A fin de lidiar con problemas ms cercanos al mundo real, en este documento se presenta una propuesta que pretende
aadir un pre-procesamiento a la informacin de entrada con lo cual se intenta cambiar la direccin del gradiente
en el movimiento de bsqueda de un ptimo en el espacio n-dimensional convexo que representa un modelo de
programacin lineal convencional. El cambio en la direccin del gradiente se debe a que ya no slo se considera un
nico factor en la toma de decisiones, sino que ahora se intenta tomar en consideracin mltiples factores de manera
simultnea, tomando en cuenta las apreciaciones subjetivas del experto que construye el modelo.
El pre-procesamiento de la informacin de entrada implica un ranqueo multi-factorial y multi-criterio, donde cada
criterio ha de tener un peso ponderado. Se busca adems que la construccin y comprensin de los modelos lineales
se mantenga tan simple como sea posible, para estimular el uso de esta metodologa. Se considera que este es un
modelo de aproximacin porque la informacin de entrada es imperfecta y la ponderacin de los factores involucra
la subjetividad del experto.
La informacin subjetiva no puede ser despreciada, pues hace parte del acerbo de conocimientos que se acumulan en el subconsciente
y que van siendo perfeccionados sin que nos demos cuenta de ello
2.
2.1.
2.1.1.
C:
F:
P O:
V:
Conjunto de valoraciones (subjetivas u objetivas) dadas a cada factor (F ) segn el criterio (C)
P U:
Conjunto de puntajes obtenidos por cada factor (F ) de acuerdo a los criterios (C) y su respectiva
ponderacin (P O)
I:
J:
2.1.2.
P Uj =
Vji P Oi
i I, j J
(1)
Donde:
P Uj :
0
Vji :
P Oi :
Para normalizar la valoracin de los factores, se divide la valoracin de cada factor segn un criterio entre la suma
de las valoraciones de todos los factores segn ese mismo criterio. Esto se puede expresar as:
Vji
0
Vji = P
I Vji
i I, j J
Donde:
Vji
Vji
(2)
2.2.
P Uj X
sujeto a:
G (x X) = B (B R)
Donde:
Z: Valor que toma la funcin objetivo de la cual se busca obtener el mnimo o mximo valor, segn sea el caso.
P Uj : Puntaje obtenido por el factor j
X: Conjunto de variables que conforman el problema planteado
G: Conjunto de funciones de restriccin que estn dadas en trminos de un subconjunto de X y que deben satisfacer
un valor B
B: Conjunto de valores que debe satisfacer el conjunto de restricciones G
3.
Suponga que se desea adquirir los alimentos para un restaurante escolar. Los alimentos adquiridos tienen unos valores
nutricionales dados y existe un presupuesto limitado para su adquisicin. Se debe preparar un nmero suficiente
de porciones a fin de satisfacer la demanda, no se pueden adquirir ms de 5 libras de cada alimento y es necesario
comprar por lo menos 3 libras de carne y una libra de los otros alimentos. Las tablas 1, 2, 3, 4, muestran la informacin
nutricional, los costos y el presupuesto.
Cuadro 1: Informacin nutricional - gramos/[libra de alimento] (Ficticio)
Alimento Vitamina A Vitamina B Vitamina C Calcio
Frijol
1,1
1
0
2
Arroz
1
0,7
0
1,4
Pollo
1
1
1,8
1
Cerdo
1
1
1
1
Naranja
2,3
2
6
0
Espinaca
2
2,2
5
0
Coliflor
2
2
3
0
Maz
1
0
2,1
0
Trigo
2
1
1
1,1
Avena
2,7
0,3
1,8
1
Lenteja
3
0
1
1
Spaghetti
1
1
1
1
Fsforo Protena
4
4
0
2
3
4
2
4,5
0
3,2
0
2,3
0
0,1
1
2,3
2
2,1
2
1,9
2
6
1
2
Fuente: Elaboracin propia
Cantidad
34
1
52
23
10
60
El problema consiste en preparar el nmero suficiente de porciones que cumplan con los requerimientos nutricionales
sin exceder el presupuesto disponible.
3.1.
3.1.1.
3.1.2.
M inimizar Z =
cai xi
ca CA, x X, i I
Sujeto a:
P
ni, k xi rnk D
cai xi P
xi M AXA
n N, i I, k K, x X, rn RN
ca CA, i I, x X
x X, i I
(Requerimientos nutricionales)
(Presupuesto disponible)
(Libras mximas)
xi M IN C, i | i {P ollo, Cerdo} , x X
xi M IN O, i | i
/ {P ollo, Cerdo} , x X
X Z+
3.2.
La gran ventaja de la metodologa propuesta es que permite considerar mltiples factores simultneamente y cambiar
as el gradiente en el proceso de bsqueda del ptimo. Suponga que los analistas del restaurante escolar encontraron
que el modelo convencional no representa toda la situacin del problema real, pues se hallaron 4 factores adicionales
:
Espacio: El espacio disponible para almacenar los alimentos es muy limitado, as que sera deseable que los
alimentos adquiridos no ocupen demasiado espacio.
Gustos: Los comensales estaban dejando mucha comida en el plato. Se hizo una encuesta y se descubri que
los comensales prefieren ms unos alimentos que otros, y se desea darle importancia a esto.
Duracin: La duracin de los alimentos difiere entre unos y otros. Es deseable que se adquieran alimentos
con mayor duracin (antes de expirar).
Tiempo de coccin: El tiempo de coccin es diferente para los diversos alimentos. Sera deseable adquirir
alimentos que se puedan cocinar en menos tiempo
3.2.1.
Usando la informacin de la sub-seccin 2.1 y con ayuda de una plantilla construida en LibreOffice (Ver Anexos C
y D), se construy la siguiente tabla para obtener un coeficiente global (multifactorial) para cada factor (alimento):
Fuente: Elaboracin propia
De acuerdo a los resultados obtenidos en la tabla 5, la espinaca y el coliflor son dos de los alimentos que deberan
eliminarse, pues no aportan a la nueva funcin objetivo. Esta tabla muestra adems que el gusto de los comensales
es un criterio deseable de mucha importancia para los analistas, y el criterio no deseable ms importante es el costo
de los alimentos. El nmero correspondiente a la columna del puntaje ser el coeficiente global (multi-dimensional)
que se usar en la funcin objetivo (P Ui ).
3.2.2.
M aximizar Y =
P U i xi
x X, i I
Sujeto a:
P
ni, k xi rnk D
cai xi P
xi M AXA
n N, i I, k K, x X, rn RN
ca CA, i I, x X
x X, i I
(Requerimientos nutricionales)
(Presupuesto disponible)
(Libras mximas)
xi M IN C, i | i {P ollo, Cerdo} , x X
xi M IN O, i | i
/ {P ollo, Cerdo} , x X
X Z+
En este nuevo modelo, P Ui representa el puntaje global (multifactorial/multicriterio) para cada factor.
Conclusiones
A diferencia de un modelo lineal convencional, el mtodo propuesto permite tomar decisiones teniendo en
cuenta mltiples factores y mltiples criterios simultneamente, adems de mezclar informacin objetiva y
subjetiva, acercando el proceso de toma de decisiones a situaciones del mundo real.
El modelo propuesto puede permitir el abordaje de problemas de optimizacin muy complejos (por aproximacin) sin aumentar significativamente la complejidad matemtica en la etapa de modelamiento ni la complejidad
computacional en la etapa de resolucin.
Referencias
[Linux, 2014]
A.
Convencional
31
12 (12 integer, 0 binary)
108
INTEGER OPTIMAL
costo_alimento = 56450 (MINimum)
No.
Row name
------ -----------1 costo_alimento
Activity
Lower bound
Upper bound
------------- ------------- ------------56450
2 req_nut[Vitamina_A]
47
34
28
52.1
52
23.2
23
32
10
70.3
56450
60
3 req_nut[Vitamina_B]
4 req_nut[Vitamina_C]
5 req_nut[Calcio]
6 req_nut[Fosforo]
7 req_nut[Protena]
8 pres_disp
9 max_lib[Frijol]
60000
10 max_lib[Arroz]
11 max_lib[Pollo]
12 max_lib[Cerdo]
13 max_lib[Naranja]
14 max_lib[Espinaca]
15 max_lib[Coliflor]
16 max_lib[Maiz]
17 max_lib[Trigo]
18 max_lib[Avena]
10
1
3
5
3
19 max_lib[Lenteja]
20 max_lib[Spaghetti]
21 min_car
22 min_otr[Frijol]
23 min_otr[Arroz]
24 min_otr[Naranja]
25 min_otr[Espinaca]
26 min_otr[Coliflor]
27 min_otr[Maiz]
28 min_otr[Trigo]
29 min_otr[Avena]
30 min_otr[Lenteja]
31 min_otr[Spaghetti]
No.
-----1
2
3
4
5
6
7
8
9
10
11
12
Column name
-----------x[Frijol]
x[Arroz]
x[Pollo]
x[Cerdo]
x[Naranja]
x[Espinaca]
x[Coliflor]
x[Maiz]
x[Trigo]
x[Avena]
x[Lenteja]
x[Spaghetti]
*
*
*
*
*
*
*
*
*
*
*
*
Activity
Lower bound
Upper bound
------------- ------------- ------------2
0
5
0
0
0
3
0
1
0
5
0
1
0
1
0
2
0
5
0
1
0
1
0
11
High quality
KKT.PB: max.abs.err = 0.00e+00 on row 0
max.rel.err = 0.00e+00 on row 0
High quality
End of output
12
B.
Propuesto
31
12 (12 integer, 0 binary)
106
INTEGER OPTIMAL
puntaje_global = 27.14 (MAXimum)
No.
Row name
------ -----------1 puntaje_global
Activity
Lower bound
Upper bound
------------- ------------- ------------27.14
2 req_nut[Vitamina_A]
46.9
34
29
54.9
52
23.1
23
30
10
69.7
59850
60
3 req_nut[Vitamina_B]
4 req_nut[Vitamina_C]
5 req_nut[Calcio]
6 req_nut[Fosforo]
7 req_nut[Protena]
8 pres_disp
9 max_lib[Frijol]
60000
10 max_lib[Arroz]
11 max_lib[Pollo]
12 max_lib[Cerdo]
13 max_lib[Naranja]
14 max_lib[Espinaca]
15 max_lib[Coliflor]
16 max_lib[Maiz]
17 max_lib[Trigo]
18 max_lib[Avena]
13
4
3
5
3
19 max_lib[Lenteja]
20 max_lib[Spaghetti]
21 min_car
22 min_otr[Frijol]
23 min_otr[Arroz]
24 min_otr[Naranja]
25 min_otr[Espinaca]
26 min_otr[Coliflor]
27 min_otr[Maiz]
28 min_otr[Trigo]
29 min_otr[Avena]
30 min_otr[Lenteja]
31 min_otr[Spaghetti]
No.
-----1
2
3
4
5
6
7
8
9
10
11
12
Column name
-----------x[Frijol]
x[Arroz]
x[Pollo]
x[Cerdo]
x[Naranja]
x[Espinaca]
x[Coliflor]
x[Maiz]
x[Trigo]
x[Avena]
x[Lenteja]
x[Spaghetti]
*
*
*
*
*
*
*
*
*
*
*
*
Activity
Lower bound
Upper bound
------------- ------------- ------------1
0
5
0
1
0
2
0
1
0
5
0
1
0
1
0
1
0
5
0
1
0
4
0
14
High quality
KKT.PB: max.abs.err = 0.00e+00 on row 0
max.rel.err = 0.00e+00 on row 0
High quality
End of output
15
C.
Fuente: Elaboracin propia
Si desea cambiar la plantilla puede hacerlo, pero asegrese de usar las mismas celdas para escribir las etiquetas, pues
de otro modo tendra que cambiar las macros para evitar inconsistencias.
16
D.
A continuacin se presentan todas las macros escritas para aplicar el modelo. El lenguaje es Basic, con algunas
peculiaridades mnimas. En esencia es el mismo lenguaje que usa Excel para sus macros.
Sub Main
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub Seleccionar ( columna , fila )
rem seleccionar una celda por posicin
ThisComponent . CurrentController . Select ( CP ( columna , fila ))
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Function NCriterios
NCriterios = CP (1 ,5). Value
End Function
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Function NFactores
NFactores = CP (1 ,4). Value
End Function
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Function CP ( columna as integer , fila as integer ) as object
Obtiene una celda por posicin
Dim Hoja as object
Hoja = ThisComponent . Sheets (0)
CP = Hoja . getCellByPosition ( columna , fila )
17
End Function
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Function CN ( rango as string )
Obtiene una celda por nombre
Dim Hoja as object
Hoja = ThisComponent . Sheets (0)
CN = Hoja . getCellRangeByName ( rango )
End Function
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub Borrar ( columna as integer , fila as integer )
Borra una celda referenciada por posicin
CP ( columna , fila ). String = ""
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub EliminarR ( ci , fi , cf , ff )
Elimina un rango , teniendo las referencias de inicio y fin por posicin
Dim CellRangeAddress As New com . sun . star . table . CellRangeAddress
Hoja = ThisComponent . Sheets (0)
CellRangeAddress . Sheet = 0
CellRangeAddress . StartColumn = ci
CellRangeAddress . StartRow = fi
CellRangeAddress . EndColumn = cf
CellRangeAddress . EndRow = ff
Hoja . removeRange ( CellRangeAddress , com . sun . star . sheet . CellDeleteMode . UP )
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub BorrarR ( ci , fi , cf , ff )
Borrar un rango dado por posicion
For columna = ci To cf
For fila = fi To ff
18
19
20
End If
Next
If PP > 0 Then
CP ( NCriterios + 1 , fila ). Value = PP
Else
CP ( NCriterios + 1 , fila ). Value = 0
End If
Next
Calcular porcentajes
PTot = 0.0
For fila = 11 To 10 + NFactores
PTot = PTot + CP ( NCriterios + 1 , fila ). Value
Next
For fila = 11 To 10 + NFactores
If PTot > 0 Then
CP ( NCriterios +2 , fila ). Value = CP ( NCriterios +1 , fila ). Value / PTot * 100.0
Else
CP ( NCriterios + 2 , fila ). Value = CP ( NCriterios + 1 , fila ). Value * 100.0
End If
Next
Calcular porcentajes acumulados
PAcum = 0.0
For fila = 11 To 10 + NFactores
PACum = PAcum + CP ( NCriterios + 2 , fila ). Value
CP ( NCriterios + 3 , fila ). Value = PAcum
Next
rem poner etiquetas
fila = 10
CP ( NCriterios +1 , fila ). String = " Puntaje "
CP ( NCriterios +2 , fila ). String = " %"
CP ( NCriterios +3 , fila ). String = " % Acumulado "
Cambiar el color de fondo
CP ( NCriterios +1 , fila -1). CellBackColor = 16750848
CP ( NCriterios +2 , fila -1). CellBackColor = 16750848
CP ( NCriterios +3 , fila -1). CellBackColor = 16750848
CP ( NCriterios +1 , fila ). CellBackColor = 10066431
CP ( NCriterios +2 , fila ). CellBackColor = 10066431
CP ( NCriterios +3 , fila ). CellBackColor = 10066431
CP (0 , fila + NFactores + 1). CellBackColor = 10066431
rem Ordenar los datos por puntaje de mayor a menor
Ordenar
rem Calcular % Acumulado
Porcentaje = CP ( NCriterios +2 , 11). Value
CP ( NCriterios +3 , 11). Value = Porcentaje
For fila = 11 To 9 + NFactores
Vlr_anterior = CP ( NCriterios +3 , fila ). Value
21
22
Next
rem Actualizar Nmero de criterios
CP (1 ,5). Value = NCriterios + NCAgregar
Next
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub Quitar_criterios
Permite quitar criterios de anlisis
NCQuitar = int ( InputBox (" Cuntos Criterios Desea quitar ?" , " Quitar criterios " , 1))
If NCQuitar >= NCriterios Then
NCQuitar = NCriterios -1
End If
rem Borrar etiquetas de puntaje y porcentajes
fila = 10
Borrar ( NCriterios +1 , fila )
Borrar ( NCriterios +2 , fila )
Borrar ( NCriterios +3 , fila )
rem Quitar encabezado de criterios eliminados
For Columna = NCriterios To NCriterios - NCQuitar +2 Step -1
CP ( Columna , fila ). String = ""
Next
rem Cambiar nmero de criterios
CP (1 ,5). Value = NCriterios - NCQuitar
rem Quitar relleno de columnas
For Columna = NCriterios +4 To NCriterios - NCQuitar +2 Step -1
For Fila = 9 To 11+ NFactores
Borrar ( Columna , Fila )
Next
Next
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub Agregar_factores
Da la posibilidad de agregar ms elementos para analizar
NFAgregar = int ( InputBox (" Cuntos Factores Desea agregar ?" , " Agregar factores " , 1))
rem limitar el nmero de factores a agregar
If NFAgregar > 5 Then
NFAgregar = 5
End If
23
24
25
26