Imaginez que vous avez un robot de danse dans Le robot peut faire Si le robot fait déplacer la danse 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 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> n code> espace euclidien à partir -dimensionnelle à l'origine
P_0 code> =
(0,0, ..., 0) code>.
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>
i code> par rapport à ses changements de position par
d_I code>: p>
P_ {t + 1} = P_t + d_I code> p>
m ^ k code> possibles k-danses. 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]
3 Réponses :
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]. P>
La matrice en question devient rapidement énorme, quelque chose comme (k * (max (d_i_j) -min (d_i_j))) ^ n code> (chaque dimension peut être divisée de moitié si elle est proche d'origine) , mais c'est vrai pour votre matrice
s code> p>
É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. P>
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. P>
Lorsque vous dites Ajouter ensemble pour avoir la première valeur correcte p_0_0 code>, quel est
p_0_0 code>? J'ai défini
p_0 code> comme vecteur et origine zéro. Voulez-vous dire
p_0 code>?
En supposant que vous voulez dire p_0 code>, comment trouver toutes les combinaisons de vecteurs de danse qui ajoutent ensemble à
p_0 code>?
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.
Les mouvements de danse sont interchangeables, vous pouvez supposer que pour un 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. P> i
d_i code> déplace avant le
d_j code> déplace , réduisant ainsi le nombre de combinaisons pour calculer réellement. p>
Dans mon exemple, algorithme s [i] code> est calculé en fonction de
s [i-1] code>. Chaque
s [i] code> 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] code>, il y a
(t + m + 1 choisissez m) code> 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 ??
+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 ??