11
votes

Algorithme pour trouver des combinaisons de chemin?

Imaginez que vous avez un robot de danse dans n code> espace euclidien à partir -dimensionnelle à l'origine P_0 code> = (0,0, ..., 0) code>.

Le robot peut faire m code> types de mouvements de danse D_1, D_2, ..., d_m code> p>

d_i est un n code> -vector des entiers (D_i_1, D_i_2, ..., D_i_n) code> p>

Si le robot fait déplacer la danse i code> par rapport à ses changements de position par d_I code>: p>

P_ {t + 1} = P_t + d_I code> p>

Le robot peut faire l'un des mouvements de danse autant de fois qu'il veut et dans l'ordre. p>

soit k-dance em> être défini comme une séquence de k mouvements de danse. p>

il est clair qu'il ya m ^ k code> possibles k-danses. p>

Nous sommes intéressés à connaître l'ensemble des positions finales possibles d'un K- danse, et pour chaque position finale, combien de k-danse fin à cet endroit em> p>

Une façon de faire est la suivante:. p>

P0 = (0, 0, ..., 0);

S[0][P0] = 1

for I in 1 to k
    for J in 1 to m
        for P in S[I-1]
            S[I][P + D_J] += S[I][P]


2 commentaires

+1 pour la danse robot dans l'espace euclidien N-dimensionnel


Avez-vous essayé d'utiliser des règles et laissez HMM le gérer pour vous ?? Pensez-vous qu'il est applicable dans votre cas ??


3 Réponses :


1
votes

Vous pouvez créer une matrice d'adjacence qui contiendrait des transitions de dérivation dans votre espace (la partie qui est accessible en k mouvements k, sinon elle serait infinie). Ensuite, la ligne P_0 de la puissance N-TH de cette matrice contient les valeurs S [k].

La matrice en question devient rapidement énorme, quelque chose comme (k * (max (d_i_j) -min (d_i_j))) ^ n (chaque dimension peut être divisée de moitié si elle est proche d'origine) , mais c'est vrai pour votre matrice s


0 commentaires

1
votes

Étant donné que le problème en un dimension est étroitement lié au Sous-ensemble Sum Problème , vous pourriez probablement Prenez une approche similaire - trouvez toutes les combinaisons de vecteurs de danse qui ajoutent ensemble pour avoir la première coordonnée correcte avec exactement k mouvements; Ensuite, prenez ce sous-ensemble de combinaisons et vérifiez lequel de ceux-ci ont la somme droite pour la seconde et prenez le sous-ensemble qui correspond à la fois et vérifiez-le pour la troisième, etc.

De cette façon, vous devez au moins seulement effectuer une addition très simple pour l'étape extrêmement douloureuse O (N ^ K). Il trouvera en effet tous les vecteurs qui frapperont une valeur donnée.


4 commentaires

Lorsque vous dites Ajouter ensemble pour avoir la première valeur correcte p_0_0 , quel est p_0_0 ? J'ai défini p_0 comme vecteur et origine zéro. Voulez-vous dire p_0 ?


En supposant que vous voulez dire p_0 , comment trouver toutes les combinaisons de vecteurs de danse qui ajoutent ensemble à p_0 ?


L'algorithme de temps pseudo-polynomial décrit sur cette page est étroitement analogue; L'avantage que vous avez est que le nombre d'éléments pouvant être utilisés pour frapper la somme est limité à K.


En outre, désolé, ce que je voulais dire était la première coordonnée d'une position finale donnée.



1
votes

Les mouvements de danse sont interchangeables, vous pouvez supposer que pour un i le robot fait d'abord tout le d_i déplace avant le d_j déplace , réduisant ainsi le nombre de combinaisons pour calculer réellement.

Si vous gardez une trace du nombre de fois que chaque mouvement de danse a été effectué, calculer le nombre total de combinaisons doit être facile.


4 commentaires

Dans mon exemple, algorithme s [i] est calculé en fonction de s [i-1] . Chaque s [i] est un histogramme de vecteurs de position (à l'heure I). Utilisation de votre méthode pour une entrée de cet histogramme, je n'aurais le nombre de séquences de non-quaille (pas de séquence). À la fin, comment puis-je convertir ces comptes de séquences de nondréquage aux comptes de toute séquence requise, étant donné que chaque entrée est un mélange de nombreuses séquences de non-facturant différentes?


Au lieu de simplement la position finale et le nombre de chemins, vous garderez une trace de la position finale plus des utilisations pour chaque étape de danse (N_I). Le nombre total de combinaisons atteignant cette postion est alors k! / Somme (N_I!)


À chaque élément de s [t] [p] , il y a (t + m + 1 choisissez m) combinaisons possibles. Cela augmenterait donc le stockage et la performance requis par un facteur de ce montant? Par conséquent, n'est donc pas beaucoup pire que mon algorithme original suggéré?


Je ne suis pas ce argument. Le stockage n'augmenterait que de manière significative, je pense que si le nombre de p_x cela peut être atteint par différentes combinaisons distinctes de D_Y. Parce que ceux qui doivent être maintenus comme des histogrammes différents, tandis que dans votre algorithme, ils sont stockés dans un nœud. De l'autre côté, vous avez moins de combinaisons à calculer, ce qui devrait apporter l'effet le plus important lorsque K >> m. Je m'attendrais donc à k >> m mon algorithme d'être plus efficace pendant que k << m le vôtre est plus efficace ??