Python实现二分查找,python 2分查找

  Python实现二分查找,python 2分查找

  1.启发式搜索:算法a

  1)评价函数的一般形式:f(n )=g) n (h) n)))))))。

  G(n):从S0到Sn的实际成本(搜索的水平因子)))))))))))))。

  从h(n):到目标节点的估计代价称为启发式函数(搜索的纵向因子);

  特点:效率高,没有回头路,

  搜索算法

  打开表:存储要扩展的节点。

  关闭表:存储展开的节点。

  2)评价函数f(x )=g) x (h) x))))))))))))。

  在f(x )=g) x)的情况下,先搜索宽度。

  在f(x )=1/g(x) x的条件下,进行深度优先搜索。

  在f (x)=h (x)的情况下,成为全局优先搜索。

  比较f(x)的大小来确定节点的搜索顺序,也就是打开表中的顺序。

  3)将步骤1:初始节点S0放入开放表中;

  步骤2:当打开的表为空时,检索失败,您退出。

  从step:open移出的第一个节点n将放入CLOSED表中,用序号n表示;

  如果步骤4:目标节点Sg=N,则搜索成功并结束。

  如果步骤5:不可扩展,则进入步骤2;

  展开Step6:生成一系列子节点,经过以下处理后放入打开的表中,根据f值重新排列打开的表,转入step 2;

  删除重复的节点并修改返回指针。2.启发式搜索:A*算法

  1)评价函数的一般形式:

  F(n )=h*(n) h (n)和h) n )=h*(n)))))

  G(n),g(n):定义同一个A算法;

  From h*(n):到目标节点的最短路径;此时的A算法称为A*算法。

  2)程序的关键

  节点扩展:关闭表包含扩展状态,打开表包含未扩展状态。首先获得一个节点的可扩展方向,扩展后将父节点放入封闭表中。如果后续节点既不在关闭表中也不在打开表中,则插入打开表,表示该节点尚未展开。为了避免无限扩展,从打开的表中放弃节点的状态。如果是在开表中,在开表中留下比较两个矩阵的F值的较小值,然后按照F值对开表中的节点进行排序,pop提取最低的F值。

  解决方案的路径输出:从目标状态节点追溯到其父节点,并找到状态的开始。

  三。python代码的实现

  1-编码:utf-8-2 3。使用createdonsunsep 16143360313604020184 a *算法求解n数问题5并运行程序后,输入格式如下

  输入1011102行,每行用数字空格分隔。每行最后一位数字输入后,直接回车,输入第二行1213456141537816。请输入所需的矩阵b 171812319208042127652324 25 importnumpyasnp 26 import copy 27 import time 28 from operator 28 goal={ } 311 from num(:)Num元素获取Num在矩阵中的位置33 row _ Num=vec . shape[0]# Numpy-shape函数获取矩阵的维数34 line _ Num=vec . shape[1]3536:39 return,j44

  48ifx==0:#如果0在边缘则依据位置情况,减少0的可移动位置49行动。remove((1,0))50ify==0:51action.remove((0,-1))52 ifx==row _ num-1:53 action。remove((1,0))54 ify==line _ num-1:55 action。remove((0,1))5657返回列表(动作)5859定义结果(vec,动作):#移动元素,进行矩阵转化60(x,y)=get_location(vec,0)#获取0元素的位置61(a,b)=1行动#获取可移动位置6263n=vec[x a][y b]#位置移动,交换元素64s=复制。deepcopy(vec)65s[x a][y b]=066s[x][y]=n 6768返回6970 defget _ Manhattan dis(ve C1,vec2):#计算两个矩阵的曼哈顿距离,vec1为目标矩阵,vec2为当前矩阵C1路71号。C1。shape[1]73 dis=07475 for iinrange(row _ num):76 for jinrange(line _ num):77 if vec 1[I][j]!=vec2[i][j]andvec2[i][j]!=0:78k,m=get_location(vec1,ve C2[I][j])79d=ABS(I-k)ABS(j-m)80 dis=d 8182 return dis 8384 defexpand(p,actions,step):#actions为当前矩阵的可扩展状态列表,p为当前矩阵,步骤为已走的步数85儿童=[]#儿童用来保存当前状态的扩展节点86 for action inactions:87 child={ } 88 child[ parent ]=p89 child[ vec ]=(result(p[ vec ],action))90 child[ dis ]=get _ Manhattan dis(goal[ vec ],child[ vec ])91 child[ step ]=step 1 #每扩展一次当前已走距离加192 child[ dis ]=child[ dis ]child[ step ]#更新该节点的f值f=g h(step child[dis])93 child[ action ]=get _ actions(child[ vec ])94 children。append(child)9596返回children 9798 def node _ sort(nodelist):#按照节点中字典的距离字段对列表进行排序,从大到小99returnsorted(nodelist,key=itemgetter(dis ),reverse=True)100101 def get _ input(num):102 a=[]103 for iinrange(num):104 temp=[]105s=input()107 temp=s . split()108 for intemp:109t=int(t)110 p . append(t)111 a . append(p)112113 return

  114115 def get _ parent(node):116 q={ } 117 q=node[ parent ]

  118 returnq 119120 def test():121 open list=[]# open表122close=[]#存储扩展的父节点123124print(请输入矩阵的行数)125num=int(input())

  126127print(请输入初始矩阵A )128 A=get _ input(NUM)129130 print(请输入目标矩阵B )131 B=get _ input(NUM)132133 print(请输入结果文件名)134 result file=input()135136 goal=NP . array(B)# Build matrix 137138 p={ } 139 p[ vec ]=NP。array(a)140 p[ dis ]=get _ Manhattan dis(goal[ vec ],p[ vec ])141 p[ step ]=0142 p[ action ]=get _ actions(p[ vec ])143 p[ parent ]={ } 144145 if(p[ vec ]==goal[ vec ])。all():146 return 147148 openlist . append(p)19150 start _ CPU=time . clock()#扩展开始时CPU开始计算。151152 while open list:153154 children=[]155156 node=open list . pop()# node是字典类型,157close.append(node)#,pop打开表的最后一个元素,放入关闭表158159 if(node[ vec ]==goal[ vec ])。All (): #比较当前矩阵和目标矩阵是否相同160 End _ CPU=time . clock()# End CPU calculation 161162h=open(result file, w ,encoding= UTF-8 ,)#将结果写入文件并输出163h.write(搜索树大小: str(len(open list)len(close)) \ N )164h . Write( close: str(len(close)) \ N )165h . Write( open list: str(len(open list)))Write(解决方案路径: \ N )170 I=0171 way=[]172 while close:173 way。append (node [vec]) #从最终状态开始,依次返回,将其父节点存储在way list中。174 node=get _ parent(node)175 if(node[ vec ]==p[。176 way . append(node[ vec ])177 break 178 while way:179 I=1180h . write(str(I) \ n )181h . write(str(way . pop()) \ n )182h . close()183 f=open(result file, r ,Encoding= UTF-8 ,)184 print(f . read())185186 return 187188 children=expand(node,node [action )将小的留在打开的表中191 f=false 192 flag=false 193j=0194 for inrange(len(open list)):195 if(child[ vec ]==open list[I][ vec ])。all():196j=i197 flag=true 198 break 199 foriinrange(len(close)):200 if(child[ vec ]==close[I])。all():201 f=True 202 break 203 IFF==False and flag==False:204 open list . append(child)205206 elifflag==True:207 if child[ dis ]

  四、程序运行结果如下图所示。

  图1

  图2

  图3五.总结

  通过这个编程,我们知道搜索是探索性的,要想提高搜索效率(尽快找到目标节点)或者找到最佳路径(最优解),就必须注意搜索策略。针对状态图搜索提出了许多策略,大致可以分为两类:bland搜索和启发式搜索。其中盲搜索是非引导搜索。启发式搜索是引导式搜索,即利用启发式信息(函数)寻找问题的解。在通过A*算法求解N数问题的实验中也遇到了很多问题,比如节点扩展的方向。通过这次实验,我不仅锻炼了自己的python编程能力,也让自己对N数求解最优路径的问题有了更清晰的认识。我希望我能在老师和同学的帮助下不断进步。当然,最重要的是我得自己掏钱。只幻想不行动的人,永远体会不到收获果实的喜悦。加油!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: