Professional Documents
Culture Documents
Final Project
Final Project
Para resolver el problema se establece una cantidad de clientes en y una cantidad de depósitos en
. Sus localizaciones en el espacio se determinan con la función random. Por otro lado, también se define
con la función random la tasa anual de viajes de entrega por cliente.
El problema es lineal ya que y son conocidos y fijos tratandose de las localizaciones en el espacio tanto
de clientes como de los depósitos. De esta forma la cantidad será para cada para un
valor fijo y conocido. Así que, lo que se pretende encontrar es la cantidad de viajes desde cada depósito hasta
cada cliente, considerando que se satisfagan la tasa de viajes anual por cada cliente con menor costo, que a su
vez depende de la distancia entre dichos depósitos y los clientes.
Inicialmente, se plantea el uso de linprog como algoritmo de optimización, dado que el problema es lineal de la
forma con límites inferiores. Entonces se tiene:
1
donde corresponde a la matriz de restricciones del problema, el vector t corresponde a la reorganización de
la matriz .
clear all;
close all;
%------------------ PROBLEM CONDITIONS ------------------%
scatter(cj(:,1),cj(:,2)); hold on
scatter(xi(:,1),xi(:,2),'r')
title('Localización de clientes y depósitos')
xlabel('Coordenada x [x 100Km]')
ylabel('Coordenada y [x 100Km]')
legend('Clientes','Depósitos')
2
ObjectiveFunction = @objective;
distance = zeros(M,N);
for i = 1 : M
for j = 1 : N
distance(i,j) = ObjectiveFunction(xi(i,:),cj(j,:));
end
end
vec_distance = reshape(distance,N*M,1);
Aeq = zeros(N,N*M);
for k = 1:N
Aeq(k,(k-1)*M+1:k*M) = ones(1,M);
end
beq = dj;
lb = zeros(N*M,1);
Solución 1: linprog
A continuación, a partir de los parámetros del problema se presenta el algoritmo linprog, para el cual, se
obtiene la matriz la cual expresa cuantos viajes se hacen desde el depósito i hasta el cliente j. Para verificar
la la solución obtenida se presenta la matriz de distancias ( ) desde el depósito i hasta el cliente j.
3
distance
distance = 5×20
0.8324 0.8916 0.3314 0.6421 0.8868 0.7971 0.3731 0.2504
0.5052 0.5606 0.3963 0.3053 0.7266 0.5268 0.4101 0.5269
0.4858 0.3597 0.4473 0.2744 0.4501 0.2111 0.7255 0.6917
0.3891 0.5879 0.6717 0.3186 0.9600 0.6910 0.3311 0.7513
0.8518 0.9324 0.4039 0.6736 0.9574 0.8560 0.3239 0.2931
Por ejemplo, la distancia entre el depósito 1 y el cliente 1 es mientras que la distancia entre el
depósito 4 y el cliente 5 es .
Aquí, se han marcado las mínimas distancias existentes para cada cliente.
toc
exitflag
exitflag = 1
output
tij = reshape(solution,M,N)
tij = 5×20
0 0 10 0 0 0 0 24 26 0 27 0 0
0 0 0 0 0 0 0 0 0 0 0 38 0
0 39 0 22 16 13 0 0 0 32 0 0 18
27 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 17 0 0 0 0 0 0
A continuación se indica el vector para verificar que la sumatoria de los viajes por cada cliente desde todos
los depósitos obtenidos en la matriz . De este modo se verifica que el algortimo satisface las restricciones.
Por otro lado, la matriz indica lo siguiente: para el cliente 1 se hacen 27 viajes desde el depósito 4, porque
esta es la menor distancia que existe entre dicho cliente y todos los depósitos.
dj'
ans = 1×20
27 39 10 22 16 13 17 24 26 32 27 38 18
4
La función objetivo evaluada en la solución tiene el siguiente valor.
f_min
f_min = 149.0990
Para el problema se define la función fitness como la distancia euclideana negativa entre y .
representa a y será . Se define una condición inicial para el cual se determina la misma cantidad
de viajes desde todos los depósitos a cada uno de los clientes satisfaciendo la restricción con .
5
El algoritmo proporciona la siguiente solución para la matriz en la cual se puede apreciar un comportamiento
similar al algortimo anterior. Sin embargo, también se asignan pequeños valores de viajes para distancias
menores pero no mínimas, encontrando así una solución suboptima al problema. La solución también respeta
la restricción con .
tij1 = reshape(tij1(length(t),:),M,N)
tij1 = 5×20
0.0000 0.0002 10.1765 0.0000 0.0000 0.0000 0.7118 19.9770
0.5311 0.3728 0.0294 4.3023 0.0000 0.0000 0.1004 0.0006
1.0145 38.4282 0.0003 15.2028 16.0056 13.0000 0.0000 0.0000
25.4544 0.1987 0.0000 2.4949 0.0000 0.0000 6.5796 0.0000
0.0000 0.0001 0.0149 0.0000 0.0000 0.0000 9.6082 4.0224
sum(tij1)
ans = 1×20
27.0000 39.0000 10.2212 22.0000 16.0056 13.0000 17.0000 24.0000
distance
distance = 5×20
0.8324 0.8916 0.3314 0.6421 0.8868 0.7971 0.3731 0.2504
0.5052 0.5606 0.3963 0.3053 0.7266 0.5268 0.4101 0.5269
0.4858 0.3597 0.4473 0.2744 0.4501 0.2111 0.7255 0.6917
0.3891 0.5879 0.6717 0.3186 0.9600 0.6910 0.3311 0.7513
0.8518 0.9324 0.4039 0.6736 0.9574 0.8560 0.3239 0.2931
for i=1:M
for j=1:N
s(i,j) = tij1(i,j)*distance(i,j);
end
end
f_val2 = sum(sum(s))
f_val2 = 151.9810
Comparación
Precisión:
Por los resultados de simulación el algortimo linprog tiene un 100% de precisión mientras que para el replicador
la precisión sería del 98% ya que este último encontró una solución suboptima. Cabe aclarar que no se tuvo en
cuenta restricción de número entero de viajes.
Eficiencia:
6
El algoritmo linprog reporta un tiempo de ejecución de 1.037090 segundos tras los cuales encuentra la solución
óptima sin iteraciones. Por otro lado, el replicador toma 1000 iteraciones y 57.818369 segundos en encontrar
una solución subóptima. En este caso, el algortimo linprog es eficiente.
Robustes:
El algoritmo linprog no hace uso de condiciones iniciales predefinidas pero el replicador si, y es altamente
dependiente de ellas, ya que una mala definición de esas condiciones iniciales, por ejemplo: que no satisfagan
la restricción con , provoca que el algortimo no converga o que tome muchas más iteraciones para lograrlo.
Nuevamente, se debe mencionar que el replicador logra encontrar una solución suboptima, confirmando así
que entre los dos algoritmos quien tiene mayor robustes es linprog.
Se adjuntan al presente los códigos usados tanto del LiveScript y las funciones usadas.