私は人工知能を本から学んでいますが、この本は私がここに投稿しようとしているコードを曖昧に説明しています。概念はやや単純ですが、私はちょうど以下のコードのいくつかを理解していないと私は私が移動する前に、このアルゴリズムを少し明確に理解するのを助ける人がほしいと思います。ヒルクライミングアルゴリズムはどのように機能しますか?
私は最も混乱している部分の隣にコメントしました。これらの行が行っていることの概要は、私にとって非常に役立ちます。
int HillClimb::CalcNodeDist(Node* A, Node* B)
{
int Horizontal = abs(A->_iX - B->_iX);
int Vertical = abs(A->_iY - B->_iY);
return(sqrt(pow(_iHorizontal, 2) + pow(_iVertical, 2)));
}
void HillClimb::StartHillClimb()
{
BestDistance = VisitAllCities();
int CurrentDistance = BestDistance;
while (true)
{
int i = 0;
int temp = VisitAllCities();
while (i < Cities.size())
{
//Swapping the nodes
Node* back = Cities.back();
Cities[Cities.size() - 1] = Cities[i];
Cities[i] = back; // Why swap last city with first?
CurrentDistance = VisitAllCities(); // Why visit all nodes again?
if (CurrentDistance < BestDistance) // What is this doing?
{
BestDistance = CurrentDistance; //???
break;
}
else
{
back = Cities.back();
Cities[Cities.size() - 1] = Cities[i];
Cities[i] = back;
}
i++;
}
if (CurrentDistance == temp)
{
break;
}
}
}
int HillClimb::VisitAllCities()
{
int CurrentDistance = 0;
for (unsigned int i = 0; i < Cities.size(); i++)
{
if (i == Cities.size() - 1)//Check if last city, link back to first city
{
CurrentDistance += CalcNodeDist(Cities[i], Cities[0]);
}
else
{
CurrentDistance += CalcNodeDist(Cities[i], Cities[i + 1]);
}
}
return(CurrentDistance);
}
また、この本では、これがどのような山登りのタイプであるかは記載されていません。私はそれが立ち往生するときに再起動しないので、それは基本的な山登りだと思いますか?
実際には、極小値しか見つけられません(最小距離を探しています)。私は 'ComputePathLengthAroundAllCities'のようなもので' VisitAllCities'の名前を変更します。コードが最後の都市を(任意の)都市と交換します。新しいパスが以前よりも短ければ、それを記録してprocessusを繰り返します。それ以外の場合は、ロールバックして次のスワップをテストします。 – Jarod42
待っていますので、下にスライドしていますか?私はこのアルゴリズムの全体的なポイントが上に行くと思った? – WaveOnyx
距離を最小限に抑えて、すべての都市を訪問しようとしています。最小化することは最大化と似ている(最小化すると 'cost'は' -cost'を最大化する)。 – Jarod42