2010-03-23 4 views
12

J'écris un solveur sokoban pour le plaisir et la pratique, il utilise un algorithme simple (quelque chose comme BFS avec un peu de différence).nombre de chemins acycliques distincts de A [a, b] à A [c, d]?

maintenant je veux estimer son temps de fonctionnement (O et oméga). mais besoin de savoir comment calculer le nombre de chemins acycliques d'un sommet à l'autre dans un réseau. en fait je veux une expression qui calcule le nombre de chemins valides, entre deux sommets d'une matrice m * n de sommets.

un chemin valide:

  • visites chaque sommet 0 ou une fois.
  • ont aucun circuit

par exemple ceci est un chemin valide:

alt text http://megapic.ir/images/f1hgyp5yxcu8887kfvkr.png

mais ce n'est pas:

alt text http://megapic.ir/images/wnnif13ir5gaqwvnwk9d.png

Ce qui est nécessaire est une méthode pour trouver le compte de tous les chemins acycliques entre les deux sommets a et b.

commentaires sur les méthodes de résolution et les astuces sont les bienvenus.

+3

Le nombre de chemins possibles sera beaucoup plus grand que le nombre de chemins considérés par un BFS, donc je ne vois pas comment cela pourrait aider. Un BFS combine plusieurs fois des chemins similaires, ce qui réduit la complexité. La complexité d'un BFS est O (| V | + | E |). – fgb

+0

Voulez-vous une liste de tous les chemins ou juste le nombre de chemins? Si vous voulez le nombre de chemins, vous contenteriez-vous d'une approximation? – user287792

+0

Je ne veux pas de liste d'entre eux. Je veux calculer le nombre d'entre eux sans les compter. –

Répondre

4

Pas une solution mais peut-être que vous pouvez penser cette idée un peu plus loin. Le problème est que vous devrez calculer aussi le chemin le plus long possible pour obtenir tous les chemins. Le longest path problem est NP complet pour les graphes généraux, donc il obtiendra un temps très long même pour des graphes relativement petits (8x8 et plus). Imaginez que le sommet de début se trouve dans le coin supérieur gauche et que le sommet final se trouve dans le coin inférieur droit de la matrice.

  • Pour une matrice 1x2 il y a seulement 1 chemin possible
  • 2x2 matrice => 2 *** 1 ** chemins => 2
  • 3x2 matrice => 2 *** 2 ** chemins = > 4
  • matrice 3x3 => 2 ** *** 4 + 2 * 2 voies => 12
  • 3x4 matrice => 2 ** *** 12 + 12 + 2 voies => 38

Chaque fois que j'ai combiné les résultats du calcul précédent pour le nombre actuel de chemins. Il se pourrait qu'il y ait un formulaire proche pour un tel graphe planaire, peut-être y a-t-il beaucoup de théorie pour cela, mais je suis trop stupide pour ça ...

Vous pouvez utiliser le Java suivant (désolé, je ne suis pas un C++ expert: - /) snippet pour calculer les chemins possibles pour les matrices plus grandes:

public static void main(String[] args) { 
    new Main(3, 2).start(); 
} 
int xSize; 
int ySize; 
boolean visited[][]; 

public Main(int maxX, int maxY) { 
    xSize = maxX; 
    ySize = maxY; 
    visited = new boolean[xSize][ySize]; 
} 

public void start() { 
    // path starts in the top left corner 
    int paths = nextCell(0, 0); 
    System.out.println(paths); 
} 

public int nextCell(int x, int y) { 
    // path should end in the lower right corner 
    if (x == xSize - 1 && y == ySize - 1) 
     return 1; 

    if (x < 0 || y < 0 || x >= xSize || y >= ySize || visited[x][y]) { 
     return 0; 
    } 

    visited[x][y] = true; 
    int c = 0; 
    c += nextCell(x + 1, y); 
    c += nextCell(x - 1, y); 
    c += nextCell(x, y + 1); 
    c += nextCell(x, y - 1); 
    visited[x][y] = false; 
    return c; 
} 

=>

  • 4x4 => 184
  • 5x5 => 8512
  • 6x6 => 1262 816
  • 7x7 (même ce cas simple prend beaucoup de temps!) => 575780564

Cela signifie que vous pouvez (seulement en théorie) calculer tous les chemins possibles à partir de toute position d'une matrice MxM au bas, à droite coin, puis utilisez cette matrice pour rechercher rapidement le nombre de chemins. Dynamic programming (en utilisant les résultats calculés précédemment) pourrait accélérer les choses un peu.

+0

Merci pour les conseils utiles et la solution. –

+0

Je suis heureux que cela aide et j'espère que cela a du sens et est presque sans bug. Merci pour cette question intéressante :-)! – Karussell

+0

voir la première référence (blum + hewitt: automates sur une bande bidimensionnelle) ici: ftp://ftp.inf.fu-berlin.de/pub/reports/tr-b-97-08.ps.gz - > ils calculent le nombre de cycles possibles dans une grille KxK. Peut-être que c'est un problème presque identique au vôtre -> connectez simplement le sommet inférieur droit au sommet gauche supérieur? – Karussell

1

Une matrice montrant les bords fonctionnerait-elle? Envisagez de créer une matrice indiquant l'emplacement des bords, c'est-à-dire [a, b] = 1 < => a-> b est un front dans le graphe, sinon 0. Maintenant, élevez cette matrice à plusieurs puissances pour montrer combien il existe de façons de passer d'un sommet à l'autre en utilisant n étapes, puis additionnez-les pour obtenir le résultat. Ceci est juste une idée d'une façon de résoudre le problème, il peut y avoir d'autres façons d'encadrer le problème.

Je me demande si cela appartient à MathOverflow, comme une autre idée


Il est vrai qu'une fois que vous avez une matrice zéro, vous pouvez arrêter exponentiation comme dans votre cas, il n'y a pas beaucoup d'endroits où aller après 3 , mais les chemins de 1 à 3 seraient le direct et celui qui passe par 2, donc il n'y a que quelques matrices à additionner avant que le zéro soit trouvé.


Je pense qu'il devrait y avoir un moyen de calculer une borne de dire n^(n + 1), où n est le nombre de sommets du graphe, qui indiquerait un point d'arrêt que par cette point, chaque sommet aura été visité une fois. Je ne suis pas sûr de savoir comment sortir les chemins cycliques du problème, ou peut-on supposer que le graphique est exempt de cycles?

+0

Considérons 1 -> 2, 1 -> 3, 2 -> 3. Matrice d'adjacence: 0 1 1 | 0 0 1 | 0 0 0. Les éléments de cette matrice seront tous égaux à zéro par exponentiation répétée. Si vous considérez une matrice d'adjacence symétrique (pour un graphe non orienté), alors comment saurez-vous quand arrêter l'exponentiation? – IVlad

+0

Que se passe-t-il si la matrice ne devient jamais 0? Comment savez-vous quand arrêter? – IVlad

+0

La méthode décrite comptera également les chemins où certains nœuds sont visités plus d'une fois, donc au mieux, il s'agira d'une limite supérieure du nombre de chemins. La matrice ne conserve aucune information sur les noeuds visités, seulement le nombre de façons d'aller de a à b. –

3

Il y a un problème similaire, mais moins général sur le projet Euler: http://projecteuler.net/index.php?section=problems&id=237

Je pense que certaines des solutions décrites dans le forum, il peut être étendu pour résoudre votre cas général. C'est un problème plutôt difficile, surtout pour votre cas général.

Pour accéder à leurs forums, vous devez d'abord résoudre le problème. Je ne publierai pas la réponse ici, ni un lien vers un certain site qui répertorie la réponse, un site que vous pouvez facilement trouver sur google en cherchant quelque chose de vraiment évident.

+0

Cher IVlad, Je pense que c'est plus général que le problème que vous voulez dire. parce que la 3ème règle du problème 237 dit: Le tour visite chaque carré exactement une fois. mais ici Le tour visite chaque carré moins de deux fois. (1 ou 0 fois) et le tour commence et se termine entre 2 sommets arbitraires et distincts. –

4

Le problème général du comptage du nombre de chemins simples dans un graphe est #P complet. Certains problèmes # P-complets ont des schémas d'approximation entièrement polynomiaux, et d'autres non, mais vous prétendez ne pas être intéressés par une approximation. Il y a peut-être un moyen de tirer parti de la structure de la grille, comme pour le calcul du polynôme de Tutte, mais je n'ai aucune idée de la façon de le faire.

+0

Je suis assez sûr que le nombre de chemins est fini. Je ne suis pas sûr mais je pense qu'il doit y avoir une séquence récursive du compte, aussi il serait extrêmement difficile de l'estimer sans réellement évaluer. –

+0

En fait, il peut être beaucoup plus facile d'approximer que de calculer exactement. Editez la question si vous changez d'avis ... – user287792

+1

"il serait extrêmement difficile de l'estimer sans réellement évaluer" -> oui, exactement ce que je pense. vous pouvez rechercher la théorie des graphes planaires pour obtenir un formulaire approximatif: http://www.cs.brown.edu/sites/jgaa/accepted/2007/RobertsKroese2007.11.1.pdf – Karussell

2

Ceci est une question ouverte en mathématiques avec une application directe à la chimie et la physique en l'utilisant pour modéliser les liaisons polymères. Certains des premiers travaux effectués à ce sujet ont été réalisés pendant le projet Manhattan (bombe nucléaire de la Seconde Guerre mondiale.)

Il est plus connu sous le nom de problème de la marche auto-évitante. J'ai passé un été au département de mathématiques de mon université à étudier un algorithme de Monte-Carlo appelé algorithme de pivotement pour approcher les paramètres de l'ajustement asymptotique du nombre de marches d'auto-évitement d'une longueur donnée n. Veuillez vous référer à l'excellent livre de Gordon Slade intitulé "The Self Avoiding Walk" pour une couverture complète des types de techniques utilisées pour aborder ce problème jusqu'à présent.

Ceci est un problème très complexe et je me demande quelle est votre motivation pour le considérer. Peut-être que vous pouvez trouver un modèle plus simple pour ce que vous voulez, parce que les évitements d'auto-évitement ne sont pas simples du tout.

+0

http://mathworld.wolfram.com/Self-AvoidingWalk.html a des références supplémentaires. –

Questions connexes