Escolar Documentos
Profissional Documentos
Cultura Documentos
ndice
1. Introduccin
2
2
3
3. Ejemplo de aplicacin
3.1. Descripcin del problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2. Pre-procesamiento de la informacin de entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3. Solucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
4
5
6
4. Conclusiones
10
11
21
1.
Introduccin
Los problemas de optimizacin de redes de transporte consisten esencialmente en conectar una serie de nodos de un
modo tal que se logre obtener el mejor resultado posible, de acuerdo a unos criterios establecidos previamente por el
experto encargado de modelar el problema. Este tipo de situaciones son muy comunes para las empresas encargadas
de transportar personas y mercancas de un lugar a otro.
Los modelos de optimizacin de redes de transporte 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 subjetividades, 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 facilitar el hallazgo de una ruta que
conecte todos los nodos, tomando en consideracin mltiples factores de manera simultnea, as como tambin 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 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.
El presente documento se centra nicamente en encontrar un trayecto que conecte todos los nodos de una red de
transporte, como paso previo a una segunda fase de optimizacin en la cual se determinar la mejor forma de
satisfacer la demanda desde los puntos donde se produce la oferta.
2.
Se propone un algoritmo que permita la valoracin de los posibles trayectos a travs de un ranqueo multifactorial/multicriterio a fin de unir los nodos usando los mejores trayectos de forma iterativa (figura 1).
Figura 1: Algoritmo propuesto
INICIO
Realizar ranqueo
de trayectos
Incluir en
'Elegibles'
Elegir trayecto con
mayor puntaje
Incluir en
'Descartados'
El trayecto
conecta un
nuevo nodo?
NO
S
Incluir en
'Elegidos'
Quedan
trayectos
'Elegibles'?
NO
S
FIN
Fuente: Elaboracin propia
2.1.
Para codificar el algoritmo se propone el uso del lenguaje de programacin python, debido a que rene una serie de
caractersticas que lo hacen deseable: Es software libre, su sintaxis es muy limpia y clara, el aprendizaje es ms rpido,
es fcil de entender para los inexpertos en computacin, y cuenta con una enorme comunidad y documentacin en
internet que le facilita la vida a quienes lo usan.
Tambin se pueden usar lenguajes de la vieja escuela como C/C++, pero la complejidad y depuracin del cdigo
suele convertirse en una actividad muy penosa en poco tiempo.
2.2.
Procedimiento de ranqueo
2.2.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.2.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)
3.
3.1.
Ejemplo de aplicacin
Descripcin del problema
Suponga que existe un problema consistente en optimizar la red de transporte en camiones que se muestra en la
figura 2.
Figura 2: Red de transporte
E
G
H
Fuente: Elaboracin propia
Existen 8 nodos (A, B, C, D, E, F, G, H) conectados a travs de 13 trayectos (F = AB, AF , BC, BF , BE, BD, F E, F H, DC, DE, EG, E
que tienen una serie de atributos asociados (C = Distancia, T iempo, Capacidad, Riesgo, Reaprovisionamiento)
que han de ser usados como criterios para la toma de decisiones. En la tabla 1 se muestra el valor de los atributos
para los diversos trayectos.
Distancia
Tiempo
Capacidad
Riesgo
Reaprovisionamiento
AB
20
AF
23
51
BC
45
100
23
BF
10
16
12
10
BE
12
22
14
BD
16
19
FE
14
36
16
FH
11
27
20
DC
16
18
DE
20
11
EG
34
89
EH
17
45
GH
34
68
Fuente: Elaboracin propia
3.2.
Usando la informacin de la sub-seccin 2.2 y con ayuda de una plantilla construida en LibreOffice (Ver Anexos A
y B), se construy la siguiente tabla para obtener un coeficiente global (multicriterio) para cada factor (trayecto):
Fuente: Elaboracin propia
De acuerdo a la tabla 2, el trayecto que ms aporta de manera global al logro del objetivo es BF , y los trayectos
AF , EG, y GH no aportan nada y por lo tanto deberan ser evitados en lo posible. Ntese que el factor deseable
ms importante de todos es la capacidad de transporte y el factor no deseable ms importante es el tiempo invertido
en el trayecto.
3.3.
Solucin
Una vez obtenidos los respectivos puntajes para los trayectos, se puede usar un sencillo script en python (Ver anexo
C) para elegir el conjunto de trayectos que permite la unin de los nodos y maximiza el valor objetivo. La solucin
se muestra en las lneas rojas de la figura 3.
E
G
H
Fuente: Elaboracin propia
Como se puede observar, la solucin obtenida NO resuelve automticamente el problema, pero puede constituir un
gran apoyo al momento de tomar una decisin, puesto que ilustra cules son las mejores rutas y cules son las rutas
menos deseables. Despus de hacer las modificaciones pertinentes, se pueden eliminar todos los dems trayectos
como no deseados y la complejidad del problema habr disminuido significativamente.
La informacin obtenida hasta ahora (especialmente el puntaje asociado a cada trayecto), puede servir como base para
construir la segunda fase de solucin, que consistir en usar algn algoritmo (simplex, heurstica metaheurstica)
a fin de satisfacer los puntos de demanda desde los puntos de oferta tomando en cuenta las restricciones del sistema.
4.
Conclusiones
A diferencia de un modelo 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 procedimiento propuesto puede ser de gran ayuda en la primera fase de un problema de optimizacin de
redes de transporte, al elegir un trayecto que une los nodos maximizando el puntaje multicriterio/multifactor.
Bibliografa
[Linux, 2014] Wikipedia: La enciclopedia libre. GNU/Linux. http://es.wikipedia.org/wiki/GNU/Linux?oldid=78087514.
Fecha de acceso: 11 nov 2014.
[S._Libre, 2014] Wikipedia: La enciclopedia libre. Software libre. http://es.wikipedia.org/wiki/Software_libre?oldid=78063707.
Fecha de acceso: mi 12 nov 2014.
Lecturas recomendadas
Hay varios buenos manuales en internet. En lo personal recomiendo que busquen en google los ficheros PDF con los
siguientes ttulos:
1. "Aprenda a Pensar Como un Programador con Python", de Allen Downey
2. "Inmersin en Python 3", de Mark Pilgrim
3. "El tutorial de Python", de Guido van Rossum
4. "Python Reference Manual", de Guido van Rossum
A.
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.
10
B.
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 )
End Function
11
12
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub ACO ( columna as integer )
Anchura de columna ptima
ThisComponent . Sheets (0). Columns ( columna ). OptimalWidth = True
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub ACP ( columna as integer )
Anchura de columna predeterminada
ThisComponent . Sheets (0). Columns ( columna ). Width = 4000
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub Generar_factores
Genera las etiquetas para los factores
Factor = 1
For fila =11 to 10+ NFactores
CP (0 , Fila ). String = " Factor #" + Factor + ":"
CP (0 , Fila ). CellBackColor = 10066431
Factor = Factor + 1
Next
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub Generar_criterios
Genera las etiquetas para los criterios considerados
Criterio = 1
For columna =1 to NCriterios
CP ( Columna , 10). String = " Criterio #" + Criterio
CP ( Columna , 9). CellBackColor = 16750848
CP ( Columna , 10). CellBackColor = 10066431
Criterio = Criterio + 1
13
Next
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub Rellenar
Pone valores predeterminados a la valoracin de cada factor
For fila =11 To 10+ NFactores
For columna =1 To NCriterios
CP ( Columna , Fila ). Value = 1
Next
Next
For columna =1 To NCriterios
CP ( columna ,9). Value = 1
Next
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub Calcular_Puntaje
rem Permite calcular los puntajes
Poner etiquetas de totales
CP (0 , 11 + NFactores ). String = " TOTAL - FACTOR "
Calcular total de factores
For columna = 1 To NCriterios
TotalC = 0.00
For fila = 11 To 10 + NFactores
TotalC = TotalC + CP ( columna , fila ). Value
Next
CP ( columna , 11 + NFactores ). Value = TotalC
Next
Calcular puntajes
For fila = 11 To 10 + NFactores
PP = 0.00
For columna = 1 To NCriterios
Ponderacion = CP ( columna , 9). Value
Denominador = CP ( columna , 11 + NFactores ). Value
If Denominador > 0 Then
PP = PP + CP ( columna , fila ). Value / Denominador * Ponderacion
End If
Next
If PP > 0 Then
14
15
16
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
NFAgregar = int ( InputBox (" Cuntos
rem limitar el nmero de factores
If NFAgregar > 5 Then
NFAgregar = 5
End If
rem agregar etiqueta
NFactor = NFactores + 1
For fila = 11 + NFactores To 10 +
NFactores + NFAgregar
17
18
Next
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub Empezar
Genera el esquema para empezar a introducir valores
Limpiar_Todo
Generar_factores
Generar_criterios
Rellenar
rem Poner encabezados
Poner_encabezados
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* sub Ordenar
Usa el Dispatcher de OpenOffice para ordenar los datos por puntaje
rem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rem define variables
dim document as object
dim dispatcher as object
rem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rem get access to the document
document = ThisComponent . CurrentController . Frame
dispatcher = createUnoService (" com . sun . star . frame . DispatchHelper ")
rem Agregar ms cosas
NFactores = CP (1 ,4). Value
NCriterios = CP (1 ,5). Value
Factor_ordenamiento = NCriterios + 2
rem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - dim args1 (0) as new com . sun . star . beans . PropertyValue
args1 (0). Name = " ToPoint "
args1 (0). Value = " $A$11 "
dispatcher . executeDispatch ( document , ". uno : GoToCell " , "" , 0 , args1 ())
rem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - dim args2 (0) as new com . sun . star . beans . PropertyValue
args2 (0). Name = " By "
args2 (0). Value = 1
dispatcher . executeDispatch ( document , ". uno : GoRightToEndOfDataSel " , "" , 0 , args2 ())
rem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
19
20
C.
class trayecto ( ) :
" " " Objeto que r e p r e s e n t a a un t r a y e c t o que une dos nodos " " "
d e f __init__ ( s e l f , nodo1=None , nodo2=None , p u n t a j e =0):
s e l f . nodo1 = nodo1
s e l f . nodo2 = nodo2
s e l f . puntaje = puntaje
d e f __lt__( s e l f ,
otro ) :
" " " Permite comparar t r a y e c t o s " " "
i f s e l f . p u n t a j e < o t r o . p u n t a j e : r e t u r n 1
i f s e l f . puntaje > otro . puntaje : return 1
return 0
d e f __str__ ( s e l f ) :
" " " Muestra i n f o r m a c i o n d e l t r a y e c t o " " "
msg = " \ nnodo 1 : " + s t r ( s e l f . nodo1 ) + " \ nnodo 2 : " + s t r ( s e l f . nodo2 ) +\
"\ npuntaje : " + s t r ( s e l f . puntaje )
r e t u r n msg
# paso 0 : Ranqueo de t r a y e c t o s
# paso 1 : I n c l u i r en e l e g i b l e s
BF
DC
FH
BC
BD
FE
BE
DE
AB
EH
AF
EG
GH
=
=
=
=
=
=
=
=
=
=
=
=
=
t r a y e c t o ( "B" ,
t r a y e c t o ( "D" ,
trayecto ( "F" ,
t r a y e c t o ( "B" ,
t r a y e c t o ( "B" ,
trayecto ( "F" ,
t r a y e c t o ( "B" ,
t r a y e c t o ( "D" ,
t r a y e c t o ( "A" ,
t r a y e c t o ( " E" ,
t r a y e c t o ( "A" ,
t r a y e c t o ( " E" ,
t r a y e c t o ( "G" ,
e l e g i b l e s = [ BF,
elegibles . sort ()
"F " ,
"C" ,
"H" ,
"C" ,
"D" ,
"E" ,
"E" ,
"E" ,
"B" ,
"H" ,
"F " ,
"G" ,
"H" ,
DC,
FH,
1.51)
1.26)
1.23)
0.92)
0.79)
0.63)
0.55)
0.49)
0.06)
0.04)
0.00)
0.00)
0.00)
BC,
BD,
FE,
BE,
nodos = [ ]
elegidos = [ ]
descartados = [ ]
w h i l e True :
21
DE,
AB,
EH,
AF,
EG,
GH]
22