A *的實現。這是我從網站here有一個代碼,我想知道這個實現A *的是否正確。我已經看過它,並將其與維基百科頁面進行比較,它似乎是有效的。我之所以問,是因爲在該網站中它說這個代碼中仍然存在一個錯誤,我試圖找到它,但找不到任何。我希望如此,它需要的出發地和目的地作爲輸入參數在PHP驗證
<?php
class AStarSolver
{
function solve(&$s)
{
include_once('PQueue.class.php');
$o = new PQueue();
$l = array();
$c = array();
$p = array();
$a = $s->getStartIndex();
$z = $s->getGoalIndex();
$d = $s->goalDistance($a);
$n0 = array('g'=>0, 'h'=>$d, 'i'=>$a, 'p'=>NULL, 'f'=>$d);
$o->push($n0, -$d);
$l[$a] = TRUE;
while (! $o->isEmpty())
{
$n = $o->pop();
if ($n['i'] == $z)
{
while ($n)
{
$p[] = $n['i'];
$n = $n['p'];
}
break;
}
foreach ($s->getNeighbors($n['i']) as $j => $w)
{
if ((isset($l[$j]) || isset($c[$j])) && isset($m) && $m['g'] <= $n['g']+$w)
continue;
$d = $s->goalDistance($j);
$m = array('g'=>$n['g']+$w, 'h'=>$d, 'i'=>$j, 'p'=>$n, 'f'=>$n['g']+$w+$d);
if (isset($c[$j]))
unset($c[$j]);
if (! isset($l[$j]))
{
$o->push($m, -$m['f']);
$l[$j] = TRUE;
}
}
$c[$n['i']] = $n;
}
return $p;
}
}
?>
到Pqueue的代碼可以發現here
不知道你爲什麼被低估;這本身並不是一個壞主題。然而,對於Stackoverflow來說,代碼和算法驗證並不是很重要。因此,您最終可以刪除並將此問題移至http://codereview.stackexchange.com/。 – mario 2011-02-26 07:44:29
@mario不完全是,Code Review要求你有*工作代碼*,所以錯誤發現並不完全在它的範圍內。 – 2011-02-26 08:40:13
你有沒有試過聯繫codezilla向他詢問他的實現?在第一次詢問PHP中的A *時,已經被低估了向你提出這個建議:我仍然認爲它看起來像一個有效的實現。但我會拭目以待,看看其他人對此有何評論。 – 2011-02-26 11:09:42