Перечислять * все * гамильтоновы пути - PullRequest
7 голосов
/ 23 апреля 2011

Я знаю, что об этом уже спрашивали, но я не нашел его ответа ни в одном из постов.Может кто-нибудь предложить мне алгоритм, который перечисляет ВСЕ гамильтоновы пути в графе?

Небольшая предыстория: я работаю над проблемой, в которой мне нужно перечислить каждый гамильтонов путь, провести некоторый анализ и вернуть результат,Для этого мне нужно иметь возможность перечислить все возможные гамильтоновы пути.

Спасибо.

Ответы [ 4 ]

3 голосов
/ 25 августа 2011

Мой код Java: (абсолютно на основе рекурсивного метода)

алгоритм:

+ Начните с 1 точки, подключитесь к другой точке, которую он может видеть (чтобы сформировать путь).

+ удалить путь и рекурсивно найти новый путь в самой новой точке, пока все точки графа не соединятся.

+ удалить путь и вернуться к исходному графику, если не могу сформировать путь Гамильтона из новейшей точки

public class HamiltonPath {
public static void main(String[] args){
    HamiltonPath obj = new HamiltonPath();

    int[][]x = {{0,1,0,1,0},  //Represent the graphs in the adjacent matrix forms
                {1,0,0,0,1},
                {0,0,0,1,0},
                {1,0,1,0,1},
                {0,1,0,1,0}};

    int[][]y = {{0,1,0,0,0,1},
                {1,0,1,0,0,1},
                {0,1,0,1,1,0},
                {0,0,1,0,0,0},
                {0,0,1,0,0,1},
                {1,1,0,0,1,0}};

    int[][]z = {{0,1,1,0,0,1},
                {1,0,1,0,0,0},
                {1,1,0,1,0,1},
                {0,0,1,0,1,0},
                {0,0,0,1,0,1},
                {1,0,1,0,1,0}};

    obj.allHamiltonPath(y);   //list all Hamiltonian paths of graph
    //obj.HamiltonPath(z,1);  //list all Hamiltonian paths start at point 1


}

static int len;
static int[]path;
static int count = 0;    

public void allHamiltonPath(int[][]x){  //List all possible Hamilton path in the graph
    len = x.length;
    path = new int[len];
    int i;
    for(i = 0;i<len;i++){ //Go through column(of matrix)
        path[0]=i+1;
        findHamiltonpath(x,0,i,0);
    }
}

public void HamiltonPath(int[][]x, int start){ //List all possible Hamilton path with fixed starting point
    len = x.length;
    path = new int[len];
    int i;
    for(i = start-1;i<start;i++){ //Go through row(with given column)
        path[0]=i+1;
        findHamiltonpath(x,0,i,0);
    }
}

private void findHamiltonpath(int[][]M,int x,int y,int l){

    int i;
        for(i=x;i<len;i++){         //Go through row

            if(M[i][y]!=0){      //2 point connect

                if(detect(path,i+1))// if detect a point that already in the path => duplicate 
                    continue;

                l++;            //Increase path length due to 1 new point is connected 
                path[l]=i+1;    //correspond to the array that start at 0, graph that start at point 1
                if(l==len-1){//Except initial point already count =>success connect all point
                    count++;   
                    if (count ==1)
                System.out.println("Hamilton path of graph: ");
                    display(path);
                    l--;
                    continue;
                }

                M[i][y]=M[y][i]=0;  //remove the path that has been get and
                findHamiltonpath(M,0,i,l); //recursively start to find new path at new end point
                l--;                // reduce path length due to the failure to find new path         
                M[i][y] = M[y][i]=1; //and tranform back to the inital form of adjacent matrix(graph)
            }
     }path[l+1]=0;    //disconnect two point correspond the failure to find the..   
}                     //possible hamilton path at new point(ignore newest point try another one)         

public void display(int[]x){

   System.out.print(count+" : ");
    for(int i:x){
        System.out.print(i+" ");
    }
        System.out.println();   
}

private boolean detect(int[]x,int target){ //Detect duplicate point in Halmilton path 
    boolean t=false;                        
    for(int i:x){
        if(i==target){
            t = true;
            break;
        }
    }
    return t;
}  

}

3 голосов
/ 24 апреля 2011

Используйте BFS / DFS как предложено, но не останавливайтесь на первом решении. Основное использование BFS / DFS (в данном случае) будет заключаться в том, чтобы найти все решения, вам нужно поставить условие для остановки на первом.

0 голосов
/ 08 января 2018

Решение в Python3:

def hamiltonians(G, vis = []):
    if not vis:
        for n in G:
            for p in hamiltonians(G, [n]):
                yield p
    else:
        dests = set(G[vis[-1]]) - set(vis)
        if not dests and len(vis) == len(G):
            yield vis
        for n in dests:
            for p in hamiltonians(G, vis + [n]):
                yield p
G = {'a' : 'bc', 'b' : 'ad', 'c' : 'b', 'd' : 'ac'}
print(list(hamiltonians(G)))
0 голосов
/ 09 сентября 2014

Исчерпывающий поиск в глубину дает вам ответ.Я только что закончил описание реализации Java для этой проблемы (включая код):

http://puzzledraccoon.wordpress.com/2012/06/07/how-to-cool-a-data-center/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...