GaitGeneration by Graph Search
読み取り中…
検索中…
一致する文字列を見つけられません
graph_search_evaluator.cpp
[詳解]
1
3
4// Copyright(c) 2023-2025 Design Engineering Laboratory, Saitama University
5// Released under the MIT license
6// https://opensource.org/licenses/mit-license.php
7
8#include "cassert_define.h"
10
11
12namespace designlab
13{
14
15GraphSearchEvaluator::GraphSearchEvaluator(const std::map<GraphSearchEvaluationValue::Tag, EvaluationMethod>& evaluation_method_map,
16 const std::vector<Tag>& evaluation_priority_list) :
17 evaluation_method_map_(evaluation_method_map),
18 evaluation_priority_list_(evaluation_priority_list)
19{
20 // 評価方法のマップの要素数と,優先的に評価を行う Tag のリストの要素数が一致していることを確認する.
21 assert(evaluation_method_map_.size() == evaluation_priority_list_.size());
22
25}
26
27bool GraphSearchEvaluator::LeftIsBetter(const GraphSearchEvaluationValue& left,
28 const GraphSearchEvaluationValue& right,
29 const bool return_true_case_of_equal) const
30{
31 // 優先的に評価を行う Tag から順に比較する.
32 for (const auto& tag : evaluation_priority_list_)
33 {
34 // 可読性のため,変数に格納する.
35 const float& left_value = left.value.at(tag);
36 const float& right_value = right.value.at(tag);
37
38 const auto& evaluation_method = evaluation_method_map_.at(tag);
39
40 assert(evaluation_method.margin >= 0.0f); // margin は負の値にはできない.
41
42 // margin 以下の違いは無視する.
43 if (std::abs(left_value - right_value) <= evaluation_method.margin)
44 {
45 // 次の要素を比較する.
46 continue;
47 }
48
49
50 if (left_value < right_value)
51 {
52 return evaluation_method.is_lower_better;
53 }
54 else if (left_value > right_value)
55 {
56 return !evaluation_method.is_lower_better;
57 }
58 else
59 {
60 continue;
61 }
62 }
63
64 // ここまで来た場合は,全ての要素が等しいと判断されたということ.
65 // その場合は,return_true_case_of_equal に従って返す.
66 return return_true_case_of_equal;
67}
68
69bool GraphSearchEvaluator::LeftIsBetterWithTag(const GraphSearchEvaluationValue& left, const GraphSearchEvaluationValue& right, Tag tag, bool return_true_case_of_equal) const
70{
71 // 可読性のため,変数に格納する.
72 const float& left_value = left.value.at(tag);
73 const float& right_value = right.value.at(tag);
74
75 const auto& evaluation_method = evaluation_method_map_.at(tag);
76
77 assert(evaluation_method.margin >= 0.0f); // margin は負の値にはできない.
78
79 // margin 以下の違いは無視する.
80 if (std::abs(left_value - right_value) <= evaluation_method.margin)
81 {
82 return return_true_case_of_equal;
83 }
84
85 if (left_value < right_value)
86 {
87 return evaluation_method.is_lower_better;
88 }
89 else
90 {
91 return !evaluation_method.is_lower_better;
92 }
93}
94
95GraphSearchEvaluationValue GraphSearchEvaluator::InitializeEvaluationValue() const
96{
97 // 最低の評価になるように初期化する.
98 GraphSearchEvaluationValue evaluation_value;
99
100 for (const auto& tag : evaluation_priority_list_)
101 {
102 const EvaluationMethod evaluation_method = evaluation_method_map_.at(tag);
103
104 if (evaluation_method.is_lower_better)
105 {
106 // 評価値が小さいほど良い場合,最大の評価値を設定する.
107 evaluation_value.value[tag] = GraphSearchEvaluationValue::kMaxEvaluationValue;
108 }
109 else
110 {
111 // 評価値が大きいほど良い場合,最小の評価値を設定する.
112 evaluation_value.value[tag] = GraphSearchEvaluationValue::kMinEvaluationValue;
113 }
114 }
115
116 return evaluation_value;
117}
118
119} // namespace designlab
GraphSearchEvaluator()=delete
デフォルトコンストラクタは禁止.
グラフ探索の評価値を格納する構造体.
bool is_lower_better
評価値が小さいほど良い場合は true.