2016-04-11 2 views
7

Je suis tombé sur a spreadsheet qui explique une méthode pour trier les lignes et les colonnes d'une matrice qui contient des données binaires afin que le nombre de changements entre les lignes consécutives et les cols est minimisé.Algorithme pour trier les lignes et les colonnes par similarité

Par exemple, en commençant par:

initial table

Après 15 étapes manuelles décrites dans les onglets de la spreadsheed, le tableau suivant est obtenu:

final result

Je voudrais connaître:

  1. quel est le nom commun de cet algorithme ou de cette méthode? Comment l'appliquer à une table plus grande (où 2^n déborderait ...)
  2. comment le généraliser à des données non binaires, par exemple en utilisant la distance de Levenshtein?
  3. s'il y a un lien vers le code (Excel VBA, Python, ...) applique déjà cette (sinon je vais l'écrire ...)

Merci!

+1

C'est le chemin hamiltonien euclidien dans {0,1}^n; Je pense qu'il pourrait y avoir des algorithmes d'approximation à facteur constant puisque hampath est étroitement lié au TSP (les deux HMPath et TSP sont np-durs pour les graphes généraux), et nous avons des algorithmes d'approximation pour TSP, mais ne nous attendons pas à le résoudre Je ne suis pas entièrement sûr qu'une preuve de dureté existe pour cet espace spécifique, je serais surpris si c'était dans P. Je ne sais pas ce que VBA peut faire, donc je ne peux pas vous dire si vous pouvez mettre en œuvre une approximation algorithme là. –

+2

Ayant un second regard, la distance n'est en fait pas euclidienne, mais la distance de Hamming; Je ne connais pas les preuves de dureté ni les algorithmes d'approximation pour celui-là, mais ils existent probablement. –

+1

En relation: [Codes Gray] (https://en.wikipedia.org/wiki/Gray_code), également disponible en tant que variantes n-aire. – Norman

Répondre

2

Il est possible de représenter chaque ligne par un vecteur L = [1, 1, 0, ... 1], puis définir la distance entre deux lignes d(L0, L1) par le nombre d'éléments correspondant à des positions qui sont différentes entre L0 et L1. Ceci est connu comme le binaire Hamming distance. Si vous aviez des données non binaires, vous étendriez simplement votre définition de distance et oui, la distance de Levenshtein serait une option.

Une fois la distance définie, le reste de votre problème réduit la distance entre les lignes consécutives. C'est exactement le Traveling salesman problem, qui est connu pour être NP-difficile (http://www.diku.dk/hjemmesider/ansatte/jyrki/Paper/EKP85.pdf).

La solution directe (visitant toutes les permutations) est O (n!), Mais vous pouvez facilement faire mieux en utilisant la programmation dynamique, par exemple Held–Karp_algorithm. Il existe également des algorithmes approchés, tels que le Nearest_neighbour_algorithm qui calcule rapidement une solution non optimale. Enfin, pour les implémentations, vous pouvez facilement google "voyageur de commerce excel/python" et trouver de nombreux tutoriels et des exemples.