Использование очереди для решения TSP (Branch and Bound) - PullRequest
2 голосов
/ 11 мая 2011

Я работаю над алгоритмом ветвления и привязки для задачи коммивояжера и столкнулся с небольшим затруднением.Я использую довольно стандартную очередь с узлами, представляющими подмножества вершин (путей).Я почти уверен, что у меня все продумано, но на данный момент у меня есть открытый класс Queue, а под ним - закрытый класс Node со всеми его свойствами: текущий путь, нижняя граница и т. Д.

Однако в моей основной программе я инициализирую Очередь узлов и создаю два начальных узла, но получаю сообщение об ошибке «Узел не может быть преобразован в тип».Я предположил, что это потому, что он был внутри класса Queue и недоступен для основной программы, но когда я перемещаю его, я везде получаю ошибки в элементах, которые подключены к узлу.имеет смысл, я не уверен, как еще это объяснить, но все остальное вроде бы хорошо.Вот фрагмент моего кода для пояснения:

`public class Queue<Item> implements Iterable<Item> {
    private int N;         // number of elements on queue
    private Node first;    // beginning of queue
    private Node last;     // end of queue

    // helper linked list class
    public class Node {
        public int level;       //level on the tree
        public int[] path;      //current path
        public int bound;       //lower bound
        public Item item;       
        public Node next;       //the next in the path
        public boolean inPath;  //checks to see if the vertex is in the current path
        public int missingV;    //the vertex that is missing from the path

    }`

Вот где я объявляю класс Node, и именно здесь я фактически использую его в своей основной программе:

`public static void main(String args[]) {
    int n = 4;
    int[][] W = new int[][] {{0,2,4,7},{2,0,7,3},{4,7,0,5},{6,3,5,0}};
    int[] opttour;
    Queue<Node> PQ = new Queue<Node>();
    Node u = new Node();
    Node v = new Node();`

Ответы [ 2 ]

0 голосов
/ 11 мая 2011

Я думаю, что ваш класс Node должен быть статическим, а не внутренним классом Queue.

0 голосов
/ 11 мая 2011

В вашей основной записи измените Node на Queue.Node:

    Queue<Queue.Node> PQ = new Queue<Queue.Node>();
    Queue.Node u = PQ.new Node();
    Queue.Node v = PQ.new Node();

Я бы предложил поместить класс Node в отдельный файл из Queue, поскольку вам, очевидно, нужно манипулировать его экземплярами извне класса Queue.

...