八数码难题(启发式搜索)

八数码难题---启发式搜素

 

1.启发式搜索:

特点:重排OPEN表,选择最有希望的节点加以扩展

种类:有序搜索(A算法)、A*算法等

 

2.估价函数

用来估算节点处于最佳求解路径上的希望程度的函数

f(n) = g(n) + h(n)

 n——搜索图中的某个当前被扩展的节点;

f(n) ——从初始状态节点s, 经由节点n到达目标节点ng,估计的最小路径代价;

g(n) ——从s到n 的实际路径代价;

h(n)——从n到ng,估计的最小路径代价。

 八数码难题估价函数:f(n)=d(n)+w(n)                     

其中:d(n)为n的深度           w(n)为不在位的棋子数

 

3.有序搜索:

选择OPEN表上具有最小f值的节点作为下一个要扩展的节点。

八数码难题使用全局择优搜索:

   选择OPEN表上具有最小f值的节点作为下一个要扩展的节点,即总是选择最有希望的节点作为下一个要扩展的节点。

在八数码难题中, 令估价函数

       f(n)=d(n)+p(n)

启发函数h(n)=p(n),p(n)为不在位的棋子与其目标位置的距离之和,则有p(n)≤h*(n),满足A*算法的限制条件。

w(n)——不在位的棋子数,不够贴切,错误选用节点加以扩展。

p(n)——更接近于h*(n)的h(n),其值是节点n与目标状态节点相比较,每个错位棋子在假设不受阻拦的情况下,移动到目标状态相应位置所需走步的总和。

p(n)比w(n)更接近于h*(n),因为p(n)不仅考虑了错位因素,还考虑了错位的距离(移动次数)


数据结构的建立:由于open,close表常设计删除增加节点的操作,故使用单链表最好

open表存储生成的节点且未被处理的节点,处理过的节点取出放入close表

close表存储处理过的节点

status表存储所有生成的节点

采用全局择优的思想

 

java代码如下:
package 八数码难题;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;





public class Main {
	static int f[][]=new int[3][3];
	static int e[][]=new int[3][3];
	static int p=0;
	static int dir[][]={{0,1},{1,0},{0,-1},{-1,0}};
	static Listopenlist=new LinkedList();
	static Listcloselist=new LinkedList();
	static int d=0;
	static Liststatus=new LinkedList();
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str1;//初始状态
		String str2;//目标状态
		str1="2831647.5";//空格用.表示
		str2="1238.4765";
		for(int i=0;i=3||y<0||y>=3){
			return false;
		}
		return true;
	}
	public static boolean contains(List list,int a[][]){
		int flag=0;
		int a1[][] = new int[3][3];
		
		for(int i=0;i

你可能感兴趣的:(人工智能)