searh算法库

libsearch的Python项目详细描述


libsearch | buildcodecov

说明

一种搜索算法库,用于State Space Problems中,解决方案基于对不同状态集合的搜索,从初始状态开始,并遵循特定规则从该状态到下一个可能的状态,直到达到目标状态。在

  • 初始状态:表示问题当前描述的状态,从 搜索将开始。在
  • 状态空间:所有可能状态的集合
  • Actions:以一个状态作为参数并返回一组结果状态的函数。在
  • 目标状态:由特定规则定义的终止搜索的状态或一组最终状态 并表明找到了可接受的解决方案。在

实现的算法

支持以下算法。在

Blind Search

  • 深度优先搜索
  • 广度优先搜索
  • 迭代深化
  • 分界

启发式搜索

  • 最佳优先搜索
  • 一颗星星
  • 迭代深化(A星)

入门

安装最新版本:

pip install libsearch

使用

^{pr2}$

function替换为您希望使用的算法,方法如下:在括号中可以找到每个函数所需的参数。(actions是上面描述的函数,它从父状态返回子状态)

盲搜索算法:

depth_first_search(actions=actions,start=InitialState,goal=GoalState)
breadth_first_search(actions=actions,start=InitialState,goal=GoalState)
iterative_deepening(actions=actions,start=InitialState,goal=GoalState)

For Branch and Bound应提供一个路径成本函数,该函数返回达到某个状态的成本。

branch_and_bound(actions=actions,start=InitialState,goal=GoalState,path_cost=path_cost)

启发式搜索算法:

启发式:为每个问题定义的用户唯一的启发式函数,该函数返回从当前状态到达目标状态的估计成本。

best_first_search(actions=actions,start=InitialState,goal=GoalState,heuristic=heuristic)
a_star(actions=actions,start=InitialState,goal=GoalState,heuristic=heuristic)
iterative_deepening_a_star(actions=actions,start=InitialState,goal=GoalState,heuristic=heuristic)

(可选参数)

为了进行计算,可以将以下参数设置为上面所需的参数,以返回已探索状态的数量或/和算法在达到解之前所探索的状态的数量。

count_states=True#if True it will return the number of explored states too. num_exploredshow_explored=True#if True it will return the explored(closed) set too.

溶液

算法返回的解决方案是一个python ,由(list_of_actions,list\u states)
list\u actions:到达目标状态路径上的每个状态所采取的操作
list\u states:从初始状态到目标状态的路径

示例

分枝定界算法在著名算法问题Traveling Salesman (TSP).
在以下完整的加权图中,每个城市用字母表示,每条路径都有路径成本:

我们使用字典在python中实现此图:

tspGraph={'A':{'B':8,'C':5,'D':10,'E':8},'B':{'A':8,'C':7,'D':6,'E':6},'C':{'A':5,'B':7,'D':9,'E':3},'D':{'A':10,'B':6,'C':9,'E':4},'E':{'A':8,'B':6,'C':3,'D':4}}

在这个问题中,州是以字母表示的城市,而行为则是从一个城市到另一个城市的移动。 e、 g应用于状态“A”的动作“A-B”将产生新的状态“B”,其代价(权重)为8。在

在我们的模块中,我们导入了分支和绑定函数:

fromlibsearchimportbranch_and_bound

让我们把函数赋给一个变量(如解):

solution=branch_and_bound(actions=g.fullneighbors,start='A',goal='A',path_cost=g.path_cost)

如果我们要打印solution,我们将得到以下结果:

(['A-B', 'A-B-D', 'A-B-D-E', 'A-B-D-E-C', 'A-B-D-E-C-A'], ['B', 'D', 'E', 'C', 'A'])

第一个列表是操作(从每个字母(状态)移动到下一个字母(状态),后一个列表是表示到达目标状态“a”的路径的状态列表,而在我们的例子中,它与TSP问题中描述的初始状态相同。在

可选参数

如果我们想知道分支定界算法探索了多少个状态:

solution,num_explored=branch_and_bound(actions=g.fullneighbors,start='A',goal='A',path_cost=g.path_cost,count_states=True)

通过检查num_explored的值,我们可以看到在达到目标之前已经探索了68个状态(路径组合)。在

关于返回特定TSP问题的子状态的fullneighbors函数的实现,以及返回分配给每个路径的成本的路径成本函数的实现,可以在examples文件夹中的graph.py上找到。在

注释

这种将搜索算法作为函数的实现实际上可以用于任何可以定义为在状态空间中进行搜索的问题,只要用户定义actions函数从现有状态生成新状态,并且在启发式搜索的情况下,定义启发式函数来估计达到目标状态的成本。在

在examples文件夹中,您可以在迷宫问题上试验不同的算法maze.py。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何通过标记名检索多个标记中的元素以进行selenium自动化测试   java iText如何查找最后一行被拆分到下一页   java如何在hudson中的特定jdk上运行Findbugs和PMD?   如何确保java程序与java Environment 6兼容?   对形状进行分组,这样我就可以通过鼠标点击和java处理循环浏览它们   使用生成器映射对象时,java定义无效   maven Java:Struts2和IntelliJ供初学者使用   java子类不继承父类字段   java Android Grid View在Android版本kitkat上崩溃   java Hibernate从缓存返回错误的列表,即使预期的列表与缓存的列表不同   java SendGrid:模板和替换标记   用于普通生产者| Kafka流的java自定义分区器   安卓理解Java内部类中的作用域   无法从Android Studio中的非静态方法调用java非静态方法   比较两个XML响应的JavaXMLUnit   java使用keytool列出密钥   不使用Java客户端库将视频上传到YouTube数据API v3   java My While循环即使在满足条件时也不会结束   自动在外部存储字符串数据,以便以后在Java中使用