I有しa.h
に次の設計:マップに格納されたベクトルのベクトルを更新
class A {
virtual void updateCoefficients(std::string /*state*/, std::vector<std::vector<double>>& /*coefs*/,
double /*reward*/) {}
protected:
std::map<std::string, std::vector<std::vector<double>>> heuristic;
}
class B : public A {
virtual void updateCoefficients(std::string state, std::vector<std::vector<double>>& coefs,
double reward) override;
}
とa.cc
で:
void B::updateCoefficients(std::string state, std::vector<std::vector<double>>& coefs,
double reward) {
for(unsigned i = 0; i < coefs.size(); i++) {
coefs[i][0] += 1;
}
for(unsigned i = 0; i < coefs.size(); i++) {
coefs[i][1] += 2;
}
}
Iはclass A
で定義されたメソッドからupdateCoefficients
呼び出しつつ:
void A::foo(std::string state, std::string action, double const& reward) {
if (heuristic.count(action)) {
updateCoefficients(state, heuristic[action], reward);
} else {
std::vector<std::vector<double>> coefs(20, std::vector<double>(2, 0.0));
heuristic[action] = coefs;
}
}
問題は、ベクターマップheuristic
のは更新されていませんが、updateCoefficients
が呼び出されると、すべてのベクトルは初期化されたときと同じように0になります。私は間違って何をしていますか?
アイデアは、使用するとclass A
からベースを継承する子クラスで異なるupdateCoefficients
メソッドを定義する必要があり、すべてのメソッドと変数を含むベースとしてclass A
を持つことです。
EDIT
OK、全体のコードはここにOfflineHeuristic.hとOfflineHeuristic.cc見つけることができるようにします。クラスState
、ActionState
、THTS
の情報は無関係です。私は可能な修正を試みましたが、まだマップheuristic
は常にゼロの値で満たされています。他のクラスから呼び出されているメソッドはofflineHeuristic->learn(state, action, reward)
です。
EDIT 2
エラーコードロジックで、別の場所で実際にありました。上に貼り付けたコードを実際に正しいものにする。誰かがそのような問題に遭遇した場合に備えて質問を残しておきます。または、それが良いことでない場合は、私に質問を削除するように私に知らせてください。
あなたはMCVEを投稿する必要があります。残りのコードで何が起こっているのかはわかりません。 –
@ĐorđeRelić私はRichardHodgesを繰り返すだけで、(http://stackoverflow.com/help/mcve)[Minimal、Complete、Verifiable Example]を投稿する必要があります。全体のコードは「最低限」です。それをMCVEにすることはあなたの仕事であり、我々の仕事ではありません。 – Aziuth
@ĐorđeRelić、残念ながら、私たちはここでコードをデバッグしていません。コマンドラインからGDBを使用するのが難しい場合は、IDEを試してみてください。(QTCreatorは無料で、QTなしでも使えます。コピー&ペーストが可能で、変更なしで実行できる最小限の例を教えてください。私たちは助けてくれるでしょう。IdeOneのようなオンラインコンパイラを使うのがベストです。 – Evgeniy