C#,大规模图(Large Graph)的均匀成本搜索之迪杰斯特拉(Dijkstra)算法与源代码

均匀成本搜索

均匀成本搜索迪杰斯特拉算法的变体。这里,我们不是将所有顶点插入到一个优先级队列中,而是只插入源,然后在需要时一个接一个地插入。在每一步中,我们检查项目是否已经在优先级队列中(使用访问数组)。如果是,我们执行减少键,否则我们插入它。 这个 Dijkstra 的变体对于无限图和那些太大而无法在内存中表示的图很有用。均匀成本搜索主要用于人工智能

均匀成本搜索类似于迪杰斯特拉算法。在该算法中,从起始状态开始,我们将访问相邻的状态,并将选择代价最小的状态,然后我们将从所有未访问的状态和访问状态的相邻状态中选择下一个代价最小的状态,这样,我们将尝试到达目标状态(注意,我们不会继续通过目标状态的路径),即使我们到达目标状态,我们也将继续搜索其他可能的路径(如果有多个目标)。我们将保持一个优先级队列,该队列将给出来自被访问状态的所有相邻状态中成本最低的下一个状态。


2 均匀成本搜索源程序

using System;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    public static class LargeGraph
    {
        private static List<List<int>> graph = new List<List<int>>();

        // Tuple 多元组数据
        private static Dictionary<Tuple<int, int>, int> cost = new Dictionary<Tuple<int, int>, int>();

        public static List<int> Uniform_Cost_Search(List<int> goal, int start)
        {
            List<int> answer = new List<int>();

            List<Tuple<int, int>> queue = new List<Tuple<int, int>>();

            for (int i = 0; i < goal.Count; i++)
            {
                answer.Add(int.MaxValue);
            }

            queue.Add(new Tuple<int, int>(0, start));

            Dictionary<int, int> visited = new Dictionary<int, int>();

            int count = 0;

            while (queue.Count > 0)
            {
                Tuple<int, int> q = queue[0];
                Tuple<int, int> p = new Tuple<int, int>(-q.Item1, q.Item2);

                queue.RemoveAt(0);

                if (goal.Contains(p.Item2))
                {
                    int index = goal.IndexOf(p.Item2);

                    if (answer[index] == int.MaxValue)
                    {
                        count++;
                    }
                    if (answer[index] > p.Item1)
                    {
                        answer[index] = p.Item1;
                    }
                    queue.RemoveAt(0);

                    if (count == goal.Count)
                    {
                        return answer;
                    }
                }
                if (!visited.ContainsKey(p.Item2))
                {
                    for (int i = 0; i < graph[p.Item2].Count; i++)
                    {
                        queue.Add(new Tuple<int, int>((p.Item1 + (cost.ContainsKey(new Tuple<int, int>(p.Item2, graph[p.Item2][i])) ? cost[new Tuple<int, int>(p.Item2, graph[p.Item2][i])] : 0)) * -1,
                        graph[p.Item2][i]));
                    }
                }
                visited[p.Item2] = 1;
            }

            return answer;
        }
    }
}

3 代码格式

using System;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public static class LargeGraph{private static List<List<int>> graph = new List<List<int>>();// Tuple 多元组数据private static Dictionary<Tuple<int, int>, int> cost = new Dictionary<Tuple<int, int>, int>();public static List<int> Uniform_Cost_Search(List<int> goal, int start){List<int> answer = new List<int>();List<Tuple<int, int>> queue = new List<Tuple<int, int>>();for (int i = 0; i < goal.Count; i++){answer.Add(int.MaxValue);}queue.Add(new Tuple<int, int>(0, start));Dictionary<int, int> visited = new Dictionary<int, int>();int count = 0;while (queue.Count > 0){Tuple<int, int> q = queue[0];Tuple<int, int> p = new Tuple<int, int>(-q.Item1, q.Item2);queue.RemoveAt(0);if (goal.Contains(p.Item2)){int index = goal.IndexOf(p.Item2);if (answer[index] == int.MaxValue){count++;}if (answer[index] > p.Item1){answer[index] = p.Item1;}queue.RemoveAt(0);if (count == goal.Count){return answer;}}if (!visited.ContainsKey(p.Item2)){for (int i = 0; i < graph[p.Item2].Count; i++){queue.Add(new Tuple<int, int>((p.Item1 + (cost.ContainsKey(new Tuple<int, int>(p.Item2, graph[p.Item2][i])) ? cost[new Tuple<int, int>(p.Item2, graph[p.Item2][i])] : 0)) * -1,graph[p.Item2][i]));}}visited[p.Item2] = 1;}return answer;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/698564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB中的稀疏矩阵和密集矩阵

在MATLAB中&#xff0c;矩阵可以表示为密集或稀疏格式。通常&#xff0c;矩阵默认以密集格式存储&#xff0c;这意味着每个元素都明确地存储在内存中&#xff0c;无论它的值是多少。然而&#xff0c;当矩阵含有大量的零元素时&#xff0c;这种存储方式就会变得非常低效。为了更…

Java JDK 下载和配置

Java JDK 下载 下载网址&#xff1a;https://www.oracle.com/java/technologies/javase/jdk21-archive-downloads.html jdk文件夹的目录介绍 bin: 主要存放的是Java的编译器、解析器等工具。 jre&#xff1a;Java runtime environment, Java 运行时环境。 jre/bin:Java平台…

学会如何打印菱形

打印菱形 题目描述&#xff1a;解法思路&#xff1a;解法代码运行结果&#xff1a; 题目描述&#xff1a; 输入⼀个整数n&#xff0c;打印对应2*n-1行的菱形图案&#xff0c;比如&#xff0c;输入7&#xff0c;输出如下图案&#xff0c;图案总共13行 解法思路&#xff1a; …

如何实现一个规则研究区域内数据的提取(matlab)

在利用经验正交分解&#xff08;EOF&#xff09;进行某一个研究区域分析时&#xff0c;我们需要将研究区域转换成N*M的矩阵&#xff0c;其中N为空间维度&#xff0c;M为时间维度&#xff0c;这意味着我们之前的数据加上时间维度是三维的&#xff0c;即&#xff08;lon,lat,rg&a…

Translumo:基于.NET开发的开源的屏幕实时翻译工具

推荐一个高级实时屏幕翻译器&#xff0c;可用于游戏、视频实时翻译。 01 项目简介 Translumo是基于.Net开发的、开源屏幕翻译器软件&#xff0c;它可以实时检测并翻译屏幕上所选区域中出现的文本&#xff0c;如视频的字幕和图片中的文字等。 项目架构如下&#xff1a; 02 项…

【java面试系列】服务的限流

目录 一、常用的限流算法1.固定窗口计数器(计数器算法)2 滑动窗口计数器算法3. 漏桶算法4 令牌桶算法(`常用`)Google开源项目Guava中的RateLimiter使用的就是令牌桶控制算法二、 分布式限流1、网关层(Nginx、Openresty、Spring Cloud Gateway等)流量限制nginx限流Spring Cl…

【MySQL初阶】索引与事务

1. 索引 1.1 索引基本概念 1.1.1 索引介绍 索引(index)&#xff1a;是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或者多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。&#xff08;具体细节在My…

OpenCV笔记4:级联分类器实现嘴部检测

OpenCV 嘴部检测 """ 嘴部区域检测 1. 静态图像检测嘴部区域创建分类器加载特征文件检测图像绘制嘴部区域显示 2. 切换为摄像头 """ import cv2 import numpy as npclass FaceDetect:def __init__(self):# 级联分类器# 创建级联分类器&#xf…

AI绘画巅峰对决:Stable Diffusion 3与DALL·E 3原理深度比较

最近&#xff0c;Stable Diffusion 3 的预览版已经亮相啦&#xff01; 虽然这个AI绘画模型还没全面上线&#xff0c;但官方已经开启预览申请通道了。 https://stability.ai/stablediffusion3 而且好消息是&#xff0c;后面还会推出开源版本哦&#xff01; 这个模型套件真的…

数字化转型导师坚鹏:政府数字化转型案例研究(包括省市政府)

政府数字化转型案例研究&#xff08;包括省市政府&#xff09; 课程背景&#xff1a; 很多地方政府存在以下问题&#xff1a; 不清楚标杆省政府数字化转型的成功案例 不清楚直辖市政府数字化转型的成功案例 不清楚地级市政府数字化转型的成功案例 课程特色&#xff1a…

ORA-02062: distributed recovery received DBID 9ad10df5, expected 38cc1cd5

今晚做重启维护&#xff0c;发现节点二上报错如下 Fri Feb 23 21:47:43 2024 Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl2/trace/orcl2_reco_58540.trc: ORA-02062: distributed recovery received DBID 9ad10df5, expected 38cc1cd5 Errors in file /u01/app/oracl…

Node.js安装及环境配置

1. 前言 Node.js简介 Node.js 是一个开源的、跨平台的 JavaScript 运行环境&#xff0c;它允许开发者使用 JavaScript 编写服务器端代码。Node.js 基于 Google 的 V8 JavaScript 引擎构建&#xff0c;该引擎是 Chrome 浏览器中用于解析和执行 JavaScript 的核心组件。因此&am…

【Java】接口及其实现(实验四)

目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 了解接口的作用掌握接口的定义与实现掌握接口的回调 二、实验内容 1. 定义一个接口Human&#xff0c;其中有一无参的、返回类型为void的方法speak&#xff08;&#xff09;&#xff1b;定义类Student实现接口&a…

【ECharts】调用接口获取后端数据的四种方法

使用eacharts做大屏&#xff0c;需要使用后端数据&#xff0c;下面的方法是自己试过有效的&#xff0c;有什么不对的&#xff0c;望各位大佬指点。 目录 方法一&#xff1a;在mounted中使用定时器调用eacharts方法&#xff08;定时器可以获取到data中的数据&#xff09; 方法…

Stable Diffusion 3震撼发布模型与Sora同架构

Prompt&#xff1a;Epic anime artwork of a wizard atop a mountain at night casting a cosmic spell into the dark sky that says "Stable Diffusion 3" made out of colorful energy Stability AI发布Stable Diffusion 3文本到图像模型。该模型采用扩散变换架构…

SQL库操作

1、创建数据库 概念 创建数据库&#xff1a;根据项目需求创建一个存储数据的仓库 使用create database 数据库名字创建 数据库层面可以指定字符集:charset/character set 数据库层面可以指定校对集:collate 创建数据库会在磁盘指定存放处产生一个文件夹 创建语法 create …

【算法分析与设计】1的个数

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位…

【初始RabbitMQ】交换机的实现

交换机概念 RabbitMQ消息传递模型的核心思想就是&#xff1a;生产者生产的消息从不会直接发送到队列。实际上&#xff0c;通常生产者不知道这些消息会传递到那些队列中 相反&#xff0c;生产者只能将消息发送到交换机&#xff0c;交换机的工作内容也很简单&#xff0c;一方面…

云服务器发展史

在数字化浪潮的推动下&#xff0c;云服务器作为信息技术领域的一颗璀璨明珠&#xff0c;其发展史是一部科技进步和创新思维的缩影。从最初的概念提出到现如今的广泛应用&#xff0c;云服务器经历了翻天覆地的变化&#xff0c;不仅极大地推动了信息技术的发展&#xff0c;也彻底…

JavaScript运算符

文章目录 运算符介绍算术运算符递增和递减运算符比较运算符逻辑运算符短路运算逻辑与 逻辑或 赋值运算符运算符优先级 运算符介绍 算术运算符 %取余运算符的主要用途&#xff1a; 判断某个数是否能被某个数整除。 浮点数的精度问题&#xff1a; 所以&#xff1a;不要直接判断…