统一成本搜索实施

2023-12-20

I am trying to implement the Uniform Cost Search after watching the "Intro to AI" course in Udacity. However, my algorithm is not getting the correct path. Have been trying the whole day before posting here. I have added a map to help to visualize the scene. The algorithm should find the shortest weighted path from Arad to BucharestRomania Map

import java.util.PriorityQueue;
import java.util.HashSet;
import java.util.Set;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;

//diff between uniform cost search and dijkstra algo is that UCS has a goal

public class UniformCostSearchAlgo{
    public static void main(String[] args){

        //initialize the graph base on the Romania map
        Node n1 = new Node("Arad");
        Node n2 = new Node("Zerind");
        Node n3 = new Node("Oradea");
        Node n4 = new Node("Sibiu");
        Node n5 = new Node("Fagaras");
        Node n6 = new Node("Rimnicu Vilcea");
        Node n7 = new Node("Pitesti");
        Node n8 = new Node("Timisoara");
        Node n9 = new Node("Lugoj");
        Node n10 = new Node("Mehadia");
        Node n11 = new Node("Drobeta");
        Node n12 = new Node("Craiova");
        Node n13 = new Node("Bucharest");
        Node n14 = new Node("Giurgiu");

        //initialize the edges
        n1.adjacencies = new Edge[]{
            new Edge(n2,75),
            new Edge(n4,140),
            new Edge(n8,118)
        };

        n2.adjacencies = new Edge[]{
            new Edge(n1,75),
            new Edge(n3,71)
        };

        n3.adjacencies = new Edge[]{
            new Edge(n2,71),
            new Edge(n4,151)
        };

        n4.adjacencies = new Edge[]{
            new Edge(n1,140),
            new Edge(n5,99),
            new Edge(n3,151),
            new Edge(n6,80),
        };

        n5.adjacencies = new Edge[]{
            new Edge(n4,99),
            new Edge(n13,211)
        };

        n6.adjacencies = new Edge[]{
            new Edge(n4,80),
            new Edge(n7,97),
            new Edge(n12,146)
        };

        n7.adjacencies = new Edge[]{
            new Edge(n6,97),
            new Edge(n13,101),
            new Edge(n12,138)
        };

        n8.adjacencies = new Edge[]{
            new Edge(n1,118),
            new Edge(n9,111)
        };

        n9.adjacencies = new Edge[]{
            new Edge(n8,111),
            new Edge(n10,70)
        };

        n10.adjacencies = new Edge[]{
            new Edge(n9,70),
            new Edge(n11,75)
        };

        n11.adjacencies = new Edge[]{
            new Edge(n10,75),
            new Edge(n12,120)
        };

        n12.adjacencies = new Edge[]{
            new Edge(n11,120),
            new Edge(n6,146),
            new Edge(n7,138)
        };

        n13.adjacencies = new Edge[]{
            new Edge(n7,101),
            new Edge(n14,90),
            new Edge(n5,211)
        };

        n14.adjacencies = new Edge[]{
            new Edge(n13,90)
        };

        UniformCostSearch(n1,n13);

        List<Node> path = printPath(n13);

        System.out.println("Path: " + path);

    }

    public static void UniformCostSearch(Node source, Node goal){

        source.pathCost = 0;
        PriorityQueue<Node> queue = new PriorityQueue<Node>(20, 
            new Comparator<Node>(){

                //override compare method
                public int compare(Node i, Node j){
                    if(i.pathCost > j.pathCost){
                        return 1;
                    }

                    else if (i.pathCost < j.pathCost){
                        return -1;
                    }

                    else{
                        return 0;
                    }
                }
            }

        );

        queue.add(source);
        Set<Node> explored = new HashSet<Node>();
        boolean found = false;

        //while frontier is not empty
        do{

            Node current = queue.poll();
            explored.add(current);


            if(current.value.equals(goal.value)){
                found = true;


            }




            for(Edge e: current.adjacencies){
                Node child = e.target;
                double cost = e.cost;
                child.pathCost = current.pathCost + cost;



                if(!explored.contains(child) && !queue.contains(child)){

                    child.parent = current;
                    queue.add(child);

                    System.out.println(child);
                    System.out.println(queue);
                    System.out.println();

                }


                else if((queue.contains(child))&&(child.pathCost>current.pathCost)){

                    child.parent=current;
                    current = child;

                }


            }
        }while(!queue.isEmpty());

    }

    public static List<Node> printPath(Node target){
        List<Node> path = new ArrayList<Node>();
        for(Node node = target; node!=null; node = node.parent){
            path.add(node);
        }

        Collections.reverse(path);

        return path;

    }

}

class Node{

    public final String value;
    public double pathCost;
    public Edge[] adjacencies;
    public Node parent;

    public Node(String val){

        value = val;

    }

    public String toString(){
        return value;
    }

}

class Edge{
    public final double cost;
    public final Node target;

    public Edge(Node targetNode, double costVal){
        cost = costVal;
        target = targetNode;

    }
}

哇。我设法弄清楚!显然,我添加了 2 向边,而不是仅 1 向边。我删除了 e2,而不是让边 e1 从节点 A 到节点 B,边 e2 从节点 B 到节点 A,从而使其成为单个有向图。因此,该算法有效!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

统一成本搜索实施 的相关文章

  • 仅运行相应源代码已更改的单元测试?

    我正在 Jenkins CI 服务器中运行单元测试和 Selenium 测试 众所周知 在大型项目中测试需要很长时间才能运行 Java 是否有一个工具 框架只能触发其源代码已更改的测试 这是因为并非每次对 SCM 的提交都会影响源代码的所有
  • 如何打印JTable中选定的行

    我尝试使用主 JTable 的选定行和相同的头和单元格渲染来创建临时 JTable 但是当我尝试打印它时 我只得到一个带有线边框的空矩形 我在如何打印 JTable 的特定行 列 https stackoverflow com questi
  • 配置 Eclipse 将 App Engine 类预先捆绑到单个 JAR 中以加快预热速度

    在与另一家同样使用 App Engine 的公司的同事进行讨论后 他告诉我 他通过以下步骤成功地将应用程序预热时间从约 15 秒缩短到约 5 秒 配置 Eclipse 将编译过程中生成的类捆绑到单个 JAR 文件中 配置 Eclipse 以
  • 调试器不会停止在 Intellij IDEA 中的源代码处

    我有一个相当奇怪的问题 无法使用 Intellij IDEA 解决 我正在解析电子邮件文件org apache james mime4j包裹 但我的邮件文件格式不兼容Date 标头 因此 我从 mime4j 源创建了模块 并从磁盘中删除了
  • 内部/匿名类的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 匿名类和静态内部类的最佳实践 设计和性能方面 是什么 就我个人而言 我认为静态内部类提供了更好的封装 并且应该提供更好的性能 因为它们无法访问类
  • TableModel setCellEditable 并自动将值设置回 false

    我目前正在尝试在 JTable 中实现 JPopupMenu 它允许解锁单元格以进行编辑 Override public void actionPerformed ActionEvent e if e getActionCommand Un
  • 如何使用Gson将JSONArray转换为List?

    在我的 Android 项目中 我试图将收到的 JSONArray 转换为列表 在 的帮助下这个答案 https stackoverflow com questions 8371274 how to parse json array in
  • 覆盖乔达一周的第一天?

    是否有可能覆盖乔达弱的第一天sunday 因为 Joda 使用Monday作为一周的第一天 如果有办法的话 谁能解释一下 我在 SOF 中提到了以下主题 乔达时间 一周的第一天 https stackoverflow com questio
  • 相对重力

    我最近开始使用jMonkey引擎 这非常好 但我在尝试实现相对重力时陷入了困境 我想让行星彼此围绕轨道运行 不一定是完美的圆形轨道 取决于速度 所以每个对象都应该影响其他对象 我现在拥有的 关闭全球重力 bulletAppState get
  • 是否有适用于 Java 的 CalDAV 客户端库? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想使用 CalDAV 协议与我的日
  • Java 日期和 MySQL 时间戳时区

    我正在编辑一段代码 其基本功能是 timestamp new Date 然后坚持下去timestamp中的变量TIMESTAMPMySQL 表列 然而 通过调试我看到Date显示在正确时区的对象 GMT 1 当持久化在数据库上时 它是GMT
  • 为什么我无法使用 HttpUrlConnection 上传第一个文件块?

    在我的项目中 我应该从一台服务器逐块下载文件 并将每个块立即上传到另一台服务器 我有一个应该下载的文件的 URL 我们就这样称呼它吧downloadUrl 因此 这就是我逐块下载文件的方式 val chunkSize 1024 1024 B
  • jasper 报告文件中出现错误

    首先 我在 iReport 5 1 0 中创建一个 R D1 jrxml 文件 我执行该报告的 Java 代码如下所示 import java sql Connection import java sql DriverManager imp
  • Java泛型类型参数中的问号是什么意思? [复制]

    这个问题在这里已经有答案了 这是取自斯坦福解析器附带的一些示例的一小段代码 我已经用 Java 进行了大约 4 年的开发 但从未对这种风格的代码应该表示什么有非常深入的理解 List
  • 如何预先填充 JFileChooser 将“文件名”?

    我打算用数据库中的名称填充 JFileChooser 但使用标准 JFileChooser 对话框进行加载 删除 保存和另存为 我想给用户留下这样的印象 他们正在处理文件系统 而在后端使用数据库来保存更改 用户不应该能够浏览到不同的目录进行
  • 当框架被拖动时,如何设置 JWindow 的位置位于文本字段下方?

    我正在制作一个自动完成项目 就像谷歌一样 我的框架中有一个 jtextfield 每当我在该字段中输入内容时 该文本字段下方就会出现一个 JWindow 并且该窗口来自另一个类 现在的问题是 每当我拖动框架时 如何使窗口始终出现在文本字段下
  • 如何使用 iBatis (myBatis) 的注释进行 IN 查询?

    我们只想在 MyBatis 中使用注释 我们确实在努力避免使用 xml 我们尝试使用 IN 子句 Select SELECT FROM blog WHERE id IN ids List
  • SWT StyledText 有高度限制吗?

    我正在尝试创建一个应用程序 其中包含在 ScrolledComposite 中显示的 StyledText 框 我在 StyledText 框中显示大量行时遇到困难 超过 2 550 行似乎会导致问题 StyledText 框本身不能有滚动
  • 与手动搜索列表相比,Collections.binarySearch 的性能如何?

    我想知道该使用哪一个 我有一份学生名单 我想用他的名字搜索一个学生 到目前为止 我是通过迭代列表手动完成的 如下所示 for int i 0 i lt list size i Student student list get i if st
  • Spring Boot 2 中的 401 代替 403

    With 春季启动 https projects spring io spring boot 1 5 6 发布我能够发送 HTTP 状态代码401代替403如中所述如果请求未经身份验证的uri 如何让Spring Security响应未经授

随机推荐

  • gitignore 不忽略文件夹

    在我的项目的根目录中我有一个foo文件夹 在 的里面foo文件夹我有一个bar文件夹 我想忽略对我的内部所有文件的所有更改bar文件夹 我的里面有这个gitignore foo bar 检查该文件夹 它存在并且包含要忽略的文件 gitign
  • 此版本的 Microsoft.AspNetCore.All 仅与 netcoreapp2.1 目标框架兼容

    当我从 2 0 升级到 NET Core 2 1 后尝试将应用程序发布到 Web 服务器时 收到以下消息 此版本的 Microsoft AspNetCore All 仅与 netcoreapp2 1 目标框架兼容 请以 netcoreapp
  • 在 DOM 元素上调用自定义方法

    我想在 DOM 元素上调用自定义方法 像这样 div div 我该如何开发这个问题 是否有必要使用jQuery 您不需要使用 jQuery 您可以使用document getElementById MyObject 获取 DOM 节点的引用
  • 加载库 193

    我正在创建一个 C CLI dll 它将加载到旧版 C 应用程序中 遗留应用程序通过传统的 LoadLibrary 调用来完成此操作 应用程序和 C CLI dll 均以 64 位模式编译 当发生 LoadLibrary 调用时 它会失败并
  • Rails 中的社交网络 - 哪个框架

    我应该使用 社区引擎 Insoshi 少爱 轨道空间 自己卷 我希望快速建立一个支持移动浏览的社交网络 虽然我熟悉 Ruby 和 Rails 但我不是专家 已经构建了一些基本的 Rails 应用程序 已经编写了一堆用于企业集成的 Ruby
  • 创建方案 .avsc Avro 时出现问题

    我在创建 avro 方案时遇到问题 下面我将放置我的方案 推特 avsc type record name twitter schema namespace com miguno avro fields name id type recor
  • 发送 X11 点击事件不适用于某些窗口

    以下代码片段在大多数情况下都有效 除了在某些窗口中 例如 在最新的 Ubuntu 下 它无法在文件资源管理器中选择文件夹 它似乎在其他地方都适用 但这个差距是巨大的 我怀疑这与我使用 XQueryPointer 的方式有关 但我已经尝试了几
  • 在 Laravel 4 中构建 SAAS 的正确方法

    好吧 大约一年前 我编写了一个网络应用程序 可以帮助为我父亲的公司组织约会 现在他 没有它就无法做生意 我决定建立一个 SAAS 订阅模式并向公众开放 它目前基于 codeigniter 和 php 构建 我认为这不太适合 SAAS 版本
  • Java 中的 InterruptedException 处理

    以下处理方式有什么区别InterruptedException 最好的方法是什么 try catch InterruptedException e Thread currentThread interrupt OR try catch In
  • 检查给定字符串是否有效匹配一组前缀

    使用什么算法来检查给定字符串是否与一组前缀匹配 以及该组中的哪个前缀 其他变体 给定路径和一组目录 如何检查路径是否在一组目录中 假设没有符号链接 或者它们不重要 我对算法的描述或名称感兴趣 或者解决这个问题的 Perl 模块 或者可以用来
  • CakePHP:使用不同数据库关联两个模型?

    我有两个模型 Plant 和 Emp 它们具有 Has And Belongs To Many 关系 我已将它们配置为关联 并且获取每个数据的查询是正确的 但问题是 Plant 和 Emp 位于不同的数据库上 Emp 位于数据库 1 上 P
  • 如何使用 C# 向文件中插入字符

    我有一个巨大的文件 我必须在其中的特定位置插入某些字符 在 C 中执行此操作而无需再次重写整个文件的最简单方法是什么 文件系统不支持在文件中间 插入 数据 如果您确实需要一个可以以排序方式写入的文件 我建议您考虑使用嵌入式数据库 您可能想看
  • 如何使用捆绑器重新安装 gem

    I did a bundle show并获取 gem 目录的完整路径 不幸的是 我使用删除了目录rm r gem path 然后我的 Rails 应用程序不再工作了 如果我尝试启动服务器或启动 Rails 控制台 它会输出以下错误
  • 地图和列表中的 ModCount

    在调试 eclispse 中的集合时 我只是检查是否存在名为 modCount 的东西 例如 如果我们调试列表 我们将在调试中检查此 modCount 代表的内容时看到 请告知 请参阅 javadoc 该列表的结构修改次数 结构修改是那些改
  • 将不同的 CSS 应用于不同的 jQuery 日期选择器

    我有几个与输入字段绑定的日期选择器 它们以通常的方式创建 input1 datepicker options1 input2 datepicker options2 现在我想为每个领域设置不同的样式 但是当在 Firefox 中检查页面时
  • 将多个列表理解转换为单个列表理解

    我正在尝试使用列表理解来更改列表的值我可以通过使用 3 个列表理解来做到这一点 clr 1 2 2 1 3 1 2 3 clr green if i 1 else i for i in clr clr yellow if i 2 else
  • 阿普塔纳工作室3.3.1。 JavaScript 代码补全

    我是 Aptana 的新手 刚刚开始了一个本质是 Web 的项目 我在代码完成方面遇到两个问题 在网上做了一些研究 但没有找到解决方案 1 我有这两行代码 var script document createElement script s
  • 如何在 XML+XSL 生成的 HTML 中使用 jQuery 来操作 UL?

    这是 XML
  • Kotlin:迭代 JSONArray

    我正在使用 Kotlin 和 Realm 编写 Android 应用程序 我有一个 JSONArray 我想迭代该数组中的 JSONObject 以便将它们加载到 Realm 数据库类中 境界等级 import io realm Realm
  • 统一成本搜索实施

    I am trying to implement the Uniform Cost Search after watching the Intro to AI course in Udacity However my algorithm i