Está en la página 1de 24

Propuesta de un mtodo multifactorial-multicriterio

como apoyo a la resolucin de problemas de


optimizacin de redes de transporte
Camilo Bernal
16 de febrero de 2016

ndice
1. Introduccin

2. Presentacin del mtodo


2.1. Codificacin del algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2. Procedimiento de ranqueo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

A. Plantilla en LibreOffice Calc para el pre-procesamiento multicriterio de los factores

10

B. Macros en LibreOffice Calc para el pre-procesamiento multicriterio de los factores

11

C. Script en python para la eleccin de los mejores trayectos

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.

Presentacin del mtodo

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.

Codificacin del algoritmo

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.

Elementos del modelo

C:

Conjunto de criterios usados para la toma de decisiones

F:

Conjunto de factores a ser considerados segn los criterios (C)

P O:

Conjunto de ponderaciones para los criterios usados (C)

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:

ndice que identifica los criterios

J:

ndice que identifica los factores

2.2.2.

Construccin del modelo

El puntaje (P U ) para los diversos factores se obtiene usando la siguiente expresin:

P Uj =

Vji P Oi

i I, j J

(1)

Donde:
P Uj :
0

Puntaje obtenido por el factor j

Vji :

Valoracin normalizada del factor j segn el criterio i

P Oi :

Ponderacin dada al criterio i

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

Valoracin normalizada del factor j segn el criterio i


Valoracin del factor j segn el criterio i

(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.

Cuadro 1: Atributos de los trayectos



Trayecto

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

El significado de los atributos es el siguiente:


Distancia: Es el recorrido (en kilmetros) desde el nodo de partida hasta el nodo de llegada
Tiempo: Cantidad de minutos que tarda el recorrido del trayecto, depende de la topografa del terreno, la calidad
del pavimento, el clima, entre otros.
Capacidad: Cantidad de toneladas que puede transportar un camin de acuerdo a la topografa del terreno, la
calidad del pavimento, entre otros.
Riesgo: Percepcin de inseguridad del trayecto (donde 0 indica la ausencia de riesgo y 10 implica un trayecto muy
peligroso) debido a terrorismo, probabilidad de accidente, bandoleros, entre otros.
Reaprovisionamiento: Indica si en el trayecto existe posibilidad de reabastecer a los camiones con combustible (1:S,
0:No.

3.2.

Pre-procesamiento de la informacin de entrada

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):

Cuadro 2: Pre-procesamiento de informacin de entrada





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.

Figura 3: Solucin - Fase 1




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.

Plantilla en LibreOffice Calc para el pre-procesamiento multicriterio


de los factores

En la figura 4 se muestra la plantilla usada.


Figura 4: Plantilla de la herramienta



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.

Macros en LibreOffice Calc para el pre-procesamiento multicriterio de


los factores

REM ***** BASIC *****

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

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
Borrar ( columna , fila )
Next
Next

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

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
Porcentaje = CP ( NCriterios +2 , fila +1). Value
CP ( NCriterios +3 , fila +1). Value = Vlr_anterior + Porcentaje
Next

15

rem Optimizar anchura de columnas


For columna = 1 To NCriterios + 3
ACO ( columna )
Next
Poner_encabezados
Resaltar_puntaje
Seleccionar (1 ,4)
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub Agregar_criterios
Sirve para agregar ms criterios de anlisis
rem Borar etiquetas de Puntaje y Porcentajes
For columna = NCriterios + 1 To NCriterios + 3
Borrar ( columna , 10)
Next
rem Borrar Puntaje y Porcentajes
For fila = 11 To 10 + NFactores
For columna = NCriterios + 1 To NCriterios + 3
Borrar ( columna , fila )
Next
Next
NCAgregar = int ( InputBox (" Ingrese # criterios a agregar " , " Agregar criterios " , 1))
rem limitar el nmero de criterios a agregar
If NCAgregar > 5 Then
NCAgregar = 5
End If
rem Poner etiquetas y ponderacin de nuevos criterios
Nuevo_criterio = NCriterios + 1
For columna = NCriterios + 1 To NCriterios + NCAgregar
CP ( columna ,10). String = " Criterio #" + Nuevo_criterio
CP ( columna ,10). CellBackColor = 10066431
CP ( columna ,9). Value = int (1)
CP ( columna ,9). CellBackColor = 16750848
Nuevo_criterio = Nuevo_criterio + 1
Next
rem Rellenar Nuevo criterio
For columna = NCriterios + 1 To NCriterios + NCAgregar
For fila = 11 To 10 + NFactores
CP ( columna , fila ). Value = 1
Next
rem Actualizar Nmero de criterios
CP (1 ,5). Value = NCriterios + NCAgregar

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 +

elementos para analizar


Factores Desea agregar ?" , " Agregar factores " , 1))
a agregar

NFactores + NFAgregar

17

CP (0 , fila ). String = " Factor #" + NFactor + ":"


CP (0 , fila ). CellBackColor = 10066431
NFactor = NFactor + 1
Next
rem agregar relleno
For fila = 11 + NFactores To 10 + NFactores + NFAgregar
For columna = 1 To NCriterios
CP ( columna , fila ). Value = 1
Next
Next
rem modificar el nmero de factores
CP (1 ,4). Value = NFactores + NFAgregar
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub Quitar_factores
Quita elementos
NFQuitar = int ( InputBox (" Cuntos Factores Desea quitar ?" , " Quitar factores " , 1))
rem Limitar el nmero de factores a quitar
If NFQuitar >= NFactores Then
NFQuitar = NFactores - 1
End If
rem Borrar la fila correspondiente
For fila = 11 + NFactores To 10 + NFactores - NFQuitar + 1 Step -1
For columna = 0 To NCriterios + 3
Borrar ( columna , fila )
Next
Next
rem modificar el nmero de factores
CP (1 ,4). Value = NFactores - NFQuitar
End Sub
rem * -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* Sub Limpiar_Todo
Limpia toda la plantilla
EliminarR (1 ,9 ,101 ,109)
EliminarR (0 ,11 ,0 ,111)
Devolver un ancho predeterminado a las columnas
For Columna = 1 To 21
ACP ( Columna )

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

dim args3 (0) as new com . sun . star . beans . PropertyValue


args3 (0). Name = " By "
args3 (0). Value = 1
dispatcher . executeDispatch ( document , ". uno : GoDownToEndOfDataSel " , "" , 0 , args3 ())
rem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - dim args4 (7) as new com . sun . star . beans . PropertyValue
args4 (0). Name = " ByRows "
args4 (0). Value = true
args4 (1). Name = " HasHeader "
args4 (1). Value = true
args4 (2). Name = " CaseSensitive "
args4 (2). Value = false
args4 (3). Name = " NaturalSort "
args4 (3). Value = false
args4 (4). Name = " IncludeAttribs "
args4 (4). Value = true
args4 (5). Name = " UserDefIndex "
args4 (5). Value = 0
args4 (6). Name = " Col1 "
args4 (6). Value = Factor_ordenamiento
args4 (7). Name = " Ascending1 "
args4 (7). Value = false
dispatcher . executeDispatch ( document , ". uno : DataSort " , "" , 0 , args4 ())
end sub

20

C.

Script en python para la eleccin de los mejores trayectos

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]

# paso 2 : E l e g i r t r a y e c t o con mayor p u n t a j e


c a n d i d a t o = e l e g i b l e s . pop ( )
# paso 3 : El t r a y e c t o c o n e c t a un nuevo nodo ?
# paso 3a : S > I n c l u i r en e l e g i d o s
i f c a n d i d a t o . nodo1 not i n nodos o r c a n d i d a t o . nodo2 not i n nodos :
e l e g i d o s . append ( c a n d i d a t o )
i f c a n d i d a t o . nodo1 not i n nodos :
nodos . append ( c a n d i d a t o . nodo1 )
i f c a n d i d a t o . nodo2 not i n nodos :
nodos . append ( c a n d i d a t o . nodo2 )
# paso 3b : No > I n c l u i r en d e s c a r t a d o s
else :
d e s c a r t a d o s . append ( c a n d i d a t o )
# paso 4 : Quedan t r a y e c t o s e l e g i b l e s ?
# paso 4a : S > Continuar
i f e l e g i b l e s . __len__ ( ) > 0 :
continue
# paso 4b : No > Fin
else :
break
# Mostrar s o l u c i n
for i in elegidos :
print ( i )

22

También podría gustarte