A*アルゴリズムにおけるノードクラス
ノード、およびノード間の関係を作成できる。 setNeighbors(std::vector<Node*>*) で関係があるノードのポインタのリストのポインタを設定できる。 このセッターを駆使することで、双方向グラフを作成できる。 作成方法は、Example1とExample2を参照すればよい。
なお、Example1は簡単な双方向グラフのため、3つのインスタンスのポインタを直接設定している。 Example2はノードと関係がたくさんあるため、ノードのポインタのリストを用いて、また隣接ノードIDの二重リストを用いて、動的に生成している。 Example2の手法を用いれば、多角形が存在するグラフでも簡単に生成できると考えられる。
現在は、Node間のコストを表現できない。 ノードのポインタをキーに、コストを値にしたハッシュをメンバ変数に保持することで、表現できると考える。 一方で、このクラスが保持する必要性は必ずしもないため、このクラスのインスタンス保持者が持てばよいという発想も間違いではない。
Example1
Example1
node2に2つのneighborsが存在する場合 (node1 - node2 - node3)
std::vector<Node*> neighbors1 = {&node2};
std::vector<Node*> neighbors2 = {&node1, &node3};
std::vector<Node*> neighbors3 = {&node2};
node1.setNeighbors(&neighbors1);
node2.setNeighbors(&neighbors2);
node3.setNeighbors(&neighbors3);
auto actual1 = node1.getNeighbors();
auto actual2 = node2.getNeighbors();
auto actual3 = node3.getNeighbors();
ASSERT_EQ(&node1, actual1->at(0)->getNeighbors()->at(0));
ASSERT_EQ(&node2, actual2->at(0)->getNeighbors()->at(0));
ASSERT_EQ(&node2, actual2->at(1)->getNeighbors()->at(0));
ASSERT_EQ(&node3, actual3->at(0)->getNeighbors()->at(1));
Example2
ETロボコン2018のブロック並べエリアの場合<br>
0 - 1 - 2 - 3
| | | |
4 - 5 - 6 - 7
| | | |
8 - 9 - 10- 11
| | | |
12- 13- 14- 15
std::vector<std::vector<int>> neighborsIDList = {
{1, 4},
{0, 2, 5},
{1, 3, 6},
{2, 7},
{0, 5, 8},
{1, 4, 6, 9},
{2, 5, 7, 10},
{3, 6, 11},
{4, 9, 12},
{5, 8, 10, 13},
{6, 9, 11, 14},
{7, 10, 15},
{8, 13},
{9, 12, 14},
{10, 13, 15},
{11, 14}};
int nodeCount = neighborsIDList.size();
std::vector<Node> nodes(nodeCount);
std::vector<Node*> nodePtrs(nodeCount);
for (int i = 0; i < nodeCount; i++)
{
nodes[i].setNodeID(i);
nodePtrs[i] = &nodes[i];
}
std::vector<std::vector<Node*>> neighbors(nodeCount);
for (int i = 0; i < nodeCount; i++)
{
for (int nodeID : neighborsIDList[i])
{
neighbors[i].push_back(nodePtrs[nodeID]);
}
}
for (int i = 0; i < nodeCount; i++)
{
nodePtrs[i]->setNeighbors(&neighbors[i]);
}
auto actual0 = nodePtrs[0]->getNeighbors();
auto actual1 = nodePtrs[1]->getNeighbors();
auto actual2 = nodePtrs[2]->getNeighbors();
auto actual3 = nodePtrs[3]->getNeighbors();
auto actual4 = nodePtrs[4]->getNeighbors();
auto actual5 = nodePtrs[5]->getNeighbors();
auto actual6 = nodePtrs[6]->getNeighbors();
auto actual7 = nodePtrs[7]->getNeighbors();
auto actual8 = nodePtrs[8]->getNeighbors();
auto actual9 = nodePtrs[9]->getNeighbors();
auto actual10 = nodePtrs[10]->getNeighbors();
auto actual11 = nodePtrs[11]->getNeighbors();
auto actual12 = nodePtrs[12]->getNeighbors();
auto actual13 = nodePtrs[13]->getNeighbors();
auto actual14 = nodePtrs[14]->getNeighbors();
auto actual15 = nodePtrs[15]->getNeighbors();
Node.h の 142 行目に定義があります。