1

je suis tombé sur une solution de voyageur de commerce qui utilise le script Matlab, et dans son code, je trouve qu'il utilise une représentation appelée ville Coordonnées, qui ressemble à:Besoin d'aide sur cette représentation de Traveling Salesman problème

CityCood = [0.4000,0.2439,0.1707,0.2239,0.5171;0.4439,0.1463,0.2293,0.7610,0.9414] 

pour 5 villes. À ce stade, je ne sais vraiment pas comment l'auteur a obtenu cette représentation, puisque d'après ce que j'ai vu jusqu'ici, l'information à portée de main devrait être une matrice symétrique 5 * 5 représentant la distance entre deux de ces cinq villes.

Donc, je serais reconnaissant si quelqu'un pouvait me donner une idée sur comment fonctionne cette représentation basée sur les coordonnées. Merci d'avance.

+1

Pensez à utiliser chameau pour les noms de variables: * cityCoord * au lieu de * CityCoord *. – zellus

Répondre

5

CityCoord (Je pense qu'il manque une lettre) est un tableau de 2 par 5. Je suppose que cela signifie que CityCoord contient deux coordonnées (x, y) pour chaque ville.

Pour créer une matrice 5 par 5 la distance, vous pouvez appeler

squareform(pdist(CityCoord')) 
+0

Génial. Qu'en est-il si j'ai déjà une matrice de distance à portée de main? dis, je connais la distance interurbaine pour chaque paire sur 5 villes A, B, C, D, E? – Kevin

+0

@Robert: Si vous devez convertir une matrice de distance en coordonnées et que vous disposez de la boîte à outils de statistiques, vous pouvez utiliser par exemple. 'mdscale', comme dans' CityCoord = mdscale (distanceMatrix, 2) '; '. – Jonas

+0

IPDM pour les personnes sans statistiques Boîte à outils: http://www.mathworks.com/matlabcentral/fileexchange/18937 – zellus

3

Si vous ne disposez pas de statistiques Boîte à outils, une forme équivalente à la solution fournie par @Jonas pour calculer la distance euclidienne est :

%# dist(u,v) = norm(u-v) = sqrt(sum((u-v).^2)) 
D = cell2mat(arrayfun(... 
    @(i) sqrt(sum(bsxfun(@minus, CityCoord, CityCoord(:,i)).^2)), ... 
    (1:size(CityCood,2))', ... 
    'UniformOutput',false)); 

Sinon, nous pouvons utiliser le fait que ||u-v||^2 = ||u||^2 + ||v||^2 - 2*u.v pour mettre en œuvre un code encore plus rapide vectorisé:

X = sum(CityCoord.^2); 
D = real(sqrt(bsxfun(@plus,X,X')-2*(CityCoord'*CityCoord))); 
+0

+1 pour les solutions sympas et avancées, bien que difficiles à lire. – Jonas

+0

J'ai essayé de le décomposer en plusieurs lignes pour plus de lisibilité, encore un appel à PDIST est beaucoup plus facile :) – Amro