启发式函数prolog

启发式函数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

我有一个问题是[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 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.