etrobocon2018 feat.KatLab  770af34cce41ae9c30c41303275e1add2daae0c3 (with uncommitted changes)
 全て クラス 名前空間 ファイル 関数 変数 列挙型 列挙値 フレンド マクロ定義 ページ
クラス | 公開メンバ関数 | 全メンバ一覧
Node クラス

#include <Node.h>

Node 連携図
Collaboration graph

公開メンバ関数

 Node ()
 
 Node (std::int8_t id)
 
 Node (std::vector< Node * > *nodes)
 
bool operator== (Node &obj)
 
bool operator!= (Node &obj)
 
void setNeighbors (std::vector< Node * > *nodes)
 
std::vector< Node * > * getNeighbors ()
 
void setNodeID (std::int8_t nodeNumber)
 
std::int8_t getNodeID ()
 
void setHasBlock (bool exists)
 
bool hasBlock ()
 
void setPosition (std::int8_t x, std::int8_t y)
 
std::int8_t getPositionX ()
 
std::int8_t getPositionY ()
 
void setParentNode (Node *parent)
 
NodegetParentNode ()
 
void setScore (std::int32_t score_)
 
std::int32_t getScore ()
 
void setRealCost (std::int32_t cost)
 
std::int32_t getRealCost ()
 
void setBeClosed (bool closed_)
 
bool isClosed ()
 

詳解

A*アルゴリズムにおけるノードクラス

ノード、およびノード間の関係を作成できる。 setNeighbors(std::vector<Node*>*) で関係があるノードのポインタのリストのポインタを設定できる。 このセッターを駆使することで、双方向グラフを作成できる。 作成方法は、Example1とExample2を参照すればよい。

なお、Example1は簡単な双方向グラフのため、3つのインスタンスのポインタを直接設定している。 Example2はノードと関係がたくさんあるため、ノードのポインタのリストを用いて、また隣接ノードIDの二重リストを用いて、動的に生成している。 Example2の手法を用いれば、多角形が存在するグラフでも簡単に生成できると考えられる。

現在は、Node間のコストを表現できない。 ノードのポインタをキーに、コストを値にしたハッシュをメンバ変数に保持することで、表現できると考える。 一方で、このクラスが保持する必要性は必ずしもないため、このクラスのインスタンス保持者が持てばよいという発想も間違いではない。

Example1

Example1
node2に2つのneighborsが存在する場合 (node1 - node2 - node3)

Node node1(1);
Node node2(2);
Node node3(3);
std::vector<Node*> neighbors1 = {&node2}; // node1->node2
std::vector<Node*> neighbors2 = {&node1, &node3}; // node1<-node2->node3
std::vector<Node*> neighbors3 = {&node2}; // node2<-node3
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)); // node1->node2->node1
ASSERT_EQ(&node2, actual2->at(0)->getNeighbors()->at(0)); // node2->node1->node2
ASSERT_EQ(&node2, actual2->at(1)->getNeighbors()->at(0)); // node2->node3->node2
ASSERT_EQ(&node3, actual3->at(0)->getNeighbors()->at(1)); // node3->node2->node3

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.h142 行目に定義があります。

構築子と解体子

Node::Node ( )
inline

隣接ノードが

nullptr

のデフォルトコンストラクタ

Node 型の std::vector を作る際などにご利用ください。

Node.h167 行目に定義があります。

168  : nodeID(0), blockExists(false), neighbors(nullptr), parentNode(nullptr), score(99), closed(false) {}
Node::Node ( std::int8_t  id)
inlineexplicit

ノードIDを設定できるコンストラクタ

Node.h173 行目に定義があります。

174  : nodeID(id), blockExists(false), neighbors(nullptr), parentNode(nullptr), score(99), closed(false) {}
Node::Node ( std::vector< Node * > *  nodes)
inlineexplicit

隣接ノードを設定できるコンストラクタ

Node.h179 行目に定義があります。

180  : nodeID(0), blockExists(false), neighbors(nodes), parentNode(nullptr), score(99), closed(false) {}

関数詳解

std::vector< Node * > * Node::getNeighbors ( )

隣接ノードを取得する

戻り値
隣接するノードポインタのポインタ

Node.cpp8 行目に定義があります。

9 {
10  return neighbors;
11 }

被呼び出し関係図:

std::int8_t Node::getNodeID ( )

ノードIDを設定する

別のノードと異なる、一意のIDであるか否かは未検証である。 一意性は、このクラスのインスタンス保持者が責任を持つ。

戻り値
ノードIDの番号

Node.cpp18 行目に定義があります。

19 {
20  return nodeID;
21 }

被呼び出し関係図:

Node * Node::getParentNode ( )

親ノードを取得する

これは Explorer クラスで利用する。

戻り値
親ノードのポインタ

Node.cpp54 行目に定義があります。

55 {
56  return parentNode;
57 }

被呼び出し関係図:

std::int8_t Node::getPositionX ( )

ノード位置のX軸を取得する

Position 構造体はクラス内にネスト化しているため、これだけでは利用価値が小さい。 getPositionY() も参照する必要がある。

戻り値
ノード位置のX軸

Node.cpp39 行目に定義があります。

40 {
41  return position.x;
42 }

被呼び出し関係図:

std::int8_t Node::getPositionY ( )

ノード位置のY軸を取得する

Position 構造体はクラス内にネスト化しているため、これだけでは利用価値が小さい。 getPositionX() も参照する必要がある。

戻り値
ノード位置のY軸

Node.cpp44 行目に定義があります。

45 {
46  return position.y;
47 }

被呼び出し関係図:

std::int32_t Node::getRealCost ( )

A*アルゴリズムで用いる実コストを取得する

これは Explorer クラスで利用する。

戻り値
実コスト

Node.cpp74 行目に定義があります。

75 {
76  return realCost;
77 }
std::int32_t Node::getScore ( )

A*アルゴリズムで用いるスコアを取得する

これは Explorer クラスで利用する。

戻り値
親ノードのポインタ

Node.cpp64 行目に定義があります。

65 {
66  return score;
67 }

被呼び出し関係図:

bool Node::hasBlock ( )

ブロックを保持している場合は真を返す真偽値を取得する

戻り値
ブロックを保持している場合は真を返す真偽値

Node.cpp28 行目に定義があります。

29 {
30  return blockExists;
31 }

被呼び出し関係図:

bool Node::isClosed ( )

A*アルゴリズムで用いる開閉を取得する

これは Explorer クラスで利用する。

戻り値
探索ノードを閉じている場合は真を示す真偽値

Node.cpp84 行目に定義があります。

85 {
86  return closed;
87 }
bool Node::operator!= ( Node obj)
inline

オブジェクトのポインタが等しくない場合に真を返す

Node.h193 行目に定義があります。

194  {
195  return this != &obj;
196  }
bool Node::operator== ( Node obj)
inline

オブジェクトのポインタが等しい場合に真を返す

Node.h185 行目に定義があります。

186  {
187  return this == &obj;
188  }
void Node::setBeClosed ( bool  closed_)

A*アルゴリズムで用いる開閉を設定する

これは Explorer クラスで利用する。

引数
closed_探索ノードを閉じている場合は真を示す真偽値

Node.cpp79 行目に定義があります。

80 {
81  closed = closed_;
82 }

被呼び出し関係図:

void Node::setHasBlock ( bool  exists)

ブロックを保持している場合は真を返す真偽値を設定する

引数
existsブロックを保持している場合は真を返す真偽値

Node.cpp23 行目に定義があります。

24 {
25  blockExists = exists;
26 }

被呼び出し関係図:

void Node::setNeighbors ( std::vector< Node * > *  nodes)

隣接ノードを設定する

引数
nodes隣接するノードポインタのポインタ

Node.cpp3 行目に定義があります。

4 {
5  neighbors = nodes;
6 }

被呼び出し関係図:

void Node::setNodeID ( std::int8_t  nodeNumber)

ノードIDを設定する

できるだけ別のノードと異なる、一意の数値が望ましい。 一意性は、このクラスのインスタンス保持者が責任を持つ。

引数
nodeNumberノードIDの番号

Node.cpp13 行目に定義があります。

14 {
15  nodeID = nodeNumber;
16 }

被呼び出し関係図:

void Node::setParentNode ( Node parent)

親ノードを設定する

これは Explorer クラスで利用する。

引数
parent親ノードのポインタ

Node.cpp49 行目に定義があります。

50 {
51  parentNode = parent;
52 }
void Node::setPosition ( std::int8_t  x,
std::int8_t  y 
)

ノード位置を設定する

他のノードとの相対的な位置であり、絶対的な指標は存在しない。 このため、設定する際は他のノードについても考える必要がある。

引数
xノード位置のX軸
yノード位置のY軸

Node.cpp33 行目に定義があります。

34 {
35  position.x = x;
36  position.y = y;
37 }

被呼び出し関係図:

void Node::setRealCost ( std::int32_t  cost)

A*アルゴリズムで用いる実コストを設定する

これは Explorer クラスで利用する。

引数
cost実コスト

Node.cpp69 行目に定義があります。

70 {
71  realCost = cost;
72 }
void Node::setScore ( std::int32_t  score_)

A*アルゴリズムで用いるスコアを設定する

これは Explorer クラスで利用する。

引数
score_スコア

Node.cpp59 行目に定義があります。

60 {
61  score = score_;
62 }

このクラス詳解は次のファイルから抽出されました: