Primero, esta es la tarea. Creo que está claro que hice un esfuerzo y estoy buscando sugerencias, no código.¿Qué pasa con mi solución de red neuronal de Hopfield para el problema del vendedor ambulante?
El problema es el siguiente. La ecuación de operación tiene cuatro componentes para alterar una neurona determinada.
- A) Una parte para garantizar que cada ciudad se visite como máximo una vez.
- B) Uno para asegurar que cada posición (primero, segundo, tercero, etc.) tenga como máximo una ciudad.
- C) Una parte para garantizar que el número total de neuronas activas sea igual al número de ciudades.
- D) Una parte para minimizar la distancia.
Si peso D lo suficiente como para que tenga algún efecto, la red realiza un recorrido no válido (por ejemplo, visita A, D, en ninguna parte, E, C). Sin embargo, puedo deperar D y el código encontrará soluciones, pero no las que tienen una distancia mínima.
Estaría muy agradecido por cualquier consejo, he estado golpeando mi cabeza contra el teclado por un tiempo. El código debe ser comprensible para cualquiera que esté familiarizado con la solución del TSP con una red Hopfield.
Código Das:
%parameters
n=5;
theta = .5;
u0 = 0.02;
h = .1;
limit = 2000;
%init u
u=zeros(n,n);
uinit = -u0/2*log(n-1); %p94 uINIT = - u0/2 * ln(n-1)
for i=1:n
for j=1:n
u(i,j) = uinit * (1+rand()*0.2-0.1); %add noise [-0.1*uInit 0.1*uINIT]
end
end
%loop
for index=1:limit
i = ceil(rand()*n);
k = ceil(rand()*n);
%runge kutta
k1 = h*du(u,i,k,0);
k2 = h*du(u,i,k, k1/2);
k3 = h*du(u,i,k, k2/2);
k4 = h*du(u,i,k, k3);
u(i,k) = u(i,k) + (k1 + 2*k2 + 2*k3 + k4)/6;
end
Vfinal = hardlim(V(u)-theta)
du()
function out=du(u,X,i,c)
dist = [0, 41, 45, 32, 32;
41, 0, 36, 64, 54;
45, 36, 0, 76, 32;
32, 64, 76, 0, 60;
32, 54, 32, 60, 0];
t = 1;
n = 5;
A = 10;
B = 10;
C = 10;
D = .0001;
AComp = A*sum(V(u(X,:))) - A*V(u(X,i));
BComp = B*sum(V(u(:,i))) - B*V(u(X,i));
CComp = C*(sum(sum(V(u)))-n);
DComp = 0;
before = i-1;
after = i+1;
if before == 0
before = 5;
end
if after == 6
after = 1;
end
for Y=1:5
DComp = DComp + dist(X,Y) * (V(u(Y,after)) + V(u(Y,before)));
end
DComp = DComp * D;
out = -1*(u(X,i)+c)/t - AComp - BComp - CComp - DComp;
V()
function out=V(u)
u0 = 0.02;
out = (1 + tanh(u/u0))/2;
Esto es un problema genial. El semestre es probable que haya terminado; ¿Encontraste alguna solución? –
No, lamentablemente el profesor no fue de lo más útil. Hablé con otro alumno de la clase, pero tampoco creo que lo haya solucionado. –