• No results found

6. Conclusions and recommendations

6.2 Recommendations

Public Tamano_Poblacion As Integer'Determina el tamaño de la población que se desea examinar, es decir el número de cromosomas por cada experimento.

Public Probabilidad_Cruce As Double'Parámetro que se establece

Public Probabilidad_Mutacion As Double'Valor de probabilidad para realizar la mutación a cada bit del cromosoma Public Generaciones As Integer'Determina el número de evoluciones que se realizaran

Public Numero_de_Experimentos As Integer'Almacena el número de experimentos que debe ejecutar el programa. Public cuantooficinas As Integer'Determina cuantas oficinas están solicitando contingencias

Public recursos_i() As Long'Almacena las cedulas de los funcionarios que seencuentran disponibles para el cubrimiento Public contingencias_j() As Long'Almacena el código de la oficina y contingencia concatenados

Publicpoblacion() As Long'Matriz de población (asignación de Recursos i a la contingencia j Public cuantorecursos As Integer'Variable que representa el número de recursos disponibles Public Numero_Generaciones As Integer'Determinael número de evoluciones que se realizaran Public TREC_k() As Variant'Cantidad de recursos disponibles de tipo k

Public COST_jk() As Variant'Costo de cubrir la oficina que presentó la contingencia j con un recurso de tipo k Public NOCU_j() As Variant'Matrizde Costo de No cubrir la contingencia j

Public CUTI_k() AsVariant'Matriz relación de Costo de Utilizar un recurso k

Public ponderacion_distancia AsInteger'Variable parametrica para relacionar la distancia del recurso a la oficina Public valor_cromosoma() AsLong'Matriz que almacena el valor de la F.O. de cada gen

Public funcion_objetivo() AsLong'Matriz que almacena los datos de la F.O. por cada cromosoma (individuo) Public mejor_valor AsDouble'Mejor valor de la F.O. en toda la población

Public mejor_individuo AsInteger'Mejor individuo de la F.O. en toda la población Public peor_valor AsDouble'Peorvalor de la F.O. en toda la población

Public peor_individuo AsInteger'Peor individuo de la F.O. en toda la población Publicprobabilidades() AsDouble'Probabilidades de selección

Public Individuos_Selectos() As Integer'Vector que almacena los individuos que se seleccionaran para formar la siguiente población Public Individuos_a_Cruzar AsInteger'Determina el número de cromosomas de la población que se utilizarán para el cruce

Public poblacion_nueva() As Integer'Matriz donde se almacena la nueva población

109

Public Individuos_que_se_Cruzan() As Integer'Vector que almacena el índice de los cromosomas que se cruzan PublicMejorMejorCromosoma() As Integer'Almacenael mejor cromosoma encontrado para cada experimento PublicMejorCromosoma() As Integer'Almacena los mejores cromosomas encontrados en cada generación

PublicExperimentoMejorEncontrado() AsDouble'Almacena la función objetivo del mejor valor encontrado en cada experimento. Public pena As Integer

PublicEvolucion() As Double'Vector que almacena el valor de la función objetivo del mejor individuo de la población encontrado en una generación

Public TiempoInicio As Single

Public tiempoCorrida As Single'Tiempo de corrida (en segundos) para correr un experimento

PublicTiempos() As Single'Matriz donde se guardan los tiempos de corrida para cada una de los experimentos

SubPrincipal() Call Limpiar_Hoja Call datos_entrada

ReDim funcion_objetivo(Tamano_Poblacion)

ReDimMejorCromosoma(Numero_Generaciones, cuantooficinas - 1)

ReDimEvolucion(Numero_Generaciones)

ReDimMejorMejorCromosoma(Numero_de_Experimentos, cuantooficinas - 1)

ReDimprobabilidades(Tamano_Poblacion) ReDim Individuos_Selectos(Tamano_Poblacion) ReDim Individuos_que_se_Cruzan(Tamano_Poblacion) ReDimSecuencia(Tamano_Poblacion) ReDimFactibilidadExperimento(Numero_de_Experimentos) ReDimExperimentoMejorEncontrado(Numero_de_Experimentos) ReDimTiempos(Numero_de_Experimentos)

For Experimento = 1 To Numero_de_Experimentos

TiempoInicio = Timer 'Tiempo de inicio de la corrida

110 For ite = 1 To Numero_Generaciones

Call f_objetivo Call calcule_mejor_peor_valor Evolucion(ite) = mejor_valor For i = 1 To cuantooficinas - 1 MejorCromosoma(ite, i) = poblacion(mejor_individuo, i) Next i Call calcule_probabilidades_seleccion Call Seleccione_Ruleta Call asignar_poblacion_nueva Call seleccione_individuos_cruce Call Cruce_Individuos_que_se_Cruzan Call Mutacion_Global Call asignar_poblacion_nueva_actual Next ite

tiempoCorrida = Timer - TiempoInicio 'Calcula el tiempo de corrida para cada experimento

Tiempos(Experimento) = tiempoCorrida 'Almacena los tiempos de corrida para cada experimento' aux = columnas(1000, 100000)

Call Guardar_Evolucion(Experimento, Numero_Generaciones) Next Experimento

Call Escribir_resultado(Timer - TiempoInicio) EndSub

_______________________________________________________________________________________________________ Sub datos_entrada() 'Lee los datos de inicio

111

'Lee los parámetros

Sheets("Parámetros").Select Tamano_Poblacion = Range("B4") Probabilidad_Cruce = Range("B5") Probabilidad_Mutacion = Range("B6") Numero_Generaciones = Range("B7") Numero_de_Experimentos = Range("B8")

'Lee las definiciciones

Sheets("Definiciones").Select tipo_contingencias = Range("E13") tipo_recursos = Range("B15")

pena = Range("E14") ' Guarda el valor de no cubrir una contingencia que tiene 2 recursos 'Columnas

Sheets("Columnas").Select Range("A1").Select

Range(Selection, Selection.End(xlDown)).Select columnas = Range(Selection, Selection.End(xlToRight)) cuantocolumnas = UBound(columnas)

'--- 'TREC_k= Total de Recursos de tipo k Disponibles para cubrir contingencias 'Guarda los el número de Recursos en el arreglo

ReDim TREC_k(tipo, 2)

Sheets("Definiciones").Select

ponderacion_distancia = Range("B16") 'Guarda en una variable la ponderación dada a la distancia por los metros

112 Range(Selection, Selection.End(xlDown)).Select

TREC_k = Range(Selection, Selection.End(xlToRight)) cuantoTREC_k = UBound(TREC_k)

cuanto2TREC_k = UBound(TREC_k, 2)

'k1=Supernumerario ,k2=Temporal, k3=SENA, k4=Horas Extras, k5=Cubierto por otra oficina

Sheets("Recursos").Select Range("A3").Select

Range(Selection, Selection.End(xlDown)).Select recursos = Range(Selection, Selection.End(xlToRight)) cuantorecursos = UBound(recursos)

cuantorecursos2 = UBound(recursos, 2)

'--- 'GUARDAR OFICINAS EN OFICINAS

Sheets("Oficinas").Select Range("A2").Select

Range(Selection, Selection.End(xlDown)).Select oficinas = Range(Selection, Selection.End(xlToRight)) cuantooficinas = UBound(oficinas)

cuantooficinas2 = UBound(oficinas, 2)

'--- 'COST_(j,k)= Costo de cubrir la contingencia j con un recurso tipo k

Sheets("Definiciones").Select Range("B19").Select

Range(Selection, Selection.End(xlDown)).Select

COST_jk = Range(Selection, Selection.End(xlToRight)) 'Almacena la tabla de relación de costos de utilizar para cubrir la contingencia con el tipo de recurso k

cuantoCOST_jk = UBound(COST_jk) ' cuanto2COST_jk = UBound(COST_jk, 2)

113

'NOCU_j= Costo de No cubrir la Contingencia j

ReDim NOCU_j(tipo_contingencias, 2)

Sheets("Definiciones").Select Range("B31").Select

Range(Selection, Selection.End(xlDown)).Select

NOCU_j = Range(Selection, Selection.End(xlToRight)) 'Almacena la tabla de relación de costos de utilizar àra cubrir la contingencia con el tipo de recurso k

cuantoNOCU_j = UBound(NOCU_j) ' cuanto2NOCU_j = UBound(NOCU_j, 2)

'--- 'CUTI_k= Costo de utilizar el recurso tipo k

ReDim CUTI_k(tipo_recursos, 2)

Sheets("Definiciones").Select Range("I20").Select

Range(Selection, Selection.End(xlDown)).Select

CUTI_k = Range(Selection, Selection.End(xlToRight)) 'Almacena la tabla de relación de costos de utilizar para cubrir la contingencia con el tipo de recurso k

cuantocuti_k = UBound(CUTI_k) ' cuanto2cuti_k = UBound(CUTI_k, 2)

'---

'Guarda los datos de los funcionarios en lista de recursos_i -

ReDim recursos_i(cuantorecursos, 4)

For i = 1 To cuantorecursos

114

recursos_i(i, 2) = recursos(i, 3) 'Guarda en Recursos el Tipo de Cargo

recursos_i(i, 3) = recursos(i, 5) 'Guarda en Recursos la Cordenada x

recursos_i(i, 4) = recursos(i, 6) 'Guarda en Recursos la cordenada y

Next i

ReDim contingencias_j(cuantooficinas, 7)

For j = 1 To cuantooficinas - 1

contingencias_j(j, 1) = oficinas(j + 1, 1) 'Guarda en Contingencias_j el número decontingencia

contingencias_j(j, 2) = oficinas(j + 1, 6) 'Guarda en Contingencias_j el tipo decontingencia

contingencias_j(j, 3) = oficinas(j + 1, 7) 'Guarda en Contingencias_j el Cargosolicitado por la contigencia

contingencias_j(j, 4) = oficinas(j + 1, 20) 'Guarda en Contingencias_j la distanciade la oficina que presento la contingencia

contingencias_j(j, 5) = oficinas(j + 1, 21) 'Guarda en Contingencias_j la distancia de la oficina que presento la contingencia

contingencias_j(j, 6) = oficinas(j + 1, 22) 'Calficación por cubrir la contingencia j

contingencias_j(j, 7) = oficinas(j + 1, 9) 'Guarda en Contingencias_j Cantidad de Funcionarios en el cargo k

Next j End Sub

_______________________________________________________________________________________________________

Sub generar_poblacion_inicial()

ReDimpoblacion(Tamano_Poblacion, cuantooficinas - 1)

ReDimesta(cuantorecursos) 'Matriz creada para ir alimentando cada vez que se use un recurso '---Genera Aleatorio para la población inicial

For i = 1 To Tamano_Poblacion

115

If contingencias_j(m, 7) - 1 = 1 Then

cont = 0

DoWhile cont < 1 'Intenta buscar la asignación aleatoria "cont" veces

Randomize cont = cont + 1

aux = Genere_aleatorio_entre(1, cuantorecursos)

Ifesta(aux) < 1 Then'Valida que el aleatorio generado no se encuentre repetido

esta(aux) = esta(aux) + 1 'Si el recurso es usado se le suma 1

poblacion(i, m) = recursos_i(aux, 1) cont = 1 EndIf Loop End If Next m

For j = 1 To cuantooficinas - 1 'El límite del tamaño está dado por el número de Contingencias u Oficinas

cont = 0

DoWhile cont < 1 'Intenta buscar la asignación aleatoria "cont" veces

Randomize cont = cont + 1

aux = Genere_aleatorio_entre(0, cuantorecursos)

Ifesta(aux) < 1 Then'Valida que el aleatorio generado no se encuentre repetido

esta(aux) = esta(aux) + 1 'Si el recurso es usado se le suma una a esta()

poblacion(i, j) = recursos_i(aux, 1) cont = 1

116 EndIf

Loop Next j

'--- Revisa si hay recursos que no fueron usados

n = Genere_aleatorio_entre(1, cuantooficinas - 1) 'Genera un Aleatorio para que revise desde un punto al azar si hay Recursos no Asignados

DoWhile n <> 0 'El ciclo parte desde un número en cuenta regresiva Ifpoblacion(i, n) = 0 Then

m = 0

DoWhile m < cuantorecursos 'Este ciclo termina hasta que examine todos los recursos que no fueron asignados

m = m + 1

Ifesta(m) = 0 Then'Valida en la matriz esta() si es usado el recursos

poblacion(i, n) = recursos_i(m, 1) esta(m) = 1 m = cuantorecursos + 1 EndIf Loop EndIf n = n - 1 Loop

For p = 1 To cuantorecursos 'Llena de 0 la matriz esta

117

Next p

Next i

End Sub

_______________________________________________________________________________________________________

'Genera números aleatorios entre dos números Function Genere_aleatorio_entre(a, b)

Genere_aleatorio_entre = Int((b - a + 1) * Rnd + a)

End Function

_______________________________________________________________________________________________________

Sub decodificar_cromo()

ReDim valor_cromosoma(Tamano_Poblacion, cuantooficinas - 1)

For i = 1 To Tamano_Poblacion

For j = 1 To cuantooficinas - 1

Ifpoblacion(i, j) <> 0 Then'Valida si le fue asignado un recurso

DIST_ij = 0 Costo_asignar_jk = 0 Costo_Utilizar_k = 0 CALI_jg = 0 costo_no_cubrir = 0 cont = 0 recurso = poblacion(i, j)

118 m = 0

'F.O para el cromosoma para calculara DIST_ij: Distancia i al recurso j DoWhile m < cuantorecursos

m = m + 1 n = 0

If recurso = recursos_i(m, 1) Then

recurso_utilizado = m

dist_recurso_oficina = Math.Abs(recursos_i(m, 3) - contingencias_j(j, 4)) + Math.Abs(recursos_i(m, 4) - contingencias_j(j, 5)) DIST_ij = -dist_recurso_oficina * 10

m = cuantorecursos + 1

End If Loop

'---

'F.O para el cromosoma para calculara COSTO_ASIGNAR_jk: cONTINGENCIA TIPO J A RECURSO TIPO K

Costo_Asignar_J = recursos_i(recurso_utilizado, 2) Costo_Asignar_K = contingencias_j(j, 2)

Costo_asignar_jk = COST_jk(Costo_Asignar_J + 1, Costo_Asignar_K + 1) 'Se coloca + 1 debido a que en la fila y columna 1 están los títulos

'.---

'F.O para el cromosoma CUTI_k×X?_(i,j,g,k) )Costo de utilizar el recurso k

Tipo_Recurso_k = recursos_i(recurso_utilizado, 2) Costo_Utilizar_k = CUTI_k(Tipo_Recurso_k, 2)

'.---

119 CALI_jg = contingencias_j(j, 6)

valor_cromosoma(i, j) = DIST_ij + Costo_asignar_jk + Costo_Utilizar_k + CALI_jg

Else

'.---

'F.O para el cromosoma 'NOCU?_j×Y_(j,g) Costo de no Cubrir la Contingencia j

Tipo_contingencia = contingencias_j(j, 2) costo_no_cubrir = NOCU_j(Tipo_contingencia, 2) valor_cromosoma(i, j) = costo_no_cubrir End If Next j Next i EndSub _______________________________________________________________________________________________________ Sub f_objetivo() Call decodificar_cromo ReDim funcion_objetivo(Tamano_Poblacion) For i = 1 To Tamano_Poblacion suma = 0 For j = 1 To cuantooficinas - 1

If contingencias_j(j, 7) - 1 < 2 Then'Si se le asigna a una contingencia que tiene menos de dos recursos se le resta pena a su valor total Ifpoblacion(i, j) = 0 Then

suma = suma - pena

120

Else

suma = valor_cromosoma(i, j) + suma

End If Next j funcion_objetivo(i) = suma Next i EndSub _______________________________________________________________________________________________________ Sub calcule_mejor_peor_valor()

'Calcula el mejor y peor individuo de la poblacion

mejor_valor = funcion_objetivo(1) mejor_individuo = 1

peor_valor = funcion_objetivo(1) peor_individuo = 1

For i = 2 To Tamano_Poblacion

If funcion_objetivo(i) > mejor_valor Then mejor_valor = funcion_objetivo(i) mejor_individuo = i

End If

If funcion_objetivo(i) < peor_valor Then peor_valor = funcion_objetivo(i) peor_individuo = i

End If Next i

121 End Sub

_______________________________________________________________________________________________________ Sub calcule_probabilidades_seleccion()

'Procedimiento que determina la probabilidades de selección con base al peor valor de la función objetivo

suma = 0

For i = 1 To Tamano_Poblacion

'Se suma 2 para que no se genere una división por cero para el peor individuo

suma = suma + peor_valor + 2 - funcion_objetivo(i) Next i

'Se calculan las probabilidades de selección, de tal manera que los individuos con menor función objetivotendrán mayor probabilidad de ser escogidos

For i = 1 To Tamano_Poblacion

probabilidades(i) = (-funcion_objetivo(i) + peor_valor + 1) / suma Next i

End Sub

_______________________________________________________________________________________________________

Sub Seleccione_Ruleta()

For i = 1 To Tamano_Poblacion

u = Rnd() 'Se genera un valor aleatoria entre 0 y 1

suma = probabilidades(1) j = 1

'Determina cual individuo seleccionar de acuerdo a la probabilidad acumulada While suma < u And j < Tamano_Poblacion

122 j = j + 1

suma = suma + probabilidades(j)

Wend Individuos_Selectos(i) = j Next i EndSub _______________________________________________________________________________________________________ Sub asignar_poblacion_nueva()

ReDim poblacion_nueva(Tamano_Poblacion, cuantooficinas - 1)

For i = 1 To Tamano_Poblacion

'Asigna los indviduos seleccionados a una nueva poblacion For j = 1 To cuantooficinas - 1 poblacion_nueva(i, j) = poblacion(Individuos_Selectos(i), j) Next j Next i End Sub _______________________________________________________________________________________________________ Sub seleccione_individuos_cruce() Individuos_a_Cruzar = 0 For c = 1 To Tamano_Poblacion u = Rnd

123 If u < Probabilidad_Cruce Then Individuos_a_Cruzar = Individuos_a_Cruzar + 1 Individuos_que_se_Cruzan(Individuos_a_Cruzar) = c End If Next c

'Procedimiento que garantiza que el numero de individuos a cruzar sea par If (Individuos_a_Cruzar Mod 2 = 1) Then

u = Rnd

If u < 0.5 Then

Individuos_a_Cruzar = Individuos_a_Cruzar + 1

Individuos_que_se_Cruzan(Individuos_a_Cruzar) = Genere_aleatorio_entre(1, TamanoPoblacion)

Else Individuos_a_Cruzar = Individuos_a_Cruzar - 1 End If End If End Sub _______________________________________________________________________________________________________

'Este metodo selecciona los papas para realizar los cruces Sub Cruce_Individuos_que_se_Cruzan()

'Asigna la secuencia de cruce

For i = 1 To Individuos_a_Cruzar

Secuencia(i) = Individuos_que_se_Cruzan(i)

Next i

124 dim_t = Individuos_a_Cruzar

'Recorre todos los individuos a cruzar While dim_t > 0

'Obtiene el papa 1 de manera aleatoria

pindice_1 = Genere_aleatorio_entre(1, dim_t)

'Reformula la secuncia eliminado el papa1

Papa_1 = Secuencia(pindice_1)

For i = pindice_1 To dim_t - 1 Secuencia(i) = Secuencia(i + 1)

Next i

'Pega en la secuencia lo que queda de la secuancia despues de sacar el papa1

dim_t = dim_t - 1

'Obtiene el papa 2 de manera aleatoria descartando el papa1

pindice_2 = Genere_aleatorio_entre(1, dim_t) Papa_2 = Secuencia(pindice_2)

'Mira la secuencia descartando el último individuo que se repite 'esto sucede porque se necesita ahorar tiempo

For i = pindice_2 To dim_t - 1 Secuencia(i) = Secuencia(i + 1)

125 dim_t = dim_t - 1

'Llama la funcion de cruce

Call Cruce_entre_Papas(Papa_1, Papa_2)

Wend End Sub

_______________________________________________________________________________________________________

Sub Cruce_entre_Papas(Papa_1, Papa_2)

ReDimesta2(cuantorecursos)

posicion = Genere_aleatorio_entre(1, cuantooficinas - 1) For i = posicion To cuantooficinas - 1

Temporal = poblacion_nueva(Papa_1, i) poblacion_nueva(Papa_1, i) = poblacion_nueva(Papa_2, i) poblacion_nueva(Papa_2, i) = Temporal Next i For i = 1 To cuantorecursos esta2(i) = 0 Next i For j = 1 To cuantooficinas - 1 pos = poblacion_nueva(Papa_1, j) If pos <> 0 Then

126 esta2(pos) = esta2(pos) + 1 End If Next j For i = 1 To cuantooficinas - 1 aux = poblacion_nueva(Papa_1, i) Ifesta2(aux) > 1 Then no_encontro = 0 m = 0 DoWhile m < cuantorecursos m = m + 1 noesta = esta2(m) If noesta = 0 Then poblacion_nueva(Papa_1, i) = m esta2(m) = esta2(m) + 1 m = cuantorecursos + 1 no_encontro = 1 End If

If m = cuantorecursos And no_encontro = 0 Then poblacion_nueva(Papa_1, i) = 0 End If

Loop

127 EndIf

Next i

'''''''''VALIDA SI ESTA REPETIDO EN EL PAPA 2

For i = 1 To cuantorecursos esta2(i) = 0 Next i For j = 1 To cuantooficinas - 1 pos = poblacion_nueva(Papa_2, j) If pos <> 0 Then esta2(pos) = esta2(pos) + 1 End If Next j For i = 1 To cuantooficinas - 1 aux = poblacion_nueva(Papa_2, i) If esta2(aux) > 1 Then no_encontro = 0 m = 0 DoWhile m < cuantorecursos m = m + 1 noesta = esta2(m) If noesta = 0 Then poblacion_nueva(Papa_2, i) = m esta2(m) = esta2(m) + 1

128 m = cuantorecursos + 1

no_encontro = 1 End If

If m = cuantorecursos And no_encontro = 0 Then poblacion_nueva(Papa_2, i) = 0 End If Loop esta2(aux) = esta2(aux) - 1 End If Next i End Sub _______________________________________________________________________________________________________ Sub asignar_poblacion_nueva_actual() For c = 1 To Tamano_Poblacion For i = 1 To cuantooficinas - 1 poblacion(c, i) = poblacion_nueva(c, i) Next i Next c End Sub _______________________________________________________________________________________________________ Sub Guardar_Evolucion(Experimento, Numero_Generaciones)

'Guarda la evolución

Dim MejorEncontrado As Double MejorEncontrado = Evolucion(1)

129 For i = 1 To cuantooficinas - 1

MejorMejorCromosoma(Experimento, i) = MejorCromosoma(1, i) Next i

For iteracion = 2 To Numero_Generaciones

IfEvolucion(iteracion) > MejorEncontrado Then 'es signo > debido a que es maximización MejorEncontrado = Evolucion(iteracion) For i = 1 To cuantooficinas - 1 MejorMejorCromosoma(Experimento, i) = MejorCromosoma(iteracion, i) Next i End If Next iteracion ExperimentoMejorEncontrado(Experimento) = MejorEncontrado EndSub ____________________________________________________________________________________________________

'Intercambia genes de un cromosoma

Sub Mutacion_Global()

For c = 1 To Tamano_Poblacion u = Rnd

If u < Probabilidad_Mutacion Then

cambio1 = Genere_aleatorio_entre(1, cuantooficinas - 1) cambio2 = Genere_aleatorio_entre(1, cuantooficinas - 1) Temporal = poblacion_nueva(c, cambio1)

130 poblacion_nueva(c, cambio2) = Temporal

EndIf Next c End Sub

_______________________________________________________________________________________________________ Sub Escribir_resultado(ByVal tiempoCorrida As Single)

Dim mejor AsDouble Dim position AsInteger Sheets("Columnas").Select Range("A1").Select

Range(Selection, Selection.End(xlDown)).Select columnas = Range(Selection, Selection.End(xlToRight)) cuantocolumnas = UBound(columnas)

mejor = ExperimentoMejorEncontrado(1) position = 1

For e = 1 To Numero_de_Experimentos

If mejor >ExperimentoMejorEncontrado(e) Then mejor = ExperimentoMejorEncontrado(e) position = e

End If Next e

'Selecciona la hoja de Solucion

131 For i = 1 To cuantooficinas - 1

Range("A" & i + 6) = i

Range("B" & i + 6) = contingencias_j(i, 1)

Range("c" & i + 6) = MejorMejorCromosoma(position, i) Next i

Range("B6") = "Contingencia" Range("C6") = "Recurso"

Range("B2") = "Función Objetivo"

Range("C2") = ExperimentoMejorEncontrado(position) Range("B3") = "Tiempo de Corrida"

Range("C3") = tiempoCorrida Range("B6").Select Range(Selection, Selection.End(xlToRight)).Select Application.CutCopyMode = False With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .Color = 255 .TintAndShade = 0 .PatternTintAndShade = 0 End With With Selection.Font .ThemeColor = xlThemeColorDark1 .TintAndShade = 0 End With Selection.Font.Bold = True Selection.Borders(xlDiagonalDown).LineStyle = xlNone

132 Selection.Borders(xlDiagonalUp).LineStyle = xlNone WithSelection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With WithSelection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With WithSelection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With WithSelection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With WithSelection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideHorizontal)

133 .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With Range("B2").Select Range(Selection, Selection.End(xlDown)).Select Application.CutCopyMode = False With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .Color = 255 .TintAndShade = 0 .PatternTintAndShade = 0 End With With Selection.Font .ThemeColor = xlThemeColorDark1 .TintAndShade = 0 End With Selection.Font.Bold = True Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone WithSelection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With WithSelection.Borders(xlEdgeTop) .LineStyle = xlContinuous

134 .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With WithSelection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With WithSelection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With WithSelection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With WithSelection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With End Sub _______________________________________________________________________________________________________

135

Sub Limpiar_Hoja()

'Borra el contenido de las celdas que estan en el rango especificado Sheets("Solucion").Select

Range("A1:C1020").ClearContents

136

ANEXO 10: ESCENARIOS DISEÑADOS PARA PROBAR LAS SOLUCIONES DEL