带环检测的一致代价搜索(Uniform Cost Search, UCS) Python实现

罗马尼亚旅行问题
求从城市Arad到城市Bucharest的最短路径


States:表示当前所处的城市;
Actitons:表示在图中进行移动的动作
Initial state:表示初始位置,也就是起点城市
Goal:表示目标城市


算法思想:

​ 一致代价搜索算法,维护三个线性表,边界表(frontier表),已扩展结点表(close表),前驱结点表(pre表)。考虑当前边界中的最小代价的结点(这部分用优先队列实现)对其进行扩展,将其子结点放入边界中,已经扩展过的结点放入close表,从边界表中取出结点的时候进行目标检测,(这里与BFS不同,BFS是在将结点放入边界时就对目标进行检测);在算法执行过程中进行Cycle checking(环检测), 如果结点已经扩展过,则不能放入边界表中。

算法例题:

给定无向图,及图上两个节点,求其最短路径及长度

要求:使用Python实现带环检测的一致代价搜索(uniform-cost)算法

输入(统一格式,便于下周的验收)

第1行:节点数m 边数n(中间用空格隔开,下同);

第2行到第n+1行是边的信息,每行是:节点1名称 节点2名称 边权;

第n+2行开始可接受循环输入,每行是:起始节点名称 目标节点名称。

输出(格式不限)

最短路径及其长度。

Python实现代码:
算法实现中采用了优先队列作为frontier表,将代价最小的结点放在表头。具体的细节可以看代码中的注释。

from cmath import cos
from email import header
from importlib.resources import path
from json.tool import main
from os import pread, stat
from re import T
import re
from stat import S_IEXEC
import heapq
class Node:def __init__(self,state,pre,cost) -> None:self.state = stateself.pre = preself.cost = cost
edges = [] # 边集
closed = [] # 已经扩展过的结点
frontier = [] #待扩展的结点
path = []
def is_in_frontier(state):for f in frontier:if state == f[1]:return Truereturn Falsedef print_path(result): #打印路径while True:path.append(result[1])if result[2] == None:breakresult = result[2]path.reverse()def main():m, n = map(int,input().split(" ")) #"Please enter the number of vertex and edge:"for _ in range(n):n1, n2, w= input().split(" ")w = int(w)edges.append({'c1':n1, 'c2':n2, 'w':int(w)})while True :s_city, d_city = input().split(" ")ans = uniform_cost_search(s_city, d_city)  print('Shortest distance from %s to %s is %d' %(s_city,d_city,ans[0]))print_path(ans)print('Path:',path) def uniform_cost_search(start, dest):heapq.heapify(frontier)heapq.heappush(frontier,(0,start,None))  # 元组(heapq不支持字典) 分别是 w, state, prewhile len(frontier):t = heapq.heappop(frontier)if t[1] == dest:  # 目标检测return tclosed.append(t[1])for edge in edges:des = ''if edge['c1'] == t[1]:  # 由于是无向图,当前的城市可以作为边的起点,也可以作为终点des = edge['c2']elif edge['c2'] == t[1]:des = edge['c1']if des == '':continuechild = {'state': des, 'pre': t, 'w': t[0]+edge['w']}  # 将子结点封装成一个字典,分别是子结点的状态, 父亲结点, costif child['state'] not in closed:  # 环检测(如果该结点没有被扩展过)heapq.heappush(frontier, (child['w'], child['state'], child['pre']))return Noneif __name__ == '__main__':main()

运行结果:

对于题目中给定的图来说,从a城市走到z城市的最短路径为7,对应的路为a->b->e->d->z。

补充:

在开始学习一致代价搜索算法的时候,我隐隐约约地觉得好像在哪见过这个算法,但是又好像没见过。其实这个算法跟Dijkstra算法很像,其核心内容都很相似,但是又不完全相同。

在Dijkstra算法中,我们用图中的所有顶点初始化顶点表。因此,Dijkstra算法只适用于已知所有顶点和边的显式图。

而一致代价搜索算法从源顶点开始,并逐渐遍历必要的图部分。因此,它适用于显式图和隐式图。

【人工智能】一致代价搜索(Uniform Cost Search, UCS) Python实现相关推荐

  1. Uniform Cost Search (UCS)

    BFS用于找到每个边的权值是一样的图的最短路径,如果图中每个边的权值不一样了,就用到了UCS. 参考了https://blog.csdn.net/jdh99/article/details/80872 ...

  2. CS 188 (4) Uniform Cost Search( 统一代价搜索算法)

    本文要实现 Uniform Cost Search( 统一代价搜索算法) ,首先搜索总成本最小的节点,  统一代价搜索算法搜索到达目标. PriorityQueue实现一个优先级队列的数据结构,每个插 ...

  3. AI(人工智能:一种现代的方法)学习之:无信息搜索(uninformed search)算法——广度优先搜索、深度优先搜索、Uniform-cost search

    文章目录 参考 搜索算法 深度优先搜索 depth-first search 性能分析 完整性 complete 最优性 optimal 时间复杂度 空间复杂度 广度优先搜索 breadth-firs ...

  4. 图搜索算法UCS(一致代价搜索)通俗易懂图示详解

    一致代价搜索实际上是在BFS(广度优先搜索算法)的基础上进行扩展的,我们在上一篇博客图搜索算法BFS和DFS通俗易懂图示详解中提到,BFS是基于队列数据结构的,既然UCS是BFS的扩展,那么UCS一定 ...

  5. 3.4.2 一致代价搜索 (uniform-cost search) --- 实现代码附详细注释

    import pandas as pd from pandas import Series, DataFrame# 城市信息:city1 city2 path_cost _city_info = No ...

  6. 一致代价搜索(UCS)的原理和代码实现

    一:基本原理 一致代价搜索是在广度优先搜索上进行扩展的,也被成为代价一致搜索,他的基本原理是:一致代价搜索总是扩展路径消耗最小的节点N.N点的路径消耗等于前一节点N-1的路径消耗加上N-1到N节点的路 ...

  7. python反恐精英代码类似的编程_敲代码学Python:CS188之实现一致代价搜索

    照例先上视频:人工智能导论之一致代价搜索演示https://www.zhihu.com/video/1176109979474620416 再上算法伪代码描述: 接着,就是代码: def unifor ...

  8. 神经架构搜索(Neural Architecture Search,NAS)介绍

    神经架构搜索Neural Architecture Search,NAS介绍 Introduction Intractable Search Space Non transferable optima ...

  9. 贪心搜索(greedy search)、集束搜索(beam search)、随机采样(random sample)

    当我们训练完成一个自然语言生成模型后,需要使用这个模型生成新的语言(句子),如何生成这些句子,使用如下的方法:贪心搜索,集束搜索,随机搜索. 贪心搜索(greedy search)/采样(Sampli ...

最新文章

  1. 设置Sysctl.conf用以提高Linux的性能(最完整的sysctl.conf优化方案)
  2. Vivado安装器件不全
  3. python格式化字符串_Python的3种字符串格式化方法,哪种你最喜欢?
  4. ntop和Cacti
  5. Reactive Extensions(Rx) 学习
  6. pb mysql odbc_PB 连接Mysql ODBC/JDBC
  7. jQuery和MooTools的真正区别
  8. 活久见,自己创造的框架竟然比开源的好用
  9. HTML、CSS --chrome书签整理
  10. python精彩编程200例百度_完整word版,python经典例题100道
  11. vscode 打开函数表_效率倍增!10个超级好用的VScode使用技巧!
  12. dijkstra算法学习笔记
  13. Atitit httpclient 概述  rest接口
  14. log4j2.xml 配置文件详解
  15. 智能电导率系统电路设计详解
  16. 线性代数学习笔记(二)——n阶行列式
  17. 北京亿阳信通java笔试题_亿阳信通笔试
  18. 梁宁《产品思维》之26三级火箭
  19. 电脑破解wifi密码(至少连过1次的才可以)
  20. python发微信提醒天气冷了注意保暖_天气变冷了,用Python给父母制作一个天气提醒小助手~...

热门文章

  1. 在linux下使用视频采集卡
  2. JavaScript函数调用方式:简单调用+在超链接中调用JavaScript函数+在事件中调用JavaScript函数
  3. 第四章 “我要点爆”微信小程序云开发之疯狂点击与糖果点爆页面制作
  4. react基础知识1
  5. CAD字体显示错乱问题解决方案
  6. 手把手教你系列 - Particle粒子特效(上)
  7. 【Python探讨】PyQt5、request模块联合编写的英雄联盟全皮肤下载器| 附源代码
  8. php 换行 html_PHP实现html源码中回车换行输出_PHP教程
  9. 511遇见易语言流程控制(循环判断首和判断循环首)
  10. Python/PHP:免费IP归属地查询接口和通过ip获取大致位置信息