分行及;绑定错误:无法将Node1转换为java.lang.com

分行及;绑定错误:无法将Node1转换为java.lang.com,java,algorithm,comparator,comparable,branch-and-bound,Java,Algorithm,Comparator,Comparable,Branch And Bound,我正在尝试用java实现分支定界搜索算法。我知道它的概念(它是如何工作的),但我不知道如何实现它 我在谷歌上找到了一些例子,但它们要复杂得多,我似乎无法理解它们。我想以一种简单的方式实现它。而且,它们中的大多数不是java语言 下面是搜索开始的相关方法(这只是我代码的一部分)。 我认为我的for循环需要进行适当修改,以存储边界节点和成本,然后获取成本最低的节点,然后再次执行搜索,直到找到目标节点并添加累积成本。 所以我想递归方法最适合这个。但我不知道如何实施 下面的代码没有给我任何编译错误,但给

我正在尝试用java实现分支定界搜索算法。我知道它的概念(它是如何工作的),但我不知道如何实现它

我在谷歌上找到了一些例子,但它们要复杂得多,我似乎无法理解它们。我想以一种简单的方式实现它。而且,它们中的大多数不是java语言

下面是搜索开始的相关方法(这只是我代码的一部分)。 我认为我的for循环需要进行适当修改,以存储边界节点和成本,然后获取成本最低的节点,然后再次执行搜索,直到找到目标节点并添加累积成本。
所以我想递归方法最适合这个。但我不知道如何实施

下面的代码没有给我任何编译错误,但给了我运行时错误,因为
Node1无法转换为java.lang.Comparable
。有人愿意调查这个问题吗?几个小时以来我一直在努力做这件事,但似乎找不到任何解决办法

此外,任何一小段代码都会指引我走上正确的道路

 public void Search(Node1[] nodes, String startNode, int size){

  List<String> frontierNodes = new ArrayList<String>();
  Queue<Node1> frontierCosts = new PriorityQueue<Node1>();

    for(int i=0; i<size;i++) {

        if(startNode.equals(nodes[i].getStartNode())) { // user enters the startNode and goalNode          

           frontierNodes.add(nodes[i].getEndNode());               
           frontierCosts.add(new Node1(nodes[i].getCost())); 
           frontierCosts.peek();
           System.out.println("Min cost" +frontierCosts.peek());
           int nodesLength = nodes.length - (frontierNodes.size()); 
           i--;
           System.out.println("remaining search nodes length" +nodesLength);

           //Search(nodes, frontierCosts.peek().getEndNode() ,nodesLength); // RECURSIVE CALL?
        } 
    }

} 
以下是文件格式(startNode endNode成本)

[编辑]:

我想实现分支绑定搜索,程序要求用户输入
startNode
goalNode
,然后从
Node1
类(存储文件数据的地方)访问数据,然后程序进入
search
方法(上面的方法),传递所有
节点,
startNode
节点长度(大小)
。 如果startNode与node1[].getStartNode中的任何一个匹配,则它将相应的扩展节点存储在优先级队列的
frontierNodes
中,并将其相应的成本存储在
frontierCosts
中(以选取最小成本)。 然后程序窥视()优先级队列并选择成本最低的节点(队列前面),然后再次搜索(递归调用上述搜索方法?),将该特定节点作为起始节点,然后继续搜索。

当程序到达新节点时,每个新节点的成本应该得到到目前为止访问的路径的累积成本,并且程序应该输出路径和成本

PriorityQueue需要实现可比较接口的数据结构,除非将比较器作为

变化应该非常简单

class Node1 implements Comparable<Node1> {
    String start, end;
    double cost;

    public Node1(String start, String end, double cost){
        this.start = start;
        this.end = end;
        this.cost = cost;
    }

    public Node1(double cost) { // alternate constructor to store cost in   priority queue
        this.cost = cost;
    }

    public String getStartNode(){
        return start;
    }

    public String getEndNode(){
        return end;
    }

    public double getCost(){
        return cost;
    }

    @Override
    public int compareTo(Node1 o) {
        return Double.compare(this.cost, o.cost);
    }
}
类节点1实现了可比较的{
字符串开始、结束;
双重成本;
公共节点1(字符串开始、字符串结束、双重成本){
this.start=start;
this.end=end;
成本=成本;
}
公共节点1(双重成本){//在优先级队列中存储成本的替代构造函数
成本=成本;
}
公共字符串getStartNode(){
返回启动;
}
公共字符串getEndNode(){
返回端;
}
公共成本{
退货成本;
}
@凌驾
公共整数比较(节点1 o){
返回双倍。比较(此成本,o成本);
}
}
请注意,如果希望结果具有确定性且成本不是唯一的,则可能还需要使用开始/结束节点作为比较的一部分

对于你的主要逻辑,有两件事不太正确

  • 函数参数应该包括它是什么目标节点
  • 您的函数参数应该包括到目前为止您已经使用了多少成本,这样,如果您想使用递归函数,就可以跟踪这些成本
  • 函数应返回到达节点的最小成本
  • 如果你的图可以有一个循环,考虑一个机制来确保它不会重访以前访问过的节点。< /LI>
  • 一旦有了成本可接受的可能解决方案,就需要将该成本作为上限,以确保在成本高于目前为止的最佳解决方案时,不会继续访问更多节点

  • 谢谢你,但是当我实现它的时候,程序会陷入无限循环中吗?我不明白为什么代码是错误的,因为它只在优先级队列中添加内容,而从不取出任何内容。如果你能更准确地描述你的代码应该做什么,我也许能帮上忙。哦,对不起!我将编辑问题并在那里解释。请看一看。是的,这些正是我们所期望的。关于第4点。文件(图)中的节点没有循环,因此我认为我不需要单独实现任何东西来跟踪它。我不确定如何返回最小成本,我的意思是如何添加每个扩展节点的累积成本并返回成本。你能帮我做这个吗?
    A B 10 
    A C 12
    B D 6
    ....
    
    class Node1 implements Comparable<Node1> {
        String start, end;
        double cost;
    
        public Node1(String start, String end, double cost){
            this.start = start;
            this.end = end;
            this.cost = cost;
        }
    
        public Node1(double cost) { // alternate constructor to store cost in   priority queue
            this.cost = cost;
        }
    
        public String getStartNode(){
            return start;
        }
    
        public String getEndNode(){
            return end;
        }
    
        public double getCost(){
            return cost;
        }
    
        @Override
        public int compareTo(Node1 o) {
            return Double.compare(this.cost, o.cost);
        }
    }