apendice a. cÓdigo del...

26
APENDICE A. CÓDIGO DEL PROTOTIPO

Upload: others

Post on 05-Aug-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

APENDICE A. CÓDIGO DEL PROTOTIPO

APENDICE A. CÓDIGO DEL PROTOTIPO

En este apéndice se menciona el código que se siguió para la realización del prototipo. Dando además una explicación breve de la función que realiza cada una de las subrutinas. Sub Inicio() 'Inicio del programa desplegando una ventana con los días Application.ScreenUpdating = False dias = Sheets("Calendario").Range("A2").CurrentRegion.Rows.Count For Renglondias = 2 To dias VentanaDia.ListaDia.AddItem _ Sheets("Calendario").Cells(Renglondias, 1) Next Renglondias VentanaDia.Show End Sub Sub Iteraciones() 'Se definen las iteraciones que se van a llevar a cabo para la heurística Sheets("Resultados").Select Cells.Select Selection.ClearContents For iteracion = 1 To 2 Borrado Next iteracion End Sub Sub Borrado() 'Borra las diferentes hojas Application.ScreenUpdating = False Sheets("RutvsCon").Select Columns("G:J").Select Selection.ClearContents Sheets("Proceso1").Select Cells.Select Selection.ClearContents

Sheets("Datos").Select Columns("N:CW").Select Selection.ClearContents Sheets("h").Select Cells.Select Selection.ClearContents Sheets("Aleunidad").Select Cells.Select Selection.ClearContents Sheets("Calendario").Select Columns("H:AO").Select Selection.ClearContents Sheets("Proc").Select Columns("A:J").Select Selection.ClearContents Generacionclientes End Sub Sub Generacionclientes() 'Generacion de numeros aleatorios de clientes Application.ScreenUpdating = False Sheets("h").Select Cells.Select Selection.ClearContents 'Definición del tamaño de la cadena de números aleatorios rdatos = Sheets("Datos").Range("A3").CurrentRegion.Rows.Count For renglondatos = 3 To rdatos If Sheets("Datos").Cells(renglondatos, 5).Value = Sheets("Calendario").Range("F3").Value Then cliente = cliente + 1 End If Next renglondatos n = cliente Sheets("h").Select Range("A1").Select 'Definición de el número de rutas que se van a crear For ruta = 1 To 3

contador = 0 suma = 0 'Generación de cada número aleatorio rh = Sheets("h").Range("A1").CurrentRegion.Rows.Count + 1 For celda = 1 To n aleatorio = Int(Rnd * 2) ActiveCell.Cells(rh, celda) = aleatorio If aleatorio = 1 Then contador = contador + 1 End If Next celda 'Definición del número de subrutas que se van a crear For subruta = rh + 1 To n * ruta If contador = n Then Exit For Else For celda1 = 1 To n suma = 0 'Eliminar que no se visiten dos veces a un cliente dentro de una ruta For renglonc = rh To subruta clientevisitado = ActiveCell.Cells(renglonc, celda1).Value suma = suma + clientevisitado Next renglonc If suma = 1 Then ActiveCell.Cells(subruta, celda1) = 0 Else If subruta = n * ruta Then ActiveCell.Cells(subruta, celda1) = 1 contador = contador + 1 Else aleatorio1 = Int(Rnd * 2) ActiveCell.Cells(subruta, celda1) = aleatorio1 If aleatorio1 = 1 Then contador = contador + 1 End If End If End If Next celda1 End If Next subruta Next ruta

'Definición del deposito como un uno ya que siempre se va a salir de éste. Worksheets("h").Range("A1").Select Columns("A:A").Select Selection.Insert Shift:=xlToRight rh1 = Sheets("h").Range("A1").CurrentRegion.Rows.Count rh2 = Sheets("h").Range("A1").CurrentRegion.Columns.Count + 1 For deposito = 1 To rh1 Sheets("h").Cells(deposito, 1).Value = 1 Next deposito Rows("1:1").Select Selection.Delete Shift:=xlUp Dias_del_mes End Sub Sub Dias_del_mes() 'Se acomodan los días del mes actual de manera horizontal Application.ScreenUpdating = False mes_dia_seleccionado = Sheets("Calendario").Range("F2").Value rcalendario = Sheets("Calendario").Range("D1").CurrentRegion.Rows.Count For rengloncalen = 1 To rcalendario numero_mes = Sheets("Calendario").Cells(rengloncalen, 4).Value If mes_dia_seleccionado = numero_mes Then dias_meses = Sheets("Calendario").Cells(rengloncalen, 5).Value For dia = 1 To dias_meses Sheets("Calendario").Cells(2, dia + 7).Value = dia Next dia End If Next rengloncalen Puntos_reparto_dia End Sub Sub Puntos_reparto_dia() 'Se colocan en la hoja de calendario en cada uno de los días los puntos de reparto que se tienen que visitar. Application.ScreenUpdating = False rdatos = Worksheets("Datos").Range("A3").CurrentRegion.Rows.Count ccalendario = Worksheets("Calendario").Range("H1").CurrentRegion.Columns.Count

For renglond = 3 To rdatos For columnac = 8 To ccalendario dia = Sheets("Calendario").Cells(2, columnac).Value fecha_cliente = Sheets("Datos").Cells(renglond, 5).Value If fecha_cliente = dia Then rcalendario = Worksheets("Calendario").Cells(2, columnac).CurrentRegion.Rows.Count + 2 Sheets("Calendario").Cells(rcalendario, columnac).Value = Sheets("Datos").Cells(renglond, 9).Value End If If fecha_cliente = Sheets("Calendario").Range("F3").Value Then Sheets("Datos").Cells(renglond, 15).Value = 1 End If Next columnac Next renglond Seleccion_ruta End Sub Sub Seleccion_ruta() 'Seleccion de cada una de las subrutas de cada ruta Application.ScreenUpdating = False rh = Sheets("h").Range("A1").CurrentRegion.Rows.Count subruta = 0 For renglonh = 1 To rh subruta = subruta + 1 Sheets("Datos").Cells(1, 100).Value = subruta Sheets("RutvsCon").Select Columns("G:J").Select Selection.ClearContents Sheets("Proceso1").Select Cells.Select Selection.ClearContents Sheets("Aleunidad").Select Cells.Select Selection.ClearContents Sheets("Proc").Select Cells.Select Selection.ClearContents Seleccion_volumenes_ventanastiempo

Next renglonh Resultados End Sub Sub Seleccion_volumenes_ventanastiempo() 'Se seleccionan los volúmenes y las ventanas de tiempo de cada uno de los clientes que se van a visitar. Application.ScreenUpdating = False rdatos = Sheets("Datos").Range("A3").CurrentRegion.Rows.Count i = 1 For renglond = 3 To rdatos If Sheets("Datos").Cells(renglond, 15).Value = 1 Then rproc = rproc + 1 Sheets("Proc").Cells(rproc, 7).Value = Sheets("Datos").Cells(renglond, 8).Value Sheets("Proc").Cells(rproc, 8).Value = Sheets("Datos").Cells(renglond, 10).Value Sheets("Proc").Cells(rproc, 9).Value = Sheets("Datos").Cells(renglond, 11).Value End If Next renglond Listado_conexiones End Sub Sub Listado_conexiones() 'Se relacionan los puntos de reparto del día que se escogió en el inicio, con las conexiones.Y se ponen en forma de lista en la hoja de "Proc". Application.ScreenUpdating = False rcalendario = Sheets("Calendario").Range("AB3").CurrentRegion.Rows.Count + 1 rpuntoreparto = Sheets("PuntosReparto").Range("A2").CurrentRegion.Rows.Count dia = Sheets("Calendario").Range("F3").Value + 7 For renglonc = 3 To rcalendario For renglonpr = 2 To rpuntoreparto puntorepartocalendario = Sheets("Calendario").Cells(renglonc, dia).Value puntoreparto = Sheets("PuntosReparto").Cells(renglonpr, 2).Value rproc = Sheets("Proc").Range("A1").CurrentRegion.Rows.Count rproc = rproc + 1 If puntorepartocalendario = puntoreparto Then Sheets("Proc").Cells(rproc, 1).Value = Sheets("PuntosReparto").Cells(renglonpr, 1).Value Sheets("Proc").Cells(rproc, 4).Value = Sheets("PuntosReparto").Cells(renglonpr, 1).Value Sheets("Proc").Cells(rproc, 5).Value = Sheets("PuntosReparto").Cells(renglonpr, 1).Value

End If Next renglonpr Next renglonc Sheets("Proc").Cells(1, 5).Value = "Mexico" Distancias_origen_conexiones End Sub Sub Distancias_origen_conexiones() 'Se ponen las distancias a cada una de las conexiones en la hoja de Proc. Application.ScreenUpdating = False rproc = Sheets("Proc").Range("A1").CurrentRegion.Rows.Count rconexiones = Sheets("Conexiones").Range("A3").CurrentRegion.Rows.Count For renglonp = 2 To rproc For renglonc = 3 To rconexiones conexionproc = Sheets("Proc").Cells(renglonp, 4).Value conexion = Sheets("Conexiones").Cells(renglonc, 1).Value If conexionproc = conexion Then Sheets("Proc").Cells(renglonp, 2).Value = Sheets("Conexiones").Cells(renglonc, 4).Value End If Next renglonc Next renglonp Cadena_aleatoriaUltimo_cliente End Sub Sub Cadena_aleatoriaUltimo_cliente() 'Se selecciona el cliente mas lejano y se seleccionan los clientes que se van a visistar Application.ScreenUpdating = False subruta = Sheets("Datos").Cells(1, 100).Value rproc = Sheets("Proc").Range("E1").CurrentRegion.Rows.Count 'Se seleccionan los clientes que se van a visitar en la subruta For renglonp = 1 To rproc If Sheets("h").Cells(subruta, renglonp).Value = 1 Then Sheets("Proc").Cells(renglonp, 6).Value = 1 Else Sheets("Proc").Cells(renglonp, 6).Value = 0 End If Next renglonp 'Se eliminan las distancias de los clientes que no se van a visitar For renglonp1 = 1 To rproc

If Sheets("Proc").Cells(renglonp1, 6).Value = 0 Then Sheets("Proc").Cells(renglonp1, 2).Value = 0 End If Next renglonp1 'Se selecciona el cliente mas lejano For renglonp2 = 2 To rproc distancia = Sheets("Proc").Cells(renglonp2, 2).Value distancia1 = Sheets("Proc").Cells(renglonp2 + 1, 2).Value If distancia1 >= distancia Then Sheets("Proc").Cells(renglonp2, 2).Value = Sheets("Proc").Cells(renglonp2, 2).Value Sheets("Proc").Cells(renglonp2, 1).Value = Sheets("Proc").Cells(renglonp2, 1).Value Else Sheets("Proc").Cells(renglonp2 + 1, 2).Value = Sheets("Proc").Cells(renglonp2, 2).Value Sheets("Proc").Cells(renglonp2 + 1, 1).Value = Sheets("Proc").Cells(renglonp2, 1).Value End If Next renglonp2 Sheets("Proc").Cells(2, 3).Value = Sheets("Proc").Cells(renglonp2, 1).Value Inicio_seleccion_rutas End Sub Sub Inicio_seleccion_rutas() 'Se seleccionan todas las conexiones que se van a visitar en la ruta. Application.ScreenUpdating = False rrutvscon = Sheets("RutvsCon").Range("A3").CurrentRegion.Rows.Count rproc = Sheets("Proc").Range("A4").CurrentRegion.Rows.Count + 1 For renglonp = 2 To rproc For renglonr = 3 To rrutvscon sigconexion = Sheets("RutvsCon").Cells(renglonr, 3).Value conexion = Sheets("Proc").Cells(renglonp, 4).Value If conexion = sigconexion Then Sheets("RutvsCon").Cells(renglonr, 7).Value = 2 End If Next renglonr Next renglonp Continuacion_seleccion_rutas End Sub

Sub Continuacion_seleccion_rutas() 'Se selecciona de las rutas el cliente mas lejano Application.ScreenUpdating = False clientelejano = Sheets("Proc").Range("C2").Value rrutvscon = Sheets("RutvsCon").Range("A3").CurrentRegion.Rows.Count For renglonr = 3 To rrutvscon seleccion1 = Sheets("RutvsCon").Cells(renglonr, 7).Value sigconexion = Sheets("RutvsCon").Cells(renglonr, 3).Value If seleccion1 <> " " And sigconexion = clientelejano Then Sheets("RutvsCon").Cells(renglonr, 8).Value = clientelejano End If Next renglonr Continuacion1_seleccion_rutas End Sub Sub Continuacion1_seleccion_rutas() 'Se seleccionan las rutas con una secuencia menor a la del lugar mas lejano con un cinco y las de secuencia mayor con un seis. Application.ScreenUpdating = False rrutvscon = Sheets("RutvsCon").Range("A3").CurrentRegion.Rows.Count rrutvscon1 = Sheets("RutvsCon").Range("A3").CurrentRegion.Rows.Count For renglonr = 3 To rrutvscon For renglonr1 = 3 To rrutvscon1 seleccion2 = Sheets("RutvsCon").Cells(renglonr1, 8).Value If seleccion2 <> "" Then secuencia = Sheets("RutvsCon").Cells(renglonr1, 6).Value ruta = Sheets("RutvsCon").Cells(renglonr1, 1).Value If Sheets("RutvsCon").Cells(renglonr, 6).Value <= secuencia And Sheets("RutvsCon").Cells(renglonr, 1).Value = ruta Then Sheets("RutvsCon").Cells(renglonr, 9).Value = 5 End If If Sheets("RutvsCon").Cells(renglonr, 6).Value > secuencia And Sheets("RutvsCon").Cells(renglonr, 1).Value = ruta Then Sheets("RutvsCon").Cells(renglonr, 9).Value = 6 End If End If Next renglonr1 Next renglonr

Finalizacion_seleccion_rutas End Sub Sub Finalizacion_seleccion_rutas() 'Se seleccionan las rutas que tienen como destino final al lugar mas lejano. Application.ScreenUpdating = False rrutvscon = Sheets("RutvsCon").Range("A3").CurrentRegion.Rows.Count rrutvscon1 = Sheets("RutvsCon").Range("A3").CurrentRegion.Rows.Count For renglonr = 3 To rrutvscon For renglonr1 = 3 To rrutvscon1 seleccion3 = Sheets("RutvsCon").Cells(renglonr1, 9).Value If seleccion3 = 6 Then secuencia1 = Sheets("RutvsCon").Cells(renglonr1, 6).Value ruta1 = Sheets("RutvsCon").Cells(renglonr1, 1).Value If Sheets("RutvsCon").Cells(renglonr, 6).Value <= secuencia1 And Sheets("RutvsCon").Cells(renglonr, 1).Value = ruta1 Then Sheets("RutvsCon").Cells(renglonr, 9).Value = 6 End If End If Next renglonr1 Next renglonr Rutas_seleccionadas End Sub Sub Rutas_seleccionadas() 'Las rutas seleccionadas se pegan en la hoja de Proceso1 Application.ScreenUpdating = False rrutvscon = Sheets("RutvsCon").Range("A2").CurrentRegion.Rows.Count Sheets("RutvsCon").Cells(2, 9).Value = 5 'Se pegan las rutas seleccionadas For renglonr = 2 To rrutvscon ultimaseleccion = Sheets("RutvsCon").Cells(renglonr, 9).Value rproceso1 = Sheets("Proceso1").Range("A1").CurrentRegion.Rows.Count rproceso1 = rproceso1 + 1 If ultimaseleccion = 5 Then Sheets("Proceso1").Cells(rproceso1, 1).Value = Sheets("RutvsCon").Cells(renglonr, 1).Value Sheets("Proceso1").Cells(rproceso1, 2).Value = Sheets("RutvsCon").Cells(renglonr, 2).Value Sheets("Proceso1").Cells(rproceso1, 3).Value = Sheets("RutvsCon").Cells(renglonr, 3).Value Sheets("Proceso1").Cells(rproceso1, 4).Value = Sheets("RutvsCon").Cells(renglonr, 4).Value Sheets("Proceso1").Cells(rproceso1, 5).Value = Sheets("RutvsCon").Cells(renglonr, 6).Value

Sheets("Proceso1").Cells(rproceso1, 6).Value = 1 End If Next renglonr 'Se selecciona al cliente mas lejano clientelejano = Sheets("Proc").Range("C2").Value rproceso1 = Sheets("Proceso1").Range("A2").CurrentRegion.Rows.Count For renglonpr1 = 2 To rproceso1 sigconexion = Sheets("Proceso1").Cells(renglonpr1, 3).Value If sigconexion = clientelejano Then Sheets("Proceso1").Cells(renglonpr1, 6).Value = 1 Else Sheets("Proceso1").Cells(renglonpr1, 6).Value = "" End If Next renglonpr1 Llenado_rutas End Sub Sub Llenado_rutas() 'Se ponen las distancias y tiempos de cada una de las rutas seleccionadas Application.ScreenUpdating = False rproceso1 = Sheets("Proceso1").Range("A1").CurrentRegion.Rows.Count + 1 rsigconexiones = Sheets("Sigconexiones").Range("A1").CurrentRegion.Rows.Count For renglonpr = 1 To rproceso1 For renglons = 2 To rsigconexiones conexionp = Sheets("Proceso1").Cells(renglonpr, 2).Value sigconexionp = Sheets("Proceso1").Cells(renglonpr, 3).Value viap = Sheets("Proceso1").Cells(renglonpr, 4).Value conexions = Sheets("SigConexiones").Cells(renglons, 1).Value sigconexions = Sheets("SigConexiones").Cells(renglons, 2).Value vias = Sheets("SigConexiones").Cells(renglons, 3).Value If conexionp = conexions And sigconexionp = sigconexions And viap = vias Then csigconexiones1 = Sheets("Sigconexiones").Range("D3").CurrentRegion.Columns.Count For columnas = 4 To csigconexiones1 Sheets("Proceso1").Cells(renglonpr, columnas + 3).Value = Sheets("SigConexiones").Cells(renglons, columnas).Value Next columnas End If Next renglons Next renglonpr

Sumas End Sub Sub Sumas() 'Se obtienen las distancias del origen a cada una de las conexiones Application.ScreenUpdating = False rproceso1 = Sheets("Proceso1").Range("A3").CurrentRegion.Rows.Count + 1 csigconexiones = Sheets("Sigconexiones").Range("A3").CurrentRegion.Columns.Count - 3 csigconexiones = csigconexiones + 6 For columnas = 7 To csigconexiones cproceso1 = Sheets("Proceso1").Range("a3").CurrentRegion.Columns.Count For renglonpr = 3 To rproceso1 seleccion = Sheets("Proceso1").Cells(renglonpr, 6).Value distancias_tiempos = Sheets("Proceso1").Cells(renglonpr, columnas).Value If seleccion <> 1 Then suma = suma + distancias_tiempos Sheets("Proceso1").Cells(renglonpr, cproceso1 + 1).Value = suma Else suma1 = suma + distancias_tiempos Sheets("Proceso1").Cells(renglonpr, cproceso1 + 1).Value = suma1 suma = 0 suma1 = 0 End If Next renglonpr Next columnas 'Se especifican los nombres de cada una de las columnas csigconexiones1 = Sheets("Sigconexiones").Range("A3").CurrentRegion.Columns.Count - 3 cpro = Sheets("Proceso1").Range("A3").CurrentRegion.Columns.Count - csigconexiones1 * 2 For columna = cpro To cpro + csigconexiones1 - 1 cprr = columna + csigconexiones1 + 1 Sheets("Proceso1").Cells(2, cprr).Value = Sheets("Proceso1").Cells(2, columna + 1).Value Next columna Ahorro_distancias End Sub Sub Ahorro_distancias() 'Se calcula el ahorro de distancias Application.ScreenUpdating = False

rproceso1 = Sheets("Proceso1").Range("A3").CurrentRegion.Rows.Count + 1 csigconexiones = Sheets("Sigconexiones").Range("A3").CurrentRegion.Columns.Count - 5 columna = Sheets("Proceso1").Range("A3").CurrentRegion.Columns.Count - csigconexiones cproceso1 = Sheets("Proceso1").Range("A3").CurrentRegion.Columns.Count For renglonpr = 3 To rproceso1 seleccion = Sheets("Proceso1").Cells(renglonpr, 6).Value If seleccion <> 1 Then Sheets("Proceso1").Cells(renglonpr, cproceso1 + 1).Value = Sheets("Proceso1").Cells(renglonpr, columna - 1) * 2 Else Sheets("Proceso1").Cells(renglonpr, cproceso1 + 1).Value = Sheets("Proceso1").Cells(renglonpr, columna - 1) * 2 End If Next renglonpr Criterio_tiempos End Sub Sub Criterio_tiempos() 'Se calcula el criterio de tiempos Application.ScreenUpdating = False rconexiones = Sheets("Conexiones").Range("A2").CurrentRegion.Rows.Count csigconexiones = Sheets("Sigconexiones").Range("A3").CurrentRegion.Columns.Count - 5 cprr = Sheets("Proceso1").Range("A3").CurrentRegion.Columns.Count - csigconexiones - 1 rproceso1 = Sheets("Proceso1").Range("A3").CurrentRegion.Rows.Count + 1 'Se elige la distacia del origen al destino final sin insertar ningun cliente For renglonc = 2 To rconexiones If Sheets("Conexiones").Cells(renglonc, 1).Value = Sheets("Proc").Cells(2, 3).Value Then disorigendestino = Sheets("Conexiones").Cells(renglonc, 5).Value End If Next renglonc 'Calculo del criterio de tiempos For columna = cprr To cprr + csigconexiones cproceso1 = Sheets("Proceso1").Range("A3").CurrentRegion.Columns.Count For renglonpr = 3 To rproceso1 seleccion = Sheets("Proceso1").Cells(renglonpr, 6).Value If seleccion <> 1 Then temp = temp + 1 Else

t = renglonpr - temp For renglon = t To renglonpr If Sheets("Proc").Cells(2, 3).Value = Sheets("Proc").Cells(2, 5).Value Then Sheets("Proceso1").Cells(renglon, cproceso1 + 1).Value = disorigendestino Else Sheets("Proceso1").Cells(renglon, cproceso1 + 1).Value =

Sheets("Proceso1").Cells(renglonpr, columna).Value + Sheets("Proceso1").Cells(renglon, columna) - Sheets("Proceso1").Cells(renglon, columna) - disorigendestino

End If Next renglon temp = 0 End If Next renglonpr temp = 0 Next columna 'Se especifican los nombres de cada una de las columnas csigconexiones1 = Sheets("Sigconexiones").Range("A3").CurrentRegion.Columns.Count - 3 cproceso11 = Sheets("Proceso1").Range("A3").CurrentRegion.Columns.Count – csigconexiones1 * 2 For columna = cproceso11 To cproceso11 + csigconexiones1 - 1 cprr = columna + csigconexiones1 + 1 Sheets("Proceso1").Cells(2, cprr).Value = Sheets("Proceso1").Cells(2, columna + 1).Value Next columna Costos End Sub Sub Costos() 'Se seleccionan los costos de cada una de la rutas Application.ScreenUpdating = False rproceso1 = Sheets("Proceso1").Range("A1").CurrentRegion.Rows.Count + 1 rcostoreparto = Sheets("CostosRe").Range("A2").CurrentRegion.Rows.Count 'Se ponen en la hoja de Proceso1 los costos de reparto For renglonp = 1 To rproceso1 For rengloncr = 1 To rcostoreparto conexionp = Sheets("Proceso1").Cells(renglonp, 2).Value sigconexionp = Sheets("Proceso1").Cells(renglonp, 3).Value viap = Sheets("Proceso1").Cells(renglonp, 4).Value conexioncr = Sheets("CostosRe").Cells(rengloncr, 1).Value sigconexioncr = Sheets("CostosRe").Cells(rengloncr, 2).Value viacr = Sheets("CostosRe").Cells(rengloncr, 3).Value

finalruta = Sheets("Proceso1").Cells(renglonp, 6).Value If conexionp = conexioncr And sigconexionp = sigconexioncr And viap = viacr And finalruta <> 1 Then ccostoreparto = Sheets("CostosRe").Range("D3").CurrentRegion.Columns.Count For columna = 4 To ccostoreparto Sheets("Proceso1").Cells(renglonp, columna + 199).Value = Sheets("CostosRe").Cells(rengloncr, columna).Value Next columna End If Next rengloncr Next renglonp 'Se ponen en la hoja de Proceso1 los costos de destino final rproceso11 = Sheets("Proceso1").Range("A1").CurrentRegion.Rows.Count + 1 rcostofinal = Sheets("CostosFi").Range("A2").CurrentRegion.Rows.Count For renglonp1 = 1 To rproceso11 For rengloncf = 1 To rcostofinal sigconexionp = Sheets("Proceso1").Cells(renglonp1, 3).Value sigconexioncf = Sheets("CostosFi").Cells(rengloncf, 2).Value finalruta1 = Sheets("Proceso1").Cells(renglonp1, 6).Value If sigconexionp = sigconexioncf And finalruta1 = 1 Then ccostofinal = Sheets("CostosFi").Range("D3").CurrentRegion.Columns.Count For columna1 = 3 To ccostofinal Sheets("Proceso1").Cells(renglonp1, columna1 + 200).Value = Sheets("CostosFi").Cells(rengloncf, columna1).Value Next columna1 End If Next rengloncf Next renglonp1 'Se especifican los nombres de cada una de las columnas rcostoreparto1 = Sheets("CostosRe").Range("A1").CurrentRegion.Columns.Count For rengloncr = 4 To rcostoreparto1 nombre = Sheets("CostosRe").Cells(1, rengloncr).Value Sheets("Proceso1").Cells(1, rengloncr + 199).Value = nombre Next rengloncr Concatenacion End Sub Sub Concatenacion() 'Concatena los nombres de las conexiones Application.ScreenUpdating = False

numeroclientes = Sheets("Proc").Range("E1").CurrentRegion.Rows.Count For cliente = 2 To numeroclientes conexion = Sheets("Proc").Cells(cliente, 5).Value conexion1 = Sheets("Proc").Cells(cliente + 1, 5).Value If conexion = conexion1 Then Sheets("Proc").Cells(cliente, 4).Value = "" End If Next cliente 'Concatena los nombres de la conexiones de la hoja de Proc numeroclientes1 = Sheets("Proc").Range("E1").CurrentRegion.Rows.Count + 1 For cliente1 = 2 To numeroclientes1 conexionn = Sheets("Proc").Cells(cliente1, 5).Value clientelejano = Sheets("Proc").Cells(2, 3).Value If conexionn = clientelejano Then If clientelejano = Sheets("Proc").Cells(2, 5).Value Then For renglon = cliente1 To numeroclientes1 Sheets("Proc").Cells(renglon, 4).Value = "" Next renglon Else For renglon1 = cliente1 To numeroclientes1 Sheets("Proc").Cells(renglon1, 4).Value = "" Next renglon1 End If End If Sheets("Proc").Cells(cliente1, 10).FormulaR1C1 = "=CONCATENATE(R[-1]C[0],R[0]C[-6])" Next cliente1 'Concatena los nombres de las conexiones de la hoja de Proceso1 rproceso1 = Sheets("Proceso1").Range("A1").CurrentRegion.Rows.Count For renglonpr = 3 To rproceso1 If Sheets("Proc").Cells(2, 3).Value = Sheets("Proc").Cells(2, 5).Value Then Sheets("Proceso1").Cells(renglonpr, 200).Value = Sheets("Proc").Cells(2, 5).Value Else If Sheets("Proceso1").Cells(renglonpr, 6).Value <> 1 Then Sheets("Proceso1").Cells(renglonpr, 200).FormulaR1C1 = "=CONCATENATE(R[-1]C[0],R[0]C[-197])" Else Sheets("Proceso1").Cells(renglonpr + 1, 200).Value = Sheets("Proceso1").Cells(renglonpr, 3).Value End If End If Next renglonpr Seleccion_mayorahorro_distancias End Sub

Sub Seleccion_mayorahorro_distancias() 'Se selecciona la ruta que tenga mayor ahorro en distancias Application.ScreenUpdating = False rproceso1 = Sheets("Proceso1").Range("A2").CurrentRegion.Rows.Count + 1 rproc = Sheets("Proc").Range("D2").CurrentRegion.Rows.Count - 4 rproc1 = Sheets("Proc").Range("E2").CurrentRegion.Rows.Count cadena = Sheets("Proc").Cells(rproc1 - 2, 10).Value For renglonpr = 3 To rproceso1 If Sheets("Proc").Cells(2, 5).Value = Sheets("Proc").Cells(2, 3).Value Then rproceso11 = Sheets("Proceso1").Range("A2").CurrentRegion.Columns.Count rsigconexiones = Sheets("Sigconexiones").Range("A2").CurrentRegion.Columns.Count - 4 columna = rproceso11 - rsigconexiones Sheets("Proceso1").Cells(renglonpr, 201).Value = Sheets("Proceso1").Cells(renglonpr, columna).Value Sheets("Proceso1").Cells(renglonpr, 202).Value = "Costo Final" Else If Sheets("Proceso1").Cells(renglonpr, 200).Value = cadena Then rproceso11 = Sheets("Proceso1").Range("A2").CurrentRegion.Rows.Count + 1 For renglonpr1 = 3 To rproceso11 If Sheets("Proceso1").Cells(renglonpr, 1).Value = Sheets("Proceso1").Cells(renglonpr1, 1).Value Then rproceso12 = Sheets("Proceso1").Range("A2").CurrentRegion.Columns.Count rsigconexiones1 = Sheets("Sigconexiones").Range("A2").CurrentRegion.Columns.Count - 4 columna1 = rproceso12 - rsigconexiones1 ahorro = Sheets("Proceso1").Cells(renglonpr1, columna1).Value ahorro1 = Sheets("Proceso1").Cells(renglonpr1 - (h + 1), columna1).Value If Sheets("Proceso1").Cells(renglonpr1, 6).Value = 1 Then Sheets("Proceso1").Cells(renglonpr1, 202).Value = "Costo Final" If ahorro > ahorro1 Then temp = ahorro Sheets("Proceso1").Cells(renglonpr1 - (h + 1), 201).Value = "" Sheets("Proceso1").Cells(renglonpr1, 201).Value = temp Else temp = ahorro1 Sheets("Proceso1").Cells(renglonpr1 - (h + 1), 201).Value = temp Sheets("Proceso1").Cells(renglonpr1, 201).Value = "" End If h = 0 Else Sheets("Proceso1").Cells(renglonpr1, 202).Value = "Costo Medio" h = h + 1 End If End If Next renglonpr1 End If End If

Next renglonpr rprocesoo = Sheets("Proceso1").Range("A2").CurrentRegion.Rows.Count + 1 For renglonprr = 2 To rprocesoo If Sheets("Proceso1").Cells(renglonprr, 201).Value <> "" Then rprocesoo1 = Sheets("Proceso1").Range("A2").CurrentRegion.Rows.Count + 1 For renglonprr1 = 2 To rprocesoo1 If Sheets("Proceso1").Cells(renglonprr1, 1).Value = Sheets("Proceso1").Cells(renglonprr, 1).Value Then Sheets("Proceso1").Cells(renglonprr1, 201).Value = 5 End If Next renglonprr1 End If Next renglonprr Checar_capacidad_sumacriterio_costos_tiempos End Sub Sub Checar_capacidad_sumacriterio_costos_tiempos () 'Checa la capacidad que queda libre en el vehículo, los costos , los tiempos y selecciona el mejor vehículo. 'Generación de cadenas aleatorias de las unidades Application.ScreenUpdating = False Sheets("Aleunidad").Select Cells.Select Selection.ClearContents runidad = Sheets("Unidad").Range("A2").CurrentRegion.Rows.Count ' numerounidades = runidad - 2 Sheets("Aleunidad").Select Range("A1").Select For cadena = 1 To 50 For unidad = 1 To numerounidades aleatorio = Int(Rnd * 2) ActiveCell.Cells(cadena, unidad) = aleatorio Next unidad Next cadena 'Suma de los volúmenes de las unidades raleunidad = Sheets("Aleunidad").Range("A1").CurrentRegion.Rows.Count caleunidad = Sheets("Aleunidad").Range("A1").CurrentRegion.Columns.Count For renglonal = 1 To raleunidad For columnaal = 1 To caleunidad unidad1 = Sheets("Aleunidad").Cells(renglonal, columnaal).Value If unidad1 = 1 Then volumen = Sheets("Unidad").Cells(columnaal + 2, 3).Value

sumavolumen = sumavolumen + volumen End If Next columnaal Sheets("Aleunidad").Cells(renglonal, caleunidad + 1).Value = sumavolumen sumavolumen = 0 Next renglonal raleunidad = Sheets("Aleunidad").Range("A1").CurrentRegion.Rows.Count runidad = Sheets("Unidad").Range("A3").CurrentRegion.Rows.Count - 2 subruta = Sheets("Datos").Cells(1, 100).Value 'Suma de los volúmenes de los clientes For renglonal = 1 To raleunidad numerocliente = Sheets("Proc").Range("E1").CurrentRegion.Rows.Count For cliente = 1 To numerocliente clientevisitado = Sheets("h").Cells(subruta, cliente).Value volumencliente = Sheets("Proc").Cells(cliente, 7).Value If clientevisitado = 1 Then sumavolumencliente = sumavolumencliente + volumencliente Sheets("Aleunidad").Cells(renglonal, runidad + 2).Value = sumavolumencliente End If Next cliente sumavolumencliente = 0 Next renglonal 'Resta de volúmenes unidades y clientes For renglonal1 = 1 To raleunidad volumenunidades = Sheets("Aleunidad").Cells(renglonal1, runidad + 1).Value volumenclientes = Sheets("Aleunidad").Cells(renglonal1, runidad + 2).Value capacidadlibre = volumenunidades - volumenclientes Sheets("Aleunidad").Cells(renglonal1, runidad + 3).Value = capacidadlibre Sheets("Aleunidad").Cells(renglonal1, runidad + 4).Value = capacidadlibre Next renglonal1 'Eliminando las cadenas donde no se puede satisfacer la demanda de los clientes For renglonal2 = 1 To raleunidad capacidadinsuficiente = Sheets("Aleunidad").Cells(renglonal2, runidad + 4).Value If capacidadinsuficiente <= 0 Then Sheets("Aleunidad").Cells(renglonal2, runidad + 4).Value = 100000 End If Next renglonal2 'Obteniendo la cadena con una menor capacidad libre For renglonal3 = 1 To raleunidad capacidadlibre = Sheets("Aleunidad").Cells(renglonal3, runidad + 4).Value

capacidadlibre1 = Sheets("Aleunidad").Cells(renglonal3 + 1, runidad + 4).Value If capacidadlibre > capacidadlibre1 Then Sheets("Aleunidad").Cells(renglonal3 + 1, runidad + 4).Value = capacidadlibre1 Else Sheets("Aleunidad").Cells(renglonal3 + 1, runidad + 4).Value = capacidadlibre End If Next renglonal3 'Calculo de costos y tiempos por cada unidad rproceso1 = Sheets("Proceso1").Range("A1").CurrentRegion.Rows.Count cproceso1 = Sheets("Proceso1").Range("GU1").CurrentRegion.Columns.Count + 199 runidad1 = Sheets("Unidad").Range("A2").CurrentRegion.Rows.Count raleunidad = Sheets("Aleunidad").Range("A1").CurrentRegion.Rows.Count rproceso12 = Sheets("Proceso1").Range("A2").CurrentRegion.Rows.Count cproceso12 = Sheets("Proceso1").Range("A2").CurrentRegion.Columns.Count csigconexiones = Sheets("Sigconexiones").Range("A2").CurrentRegion.Columns.Count - 4 columna = cproceso12 - csigconexiones For renglonal = 1 To raleunidad For renglonu = 1 To runidad1 unidad = Sheets("Aleunidad").Cells(renglonal, renglonu).Value If unidad = 1 Then tipounidad = Sheets("Unidad").Cells(renglonu + 2, 2).Value For columnapr = 203 To cproceso1 tipounidad1 = Sheets("Proceso1").Cells(1, columnapr).Value tipounidad2 = Sheets("Proceso1").Cells(2, columnapr - 202 + columna).Value If tipounidad1 = tipounidad And tipounidad2 = tipounidad Then rproc = Sheets("Proc").Range("E1").CurrentRegion.Rows.Count - 2 For renglonp = 1 To rproc conexion = Sheets("Proc").Cells(renglonp, 5).Value cliente = Sheets("h").Cells(subruta, renglonp).Value If cliente = 1 Then For renglonpr = 3 To rproceso1 rutaseleccionada = Sheets("Proceso1").Cells(renglonpr, 201).Value If rutaseleccionada = 5 Then conexionseleccionada = Sheets("Proceso1").Cells(renglonpr, 3).Value If conexionseleccionada = conexion Then tiempos = Sheets("Proceso1").Cells(renglonpr, columnapr).Value costo = Sheets("Proceso1").Cells(renglonpr, columnapr - 202 + columna).Value sumatiempos = sumatiempos + tiempos sumacosto = sumacosto + costo Sheets("Aleunidad").Cells(renglonal, runidad + 5).Value = sumatiempos Sheets("Aleunidad").Cells(renglonal, runidad + 6).Value = sumacosto End If End If Next renglonpr

End If Next renglonp End If Next columnapr End If Next renglonu sumatiempos = 0 sumacosto = 0 Next renglonal 'Selección del vehículo rproc = Sheets("Proc").Range("E1").CurrentRegion.Rows.Count - 1 raleunidad = Sheets("Aleunidad").Range("A1").CurrentRegion.Rows.Count For renglonall = 1 To raleunidad capacidadlibre = Sheets("Aleunidad").Cells(raleunidad, runidad + 4).Value If capacidadlibre = Sheets("Aleunidad").Cells(renglonall, runidad + 3).Value Then Sheets("h").Cells(subruta, rproc + 1).Value = Sheets("Aleunidad").Cells(renglonall, runidad + 5) Sheets("h").Cells(subruta, rproc + 2).Value = Sheets("Aleunidad").Cells(renglonall, runidad + 6) runid = Sheets("Unidad").Range("A1").CurrentRegion.Rows.Count - 2 For renglonun = 1 To runid Sheets("h").Cells(subruta, renglonun + 100).Value = Sheets("Aleunidad").Cells(renglonall, renglonun) Next renglonun End If Next renglonall Suma_ahorros_distancias End Sub Sub Suma_ahorros_distancias() 'Se calcula la suma de los ahorros de distancias por cada cliente insertado Application.ScreenUpdating = False cliente = Sheets("Proc").Range("E1").CurrentRegion.Rows.Count - 2 ch = Sheets("h").Range("A1").CurrentRegion.Columns.Count rproceso1 = Sheets("Proceso1").Range("A2").CurrentRegion.Rows.Count cproceso1 = Sheets("Proceso1").Range("A2").CurrentRegion.Columns.Count csigconexiones = Sheets("Sigconexiones").Range("A2").CurrentRegion.Columns.Count - 4 columna = cproceso1 - csigconexiones subruta = Sheets("Datos").Cells(1, 100).Value For renglonpr = 3 To rproceso1 rproceso12 = Sheets("Proc").Range("E2").CurrentRegion.Rows.Count - 3 For renglonpr1 = 1 To rproceso12 client = Sheets("h").Cells(subruta, renglonpr1).Value conexion = Sheets("Proc").Cells(renglonpr1, 5).Value conexion1 = Sheets("Proc").Cells(renglonpr1 + 1, 5).Value

If client <> 1 Then Else seleccion = Sheets("Proceso1").Cells(renglonpr, 201).Value If seleccion = 5 Then If Sheets("Proceso1").Cells(renglonpr, 3).Value = conexion Then ahorrodistancias = Sheets("Proceso1").Cells(renglonpr, columna).Value sumaahorrodistancias = sumaahorrodistancias + ahorrodistancias End If End If End If Next renglonpr1 Next renglonpr Sheets("h").Cells(subruta, cliente + 4).Value = sumaahorrodistancias Suma_criterio_ventana_tiempo End Sub Sub Suma_criterio_ventana_tiempo() 'Se calcula la suma del criterio de las ventanas de tiempo por cada cliente insertado Application.ScreenUpdating = False cliente = Sheets("Proc").Range("E1").CurrentRegion.Rows.Count - 2 rproceso1 = Sheets("Proceso1").Range("A2").CurrentRegion.Rows.Count cproceso1 = Sheets("Proceso1").Range("A2").CurrentRegion.Columns.Count csigconexiones = Sheets("Sigconexiones").Range("A2").CurrentRegion.Columns.Count - 4 columna = cproceso1 - (csigconexiones * 2) subruta = Sheets("Datos").Cells(1, 100).Value For colum = columna To (columna + csigconexiones - 1) For renglonpr = 3 To rproceso1 client = Sheets("Proc").Range("E2").CurrentRegion.Rows.Count - 3 For renglonclient = 1 To client clien = Sheets("h").Cells(subruta, renglonclient).Value clien1 = Sheets("Proc").Cells(renglonclient, 5).Value If clien <> 1 Then Else seleccion = Sheets("Proceso1").Cells(renglonpr, 201).Value If seleccion = 5 Then If Sheets("Proceso1").Cells(renglonpr, 3).Value = clien1 Then tiempo = Sheets("Proceso1").Cells(renglonpr, colum).Value sumatiempo = sumatiempo + tiempo horaarribo = sumatiempo + 8 If horaarribo > Sheets("Proc").Cells(renglonclient, 8).Value And horaarribo < Sheets("Proc").Cells(renglonclient, 9).Value Then horaarribo1 = Sheets("Proc").Cells(renglonclient, 9).Value - horaarribo

If horaarribo1 < 0 Then sumahoraarribo = sumahoraarribo + horaarribo1 End If End If End If End If End If Next renglonclient Next renglonpr Next colum Sheets("h").Cells(subruta, cliente + 5).Value = sumahoraarribo End Sub Sub Resultados() 'Se despliegan los resultados 'Se realizan las sumas de los cuatro criterios rproc = Sheets("Proc").Range("E1").CurrentRegion.Rows.Count - 2 rh = Sheets("h").Range("A1").CurrentRegion.Rows.Count For renglonh = 1 To rh costo = Sheets("h").Cells(renglonh, rproc + 2).Value tiempo = Sheets("h").Cells(renglonh, rproc + 3).Value distancia = Sheets("h").Cells(renglonh, rproc + 4).Value ventanas = Sheets("h").Cells(renglonh, rproc + 5).Value Sheets("h").Cells(renglonh, rproc + 6).Value = costo + tiempo + distancia + ventanas Next renglonh 'Se suman los criterios de cada una de las subrutas de cada ruta. rdatos = Sheets("Datos").Range("A3").CurrentRegion.Rows.Count For renglond = 3 To rdatos If Sheets("Datos").Cells(renglond, 5).Value = Sheets("Calendario").Range("F3").Value Then temp = temp + 1 End If Next renglond n = temp rh1 = Sheets("h").Range("A1").CurrentRegion.Rows.Count rproc1 = Sheets("Proc").Range("E1").CurrentRegion.Rows.Count - 2 contador = 0 resultado = 0 sumaresultados = 0 numeroruta = 1 For renglonrh1 = 1 To rh1 For renglonp1 = 1 To rproc1 If Sheets("h").Cells(renglonrh1, renglonp1).Value = 1 Then contador = contador + 1

End If Next renglonp1 resultado = Sheets("h").Cells(renglonrh1, rproc1 + 6).Value sumaresultados = sumaresultados + resultado contador = contador - 1 Sheets("h").Cells(renglonrh1, rproc1 + 9).Value = numeroruta If contador = n Then Sheets("h").Cells(renglonrh1, rproc1 + 7).Value = sumaresultados Sheets("h").Cells(renglonrh1, rproc1 + 8).Value = sumaresultados numeroruta = numeroruta + 1 contador = 0 sumaresultados = 0 resultado = 0 End If Next renglonrh1 'Se elige la mejor ruta rh2 = Sheets("h").Range("A1").CurrentRegion.Rows.Count rproc2 = Sheets("Proc").Range("E1").CurrentRegion.Rows.Count - 2 For renglonh2 = 1 To rh2 resul = Sheets("h").Cells(renglonh2, rproc2 + 8).Value resul1 = Sheets("h").Cells(renglonh2 + 1, rproc2 + 8).Value If resul > resul1 Then Sheets("h").Cells(renglonh2 + 1, rproc2 + 8).Value = resul Else Sheets("h").Cells(renglonh2 + 1, rproc2 + 8).Value = resul1 End If Next renglonh2 rproc3 = Sheets("Proc").Range("E1").CurrentRegion.Rows.Count - 2 runidad = Sheets("Unidad").Range("A1").CurrentRegion.Rows.Count - 2 rh3 = Sheets("h").Range("A1").CurrentRegion.Rows.Count For renglonrh3 = 1 To rh3 Result = Sheets("h").Cells(renglonrh3, rproc3 + 7).Value mejorresultado = Sheets("h").Cells(rh3, rproc3 + 8).Value If Result = mejorresultado Then rh4 = Sheets("h").Range("A2").CurrentRegion.Rows.Count For renglonrh4 = 1 To rh4 If Sheets("h").Cells(renglonrh4, rproc3 + 9).Value = Sheets("h").Cells(renglonrh3, rproc3 + 9).Value Then rresultados = Sheets("Resultados").Range("A1").CurrentRegion.Rows.Count For columna = 1 To rproc3 + 7 Sheets("Resultados").Cells(rresultados + 1, columna).Value = Sheets("h").Cells(renglonrh4, columna).Value Next columna For columna1 = 1 To runidad Sheets("Resultados").Cells(rresultados + 1, columna1 + 50).Value = Sheets("h").Cells(renglonrh4, columna1 + 100).Value Next columna1

End If Next renglonrh4 End If Next renglonrh3 End Sub