Ceci est mon algorithme pour trouver un cycle hamiltonien dans un graphe:Trouver tous les cycles possibles hamiltonien dans un graphe partiellement orienté
private SolutionArray solution;
private int V, pathCount;
private int[] path;
private int[][] graph;
/**
* Constructor
*/
public ConcreteSolver() {
solution = new SolutionArray();
}
@Override
public SolutionArray solve(PathMatrix input) {
V = input.getNbVertex();
path = new int[V];
/** Set all path to non-visited **/
boolean[] visited = new boolean[V];
for (int i = 0; i < V; i++) {
visited[i] = false;
}
Arrays.fill(path, -1);
graph = input.getMatrix();
try {
path[0] = input.getFirstVertex();
pathCount = 1;
findPaths(0);
System.out.println("No solution");
} catch (Exception e) {
System.out.println("\nSolution found");
//input.printMatrix();
displayAndWrite();
}
return solution;
}
/**
* function to find paths recursively
*/
private void findPaths(int vertex) throws Exception {
/** solution **/
if (graph[vertex][0] >= 1 && pathCount == V) {
throw new Exception();
}
/** all vertices selected but last vertex not linked to 0 **/
if (pathCount == V)
return;
for (int v = 0; v < V; v++) {
/** if connected **/
if (graph[vertex][v] >= 1) {
/** add to path **/
path[pathCount++] = v;
/** if vertex not already selected solve recursively **/
if (!isPresent(v))
findPaths(v);
/** remove path **/
path[--pathCount] = -1;
}
}
}
/**
* function to check if path is already selected
*/
private boolean isPresent(int v) {
for (int i = 0; i < pathCount - 1; i++)
if (path[i] == v)
return true;
return false;
}
Je suis en mesure de trouver un premier cycle hamiltonien. Est-il possible de l'adapter pour trouver tous les cycles hamiltoniens possibles trouvés dans le graphique?
L'entrée est une matrice non symétrique (certains liens entre les nœuds sont à sens unique) et certains nœuds peuvent avoir 2 ou 3 liaisons avec d'autres nœuds.
Merci
EDIT:
Pour clarifier les choses, l'algorithme peut déjà trouver une solution, mais ne peut pas trouver un deuxième et ainsi de suite. De la lecture, A * en utilisant bactracking pourrait résoudre le problème mais je ne suis pas sûr si elle peut être ajoutée à ce que j'ai déjà.
Pas tellement un commentaire sur votre question, mais sur votre mise en œuvre: vous ne devriez pas utiliser une exception pour indiquer qu'une solution a été trouvée. Les exceptions sont d'indiquer des choses qui sont exceptionnelles. Voir Effective Java 2nd Ed Item 57. Vous avez deux résultats de l'appel de cette méthode: void et Exception. Vous pourriez facilement rendre cette fausse et vraie, ou une enum NOT_FOUND et FOUND, et il serait beaucoup plus facile de grok. –