Professional Documents
Culture Documents
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
EvaluarMejoresCentros
Ordenarcentros
ElegirMejorescentros
OrdenarCentrosElegidos
OrdenDemanaClientes
SeleccionClienteCentro
End Sub
FUNCTION
EvaluarFO
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
CostoFinalUsoBarcos = 0
For i = 1 To NumBarcos
SUB LeerDatos
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 mira cual es la
capacidad de cada
centro (esta sale en
excel como
CAPACIDADCENTR
OS
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
No
No cambiar el orden
de los centros
Si
Intercambiar orden
de los centros
End Sub
Ir al siguiente centro
SUB LlenarDatos
Se va a llenar la
estructura de
InfoBarcos con los
siguientes datos
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
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.
No
TotalDemandaClientes>SumaCapacidad?
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
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
SI
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
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
CostoGaso(i) en la
estructura
ORDEN<CostoGaso(i+
1) en la
estructuraORDEN?
Si
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
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
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
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
For i = 1 To NumClientes
For j = 1 To NumClientes
End If
Next i
Next j
End Sub
Sub CambiarSolucionVigente
temporal = DatosCliente.CentroQueSupleCliente(posMejor1)
DatosCliente.CentroQueSupleCliente(posMejor1) =
DatosCliente.CentroQueSupleCliente(posMejor2)
DatosCliente.CentroQueSupleCliente(posMejor2) = temporal
For i = 1 To NumCentrosElegidos
No
Si
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)
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
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
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
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
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
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
For i = 1 To b
For j = 1 To c
Next j
Next i
PromedioMatriz = suma / (b * c)
End Function
Function Suma
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