You are on page 1of 25

Inicio

SUB
ProgramaPrincipal

SUB SolucionInicial

FUNCTION
EvaluarFO

SUB LeerDatos

SUB LlenarDatos

SUB
EvaluarMejoresCent
ros

SUB
OrdenarCentros

SUB
ElegirMejoresCentr
os

SUB
OrdenarCentrosEleg
idos

SUB
OrdenDemandaClie
ntes

SUB
SeleccionClienteCen
tro

SUB
RellenarDatosCentr
osElegidos

Sub
ReparticionBarcosy
Gasoductos

SUB
LlenarMatricesFinal
es

SUB
LlenarMatrizDeltaF

FUNCTION
EvaluarCambio

SUB
ElegirMejorCambio

SUB
ElegirMejorCambio
NoTabu

SUB
ActualizarListaTabu

SUB
CambiarSolucionVig
ente

SUB Imprimir

FUNCTION
Promedio

FUNCTION
PromedioMatriz

FUNCTION suma

Fin

Sub
ProgramaPrincipal

Fbest= Valor de la
FO inicial

bestcentros= centro
elegido

bestClientes=
DatosCliente

NO
Fbest cambio?

SI
bestCentros=
CentrosElegidos
bestClientes=Datos
Clientes

La suma del
DeltaF.DiferenciaFO
y EvaluarFO fue < a
la Fbest

Fbest=EvaluarFO

FO_Final=
EvaluarFO_Final

Iteraciones sin
mejorar=0

bestCentros y
bestClientes No
Cambian

Se aumenta una
iteracin sin
mejorar la Fbest

No
Elige el mejor
cambio

El cambio es
tabu?

Si

Elegir la siguiente
opcin en la lista
DeltaF

Actualiza la lista
tabu

Cambia la solucin
Vigente pero no la
Fbest

SUB SolucionInicial

Llama a los siguientes


Sub Programas

EvaluarMejoresCentros

Ordenarcentros

ElegirMejorescentros

OrdenarCentrosElegidos

OrdenDemanaClientes

SeleccionClienteCentro

End Sub

FUNCTION
EvaluarFO

Va a llamar a los siguientes sub


programas:
-ReparticionBarcosyGasoductos
-llenarMatricesFinales
-RellenarDatosCentrosElegidos

Va a calcular los costos totales

CostoFinalCentroaCliente = 0
For i = 1 To NumClientes
For j = 1 To NumCentros
CostoFinalCentroaCliente=
CostoFinalCentroaCliente+ BinariaCentroCliente(i, j)
* CostoCentroCliente(i, j)
Next i
Next j
CostoFinalConstruccionCentro = 0
For i = 1 To NumCentros
CostoFinalConstruccionCentro = CostoFinalConstruccionCentro +
VectorBinSiSeConstruyeCentro(i) * CostoConstruccionCentro(i)
Next i
CostoFinalGasoducto = 0
For i = 1 To NumCentros

CostoFinalGasoducto = CostoFinalGasoducto + VectorCantidadGasoductoCentro(i) * CostoGasoducto(i)


Next i

CostoFinalUsoBarcos = 0
For i = 1 To NumBarcos

CostoFinalUsoBarcos = CostoFinalUsoBarcos + VectorSiUsoBarco(i) * CostoBarcos(i)


Next i
End Function

SUB LeerDatos

NumClientes= la casilla de excel


llamadaNUMEROCLIENTES
(nos dice cuantos clientes tiene
el programa, en este caso 30).

NumCentros= la casilla de
excel
llamadaNUMEROCENTROS
(nos dice cuantos centros
tiene el programa, en este
caso 100

NumBarcos= la casilla
de excel
llamadaNUMEROBARC
OS (nos dice cuantos
barcos tiene el
programa, en este caso
10

tamanoTabu= la
casilla de excel
llamadaTAMAOT
ABU (nos dice que
tamao va a tener
nuetro Tabu

maxIteraciones= la casilla de
excel
llamadaNUMITERACIONES
(nos dice cuantas iteraciones
se van a hacer maximo para
terminar el programa

Se mira cual es la
capacidad de cada barco
(esta sale en excel como
CAPACIDADBARCOS

Se mira cual es
costo de cada barco
(esta sale en excel
como
COSTOBARCO

Se mira cual es la
demanda de cada cliente
(esta sale en excel como
DEMANDACLIENTES

Se miran los costos de


envio del centro i al
cliente j (esta sale en
excel como
COSTOCENTROCLIENTE

Se mira cual es la
capacidad de cada
centro (esta sale en
excel como
CAPACIDADCENTR
OS

Se mira cual es el costo


de construir cada centro
(esto sale en excel como
COSTOCONSTRUCCION

Se mira cual es el esl


costo del gasoducto
para cada centro (esto
sale en excel como
COSTOGASODUCTO

La demanda total de
los clientes= la suma
de la demanda de
cada uno de los
clientes. Desde i=1
hasta NumClientes.

END SUB

SUB
OrdenarCentros

Ordenar centros de
menor a mayor
precio

El costo del centro (i) es


> al costo en el centro
(i+1)?

No

No cambiar el orden
de los centros

Si

Intercambiar orden
de los centros

Recorrio todos los


centros? Desde i=1
to NumCentros?

End Sub

Ir al siguiente centro

SUB LlenarDatos

Se va a llenar la
estructura de
InfoBarcos con los
siguientes datos

Capacidad del barco


desde i=1 hasta
NumBarcos

Costo del Barco


desde i=1 hasta
Numbarcos

Proporcin de cada
barco= costo de cada
barco/ capacidad de cada
barco

NumBarcos= i
(cantidad de barcos
que esten en el
excel inicialmente).

Llenar la estructura
TipoDelta

La diferencia de la
FO

La Factibilidad que
tiene

END SUB

SUB EvaluarMejoresCentros

Va a tomar los datos


necesarios de cada
uno de los centros
para elegir los
mejores

SumaCostoCentroCliente
=Se suman todos los
costos de envi a todos
los clientes para cada
centro

ProporcionDemandaCentroCliente
(NumCentros)=Suma de las
demandas de todos los clientes/
capacidad de cada uno de los
centros

ProporcionConstruccion
Capacidad= cuanto
construye cada centro/
su capacidad

Llenar de la
estructura ORDEN
el costo total de
usar el centro
incluyendo el costo
del gasoducto.

Llenar de la
estructura ORDEN
el numero del
centro. Pone el
centro segn la
posicin en donde
va.
Llena el vector de
capacidad en la
estructura ORDEN
para cada uno de
los centros.

END SUB

SUB
ElegirMejoresCentr
os

Se elige cuantos
centros se necesitan
mnimo para poder
suplir la demanda
de los clientes.

Sumar todas las


capacidades de los
centros hasta que
supere el total de la
demanda de los
clientes

No
TotalDemandaClientes>SumaCapacidad?

Sumar otro centro


al total de centros
necesarios para
suplir la demanda.

Si

NumeroCentrosEleg
idos= i+1 (i indica
cuantos centros se
necesitaban para
suplir la demanda)

Llenar las
caracterisitcas de la
funcion ORDEN
pero ahora
unicamente con los
centros elegidos,
esta variable se va a
llamar centros
elegidos

Desde i =1 to
NumcentrosElegidos

Los centros estar


ordenados de menor
a mayor con respecto
al costo total?

Elegir los primeros 7


centros con sus
respectivas
caracteristicas
(costo, capacidad,
etc).

END SUB

Ordenarlos

SUB
OrdenarCentrosElegidos

Ordenar centros
elegidos de menor a
mayor por costo de
envio al cliente.

SumCostoCentroClient
e(i)>SumCostoCentroCli
ente(i+1)?

no

No intercambiar los
centros elegidos

si

Intercambiar
centros elegidos

Recorrio todos los


centros? Desde i=1 to
NumCentrosElegidos?

SI

intercambiar todos los


datos del penltimo
centro elegido
(NumCentroElegido-1)
con los del primer
centro elegido (1)

END SUB

No
Ir al siguiente
centroelegido

SUB
OrdenDemandaClientes

Ordenar demanda
de todos los clientes
de mayor a menor.

Llenar la estructura
InfoCliente con las
sigueintes
caracteristicas

Desde i=1 to
NumClientes

BinClientesElegido(i)
=False (Todos los
clientes inicialmente
empiezan en False
para indicar que aun
no se le ha asignado
ningn centro.

NumeroDelCentro(i)
en la estructura =i

DemCLiente(i) en la
estructura=
DemandaCliete(i)

Next i

No
DemCliente(i)<Dem
Cliente(i+1)?

Si
Intercambiar el
orden de los
clientes segn su
demanda (de mayor
a menor demanda).

END SUB

No intercambiar el
orden de los
clientes.

SUB SeleccionClienteCentro

Se seleccionan que
clientes vana a ser
suplidos por cuales
centros.

Desde i=1 to
NumCentrosElegido

CapacidadALlevar(i)
e la estructura
ORDEN=0

Desde j=1 to
NumClientes

DemCliente(j) en la estructura INFO


CLIENTE<=CapacidadDelCentro(i) en la
estructura ORDEN-CapacidadALlevar(i)
en la estructura ORDEN?

BinClienteElegido(j)
en la estructura
INFOCLIETNE=False?

BInClienteElegido(j)
en la estructura
INFO
CLIENTE=True

CentroQueSupleCliente(j)
en la estructura INFO
CLIENTE=NumeroDelCentr
o(i) de la estructura
ORDEN

CapacidadALlevar(i) de
la estructura
Orden=CapacidadALle
var(i) en la estructura
de Orden +
DemCliente(j) en la
estructura de
InfoCliente

Next j

Next i

END SUB

No se asigna ese
cliente a ese centro

SUB
RellenarDatosCentr
osElegidos

Desde i=1 to
NumCentrosElegidos-1

Ordenar los centros


elegidos por costo
de gasoducto de
mayor a menor

CostoGaso(i) en la
estructura
ORDEN<CostoGaso(i+
1) en la
estructuraORDEN?

Si

Intercambiar los centros


con todas sus
caracteristicas
(CapacidadALlevar,
CostoGaso,CapacidadDe
lCentro,
NumerodelCentro,
SumCostoCentroCliente

Next i

End Sub

No

No intercambiar los
centros y sus
caracteristicas

Sub
ReparticionBarcosy
Gasoductos

For i=1 To
NumBarcos-1

La proporcion(i) de la
estructuraInfoBarco>
Proporcion(i+1) en la
estructura InfoBarco?

NO

No cambiar la
posicion del la
proporcion del
barco (i)

Si

Ordenar los barcos de


menor a mayor
proporcion con todas
sus caracteristicas
(CostoBarco,
CapBarco,NumBarco).

Next i

For i=1 To
NumBarcos

VectorSiUsoBarco=0

Next i

For i=1 To
NumBarcos

FaltaEnviarBarco(i)=
CapBarco(i) de la
estructura
InfoBarco

Next i

For j=1 To
NumCentrosElegidos

CapacidadDisponible(j)=
CapacidadALlegar(j) de
la estructura ORDEN

Next j

For j=1 To
NUmBarcos

VectorSiUsoBarco(j)=0

Next j

For i=1 To
NumBarcos

For j=1 To
NumCentrosElegidos

FaltaEnviarBarc
o(i)>0?

Proporcion(i) en la
estructura
InfoBarco<CostoGaso(j
) en la estructura
ORDEN?

CapacidadDisponible(j)
<FaltaEnviarBarco(i)?

MatrizBarcocentros(
i,j)=CapacidadDispo
nible(j)

FaltaEnviarBarco(i)=
FaltaEnviarBarco(i)CapacidadDisponibl
e(j)

CapacidadDisponible(j)>=Falta
EnviarBarco(i)

MatrizBarcoCentros
(i,j)=FaltaEnviarBarc
o(i)

CapacidadDisponibl
e(j)=CapacidadDispo
nible(j)FaltaEnviarBarco(i)

FatlaEnviarBarco(i)=
0

CapacidadDisponible(j)=0

VectorSiUsoBarco(NumBarc
o(i) de la
estructuraINFOBARCO)=1
VectorSiUsoBarco(NumBarc
o(i) de la
estructuraINFOBARCO)=1
Next j

Next j

Next i
Next i

END SUB

END SUB

Sub ElegirMejorCambio

Va a buscar que cambio entre las distintas


posibles combinaciones beneficia mas la
funcin objetivo

Se declara una variable llamada


deltaFmenor=100000

For i = 1 To NumClientes
For j = 1 To NumClientes
Va a evaluar dos cosas:
If If deltaF.DiferenciaFO(i, j) < deltaFmenor And
deltaF.Factibilidad(i, j) = True

deltaFmenor = deltaF.DiferenciaFO(i, j)

End If

Next j
Next i

End Sub

Sub ElegirMejorCambioNoTabu

Va a buscar que cambio entre las distintas


posibles combinaciones beneficia mas la
funcin objetivo y verificar que esa opcin no
se encuentre en la lista tab

Se declara una variable llamada


deltaFmenor=100000
For i = 1 To NumClientes
For j = 1 To NumClientes
Va a evaluar dos cosas:
If If deltaF.DiferenciaFO(i, j) < deltaFmenor And
deltaF.Factibilidad(i, j) = True And matrizTabu(i, j) = 0
Then

No va a elegir
esta opcion

si

Esta opcin se
encuentra en la
lista tab?

no
deltaFmenor = deltaF.DiferenciaFO(i, j)

End If

Next j
Next i
End Sub

Sub ActualizarListaTabu

Tiene que hacer dos cosas:


1)Restar 1 a las iteraciones que faltan para los cambios
que estn en la lista tab
2) Poner el cambio de ciudades posMejor1 y posMejor2
en la matriz tab

For i = 1 To NumClientes
For j = 1 To NumClientes

If matrizTabu(i, j) > 0 Entonces


matrizTabu(i, j) = matrizTabu(i, j) - 1

End If

Next i
Next j

matrizTabu(posMejor1, posMejor2) = tamanoTabu


matrizTabu(posMejor1, posMejor2) = tamanoTabu

End Sub

Sub CambiarSolucionVigente

Cambia las posiciones de los centros que suplen a


los clientes

temporal = DatosCliente.CentroQueSupleCliente(posMejor1)
DatosCliente.CentroQueSupleCliente(posMejor1) =
DatosCliente.CentroQueSupleCliente(posMejor2)
DatosCliente.CentroQueSupleCliente(posMejor2) = temporal

Busca la posicion de los centros que cambio en la variable


CentrosElegidos y tambien cambia la capacidad a llevar a ese centro

For i = 1 To NumCentrosElegidos

No

El numero del centro


elegido en la posicin i
es igual al Centro que
suple a ese cliente?

Si

Cambia las cantidades que


van a enviar cada centro
segn la demanda del cliente
en la nueva posicin

End If

End Sub

SUB imprimir

Imprimri en excel el
promedio de
(CapacidadBarco(),N
umBarcos)

Imprimir en excel el
Promedio(CostoBar
co(),NumBarcos)

Imprimir en excel el
Promedio(Demanda
Cliente](),,NumCliet
ne)

Imprimir en excel el
Promedio(Capacida
dCentro(),NumCentr
os)

Imprimir en excel el
promedio(CostoCon
struccionCentro(),N
umcentros)

Imprimir en excel el
promedio(CostoGas
oducto(),NumCentr
os)

Imprimir en excel el
PromedioMatriz(Costo
centroCliente(),NumCl
iente,Numcentros)

Imprimir en excel la
MatrizFinalcentroCli
ente()

Imprimir en excel la
MatrizBarcoCentros
Final()

Imprimir en excel el
VectorCantidadGAs
oductocentro()

Imprimir en excel el
Fbest

END SUB

FUNCTION
EvaluarCambio

FO=EvaluarFO(Dato
sClientes,CentroEleg
idos)

Llenar las variables


temporales con los
datos de las
variables de la
solucion factible

For i=1 To
NumClientes

CentroQueSupleCliente(i)
(variable temporal para la
estructura infocliente)=
CentoQueSupleCliente(i)
para la estructura
infocliente

DemCliente(i) (variable
temporal de la estructura
de infocliente=
CentroQueSupleCliente(i)
de la estructura de
infocliente

NumeroDelCliente(i)
(variable temporal de la
estructura
infocliente)=
NUmeroDelCliente(i) en
la estructura
infocliente

Next i

For i=1 To
NumCentrosElegidos

CapacidadALlevar(i)(var
iable temporal en la
estrucuraORDEN)=
CapacidadALlevar(i) en
la estructuraORDEN

CostoGaso(i) (variable
temporal en la estructura
2ORDEN)=CostoGaso(i)(de la
estructuraORDEN)

NumeroDelCentro(i)
(variable temporal
en la estructura
ORDEN)=Numero
DelCentro(i) en la
estructura ORDEN

Next i

Cambiar los centros


en la variable
temporal de los
clientes

CentroQueSupleCliente
(posI)(en la variable
temporal de la
estructura
INFOCLIENTE=
CentroQueSupleCliente
(posJ)(en la estructura
INFOCLIENTE)

CentroQueSupleCliente
(posj)(en la variable
temporal de la
estructura
INFOCLIENTE=
CentroQueSupleCliente
(posI)(en la estructura
INFOCLIENTE)

Evaluar factibilidad
y Llenar el vector de
capacidad a llenar
en la variable
temporal

For i=1 To
NumcentrosElegido
s

NumeroDelCentro(i)
en la variable temporal=
CentroQueSupleCliente(
posI)?

NO
Next i

Si

CapacidadALlevar(i)
=CapacidadALlevar(i
)DemCliente(posJ)+D
emCliente(posI)

CapacidadALlevar(i)(en la
variable temporal de la
estructura
ORDEN>CapacidadDelCent
ro(i)(de la estructura
ORDEN)

NO

Fact1=1 (esto quiere


decir que la
factibilidad de este
cambio de posicin
es se puede hacer)

Si

Factibilidad(posI,po
sJ) de la estructura
TipoDelta=False

NumeroDelCentro(i)
en la variable temporal=
CentroQueSupleCliente(
posJ)?

NO
Next i

Si

CapacidadALlevar(i)
=CapacidadALlevar(i
)DemCliente(posI)+D
emCliente(posJ)

CapacidadALlevar(i)(en la
variable temporal de la
estructura
ORDEN>CapacidadDelCent
ro(i)(de la estructura
ORDEN)

NO

Fact2=1 (esto quiere


decir que la
factibilidad de este
cambio de posicin
es se puede hacer)

Si

Factibilidad(posI,posJ) de
la estructura
TipoDelta=False

Next i

Fact 1+ Fact
2=2?

NO

No va a haber
factibilidad en el
cambio de las
posiciones(no se
podra ahcer ese
cambio)

Si

NO
posI= posJ?

No va a haber
factibilidad en el
cambio de las
posiciones(no se
podra ahcer ese
cambio)

Si

Va a haber
factibilidad en el
cambio de las
posiciones (se
puede hacer ese
cambio)

Evaluar la diferencia
DeltaF

NO
Factibilidad(pos
I,posJ)= True?
SI

Se pone el valor del cambio


EvaluarCambio=EvaluarFO(
ClientecambioTemporal,Ce
ntroCambioTemporal)- FO

END FUNCTION

EvaluarCambio=9999 (un
numero muy grande para
que este cambio no lo
vaya a escoger)

SUB
LlenarMatrizDeltaF

Llenar la matriz
DeltaF con las
diferencias en las
FO para cada
cambio de
posiciones

Generar todos los


cambios posibles de
acuerdo a la
solucion factible

For posI= 1 To
NUmClientes

For posJ=1 To
NumClientes

deltaF.DiferenciaFO(
posI,posJ)=
EvaluarCambio(Dato
Clientes,CentroElegi
dos,posI,posJ)

Next pos J

Next posI

END SUB

SUB
LlenarMatricesFinales

Llenar Gasoducto

For j=1 To
NumCentros

VectorCantidadGAs
oductoCentro(j)=0

VectorBinSiSeConstr
uyeCentro(j)=0

Next j

For i=1 To
NumCentrosElegido
s

For j=1 To
NumCentros

NumeroDelCentro(i)en la
estructura ORDEN=j?

NO
Next j

Si
Next i
VectosCantidadGas
oductoCentro(j)=Ca
pacidadDisponible(i)

CapacidadDisponibl
e(i)=0

VectorBinSiSeConstr
uyeCentro(j)=1

Next j

Next i

Llenar Matrices
Cantidades de
Barcos a Centros

For i=1 To
NumBarcos

For j=1 To
NumCentros

MatrizBarcoCentros
Final(i,j)=0

Next j

Next i

For i=1 To
NumBarcos

For j=1 To
NumCentrosElegidos

MatrizBarcoCentrosFinal
(NumBarco(i) de la
estructuraINFOBARCO
, NumeroDelCentro(j)en
la estructura ORDEN)=
MatrizBarcoCentros(i,j)

Next j

Next i

Llenar Matrices
centro cliente

For i=1 To
NumClientes

For j=1 To
NumClientes

BinariaCentroClient
e(i,j)=0

Next j

Next i

For i=1 To
NumClientes

MatrizFinalCentroCliente(NumeroClient
e(i) de la estructura de INFOCLIENTE,
CentroQueSupleCliente(i) para la
estructura de ORDEN=DemCliente(i)
de la estructura ORDEN

BinariaCentroCliente(Num
eroDelCliente(i) de la
estructuraINFOCLIENTE,
CentroQueSupleCliente(i)
de la estructura
ORDEN)=1

Next i

END SUB

Function PromedioMatriz

Va a recibir como parmetros tres datos:


-Un vector denominado a
-Un numero entero denominado b
-Un numero entero denominado c
Y va a realizar dos cosas: sumar y sacar un
promedio
suma = 0

For i = 1 To b
For j = 1 To c

suma = suma + a(i, j)

Next j
Next i

PromedioMatriz = suma / (b * c)

End Function

Function Suma

Suma tiene variables( a()


as double y b() as
integer) es double

Suma=0

i=1 To b

Suma=suma+a(i)

Next i

END FUNCTION

Fuction Promedio

Promedio(a() As
double, b As integer)
As double

Suma= 0

For i=1 to b

Suma=suma+ a(i)

Next i

Promedio=suma/b

END FUNCTION

You might also like