启发式函数prolog
我有一个问题是[1,2,3,0,4,5,6],目标是[4,5,6,0,1,2,3]和启发式函数 是为了计算1,2,3平铺位置的4,5,6平铺的错位,所以当我尝试添加head>3的条件时,它总是错误的启发式函数prolog,prolog,Prolog,我有一个问题是[1,2,3,0,4,5,6],目标是[4,5,6,0,1,2,3]和启发式函数 是为了计算1,2,3平铺位置的4,5,6平铺的错位,所以当我尝试添加head>3的条件时,它总是错误的 getHeuristic([], 0, []):-!. % here it is calculated as number of misplaced numbers for 4,5,6 only % ( so if Head = Head and value greater than 3 its c
getHeuristic([], 0, []):-!.
% here it is calculated as number of misplaced numbers for 4,5,6 only
% ( so if Head = Head and value greater than 3 its correct so
% don't count it)
getHeuristic([H|T1],V,[H|T2]):-!,
H>3,
getHeuristic(T1,V, T2).
getHeuristic([_|T1],H,[_|T2]):-
getHeuristic(T1,TH, T2),
H is TH + 1.
如果要通过计算非匹配位置的数量来计算从“当前状态”到“目标状态”的“距离”:
%nmpcount(+CurrentState,+TargetState,?计数)
nmpcount(当前状态、目标状态、计数):-
nmpcount2(当前状态,目标状态,0,计数)。
%nmpcount2(+CurrentState、+TargetState、+CountSoFar、+CountFinal)
nmpcount2([]、[]、计数、计数)。
nmpcount2([X|MoreCS]、[X|MoreTS]、CountIn、FinalCount):-
nmpcount2(MoreCS、MoreTS、CountIn、FinalCount)。
nmpcount2([X|MoreCS]、[Y|MoreTS]、CountIn、FinalCount):-
dif(X,Y),
CountNext是CountIn+1,
nmpcount2(MoreCS、MoreTS、CountNext、FinalCount)。
启发式是一种快速估计当前状态与目标状态(在状态空间中)的接近程度的方法
设h*(S)是从当前状态S到目标状态G的最优路径的代价。然后,启发式函数h(S)是可容许的当且仅当:
- 0≤ h(S)≤ h*(S),以及
- h(G)=0
- 当前状态=
[6,4,5,0,1,2,3]
- 互换6和4:
[4,6,5,0,1,2,3]
- 交换5和6:
=目标状态[4,5,6,0,1,2,3]
[5,4,6,1,2,3]
到目标状态[4,5,6,0,1,2,3]
(至少2
)估计最优路径成本的启发式函数是不允许的(因为唯一的移动-交换5和4-足以纠正这两个位置)
因此,我认为你可以这样做:
heuristic(State, Goal, Value) :-
heuristic(State, Goal, 0, Value).
heuristic([], [], A, A).
heuristic([X|Xs], [Y|Ys], A, V) :-
( X < Y
-> A1 is A + 1
; A1 is A ),
heuristic(Xs, Ys, A1, V).
备注:启发式函数计算的“移动”不一定对应于导致状态空间中从状态过渡到其后续状态的实际移动(即,它们是放松移动)。很难猜测您想要做什么。你能更好地解释这个问题吗?我有一个列表,它是[1,2,3,0,4,5,6],目标是将4,5,6与1,2,3交换,所以[4,5,6,0,1,2,3]启发式函数是只计算4,5,6的错位,因此在开始时,如果我发现平铺(4,5,6)在错误的位置平铺(1,2,3),h(n)=3然后数一数。你需要完整的代码吗?不需要完整的代码,但如果我理解正确,问题是将子序列
[1,2,3]
与子序列[4,5,6]
交换,因为。。。它们之间用0分隔,0与[1,2,3,4,5,6]
的顺序不符?对吗?对此,您不需要启发式(“启发式”是一组“足够好”的规则,这些规则“通常是正确的”,如果对某个情况进行全面评估的成本太高,则可以帮助您取得进展)。这似乎是一个确定性问题。
?- heuristic([1,2,3,0,4,5,6], [4,5,6,0,1,2,3], V).
V = 3.
?- heuristic([6,4,5,0,1,2,3], [4,5,6,0,1,2,3], V).
V = 2.
?- heuristic([5,4,6,0,1,2,3], [4,5,6,0,1,2,3], V).
V = 1.
?- heuristic([4,5,6,0,1,2,3], [4,5,6,0,1,2,3], V).
V = 0.