Вы находитесь на странице: 1из 28

Modelo lineal multifactorial/multicriterio de

aproximacin para la resolucin de problemas de


optimizacin complejos
Versin 0.0

Camilo Bernal
15 de enero de 2016

ndice
1. Introduccin

2. Presentacin del modelo


2.1. Pre-procesamiento de la informacin de entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2. Construccin del modelo lineal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2
2
3

3. Ejemplo bsico de aplicacin


3.1. Modelo lineal convencional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2. Modelo planteado con la metodologa propuesta . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

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.

Presentacin del modelo

2.1.

Pre-procesamiento de la informacin de entrada

2.1.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.1.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)

2.2.

Construccin del modelo lineal

El modelo matemtico de programacin lineal se puede definir de la forma:


M inimizar/M aximizar Z =

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.

Ejemplo bsico de aplicacin

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

Cuadro 2: Requerimientos nutricionales - gramos/porcin (Ficticio)



Nutriente
Vitamina A
Vitamina B
Vitamina C
Calcio
Fsforo
Protena

Fuente: Elaboracin propia

Cantidad
34
1
52
23
10
60

Cuadro 3: Costo de alimentos - $/Libra (Ficticio)



Alimento Costo ($)
Frijol
3200
Arroz
1600
Pollo
5000
Cerdo
4500
Naranja
2200
Espinaca
800
Coliflor
1500
Maz
2350
Trigo
2300
Avena
1600
Lenteja
3100
Spaghetti
2800

Fuente: Elaboracin propia

Cuadro 4: Presupuesto y Demanda (Ficticios)



Presupuesto ($)
40.000
Demanda (Porciones)
680

Fuente: Elaboracin propia

El problema consiste en preparar el nmero suficiente de porciones que cumplan con los requerimientos nutricionales
sin exceder el presupuesto disponible.

3.1.

Modelo lineal convencional

3.1.1.

Elementos del modelo

X: Conjunto de los alimentos a adquirir (libras)


NI, K : Conjunto de nutrientes aportados por los alimentos (gramos)
RN : Conjunto de requerimientos nutricionales por porcin (gramos)
CA: Conjunto de costos de los alimentos ($)
P : Presupuesto disponible para la adquisicin de alimentos ($)
D: Demanda de alimentos (Porciones)
M AXA: Cantidad mxima de cada alimento (Libras)
M IN C: Cantidad mnima de carne (Libras)
M IN O: Cantidad mnima de los otros alimentos (Libras)
I: Conjunto de ndices que identifican los alimentos
K: Conjunto de ndices que identifican los nutrientes

3.1.2.

Construccin del modelo

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

(Cantidad mnima de carne)

xi M IN O, i | i
/ {P ollo, Cerdo} , x X

(Cantidad mnima de otros alimentos)

X Z+

3.2.

(La cantidad de alimento es un entero positivo)

Modelo planteado con la metodologa propuesta

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.

Pre-procesamiento de la informacin de entrada

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

Cuadro 5: Pre-procesamiento de la informacin de entrada





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.

Construccin del modelo multifactorial

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

(Cantidad mnima de carne)

xi M IN O, i | i
/ {P ollo, Cerdo} , x X

(Cantidad mnima de otros alimentos)

X Z+

(La cantidad de alimento es un entero positivo)



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]

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

A.

Solucin del modelo lineal convencional usando GLPK y MathProg en


la plataforma GNU/Linux
Problem:
Rows:
Columns:
Non-zeros:
Status:
Objective:

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

Integer feasibility conditions:


KKT.PE: max.abs.err = 1.69e-15 on row 7
max.rel.err = 1.20e-17 on row 7

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.

Solucin del modelo lineal con la metodolga propuesta usando GLPK


y MathProg en la plataforma GNU/Linux
Problem:
Rows:
Columns:
Non-zeros:
Status:
Objective:

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

Integer feasibility conditions:


KKT.PE: max.abs.err = 4.08e-15 on row 7
max.rel.err = 3.76e-17 on row 5

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.

Plantilla en LibreOffice Calc para el pre-procesamiento multicriterio


de los factores

En la figura 1 se muestra la plantilla usada.


Figura 1: 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.

16

D.

Macros en LibreOffice Calc para el pre-procesamiento multicriterio de


los factores

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.

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 )

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

Borrar ( columna , fila )


Next
Next
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

19

CP ( Columna , 9). CellBackColor = 16750848


CP ( Columna , 10). CellBackColor = 10066431
Criterio = Criterio + 1
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

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

Porcentaje = CP ( NCriterios +2 , fila +1). Value


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

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

rem agregar etiqueta


NFactor = NFactores + 1
For fila = 11 + NFactores To 10 + NFactores + NFAgregar
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)

24

Devolver un ancho predeterminado a las columnas


For Columna = 1 To 21
ACP ( Columna )
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 "

25

args2 (0). Value = 1


dispatcher . executeDispatch ( document , ". uno : GoRightToEndOfDataSel " , "" , 0 , args2 ())
rem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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

26

Вам также может понравиться