Я следую инструкциям этого репозитория со многими приведенными примерами, чтобы построить модель POMDP и использовать их решатель для моей проблемы.
Вот мой код:
Belief* StarMazeProblem::Tau(const Belief* belief, ACT_TYPE action,
OBS_TYPE obs) const {
static vector<double> probs = vector<double>(NumStates());
const vector<State*>& particles =
static_cast<const ParticleBelief*>(belief)->particles();
//********************
double sum = 0;
for (int i = 0; i < particles.size(); i++) {
SimpleState* state = static_cast<SimpleState*>(particles[i]);
const vector<State>& distribution = transition_probabilities_[GetIndex(
state)][action];
for (int j = 0; j < distribution.size(); j++) {
const State& next = distribution[j];
double p = state->weight * next.weight*ObsProb(obs, next.state_id, action);
probs[next.state_id] += p;
sum += p;
}
}
//******************
vector<State*> new_particles;
for (int i = 0; i < NumStates(); i++) {
if (probs[i] > 0) {
State* new_particle = Copy(states_[i]);
new_particle->weight = probs[i] / sum;
new_particles.push_back(new_particle);
probs[i] = 0;
}
}
return new ParticleBelief(new_particles, this, NULL, false);
}
мой код похож на этот пример (строка 432). В starmaze.h
функция ObsProb
задается как
class StarMazeProblem : public DSPOMDP {
private:
std::vector<std::vector<std::vector<State> > > transition_probabilities_;
public:
StarMazeProblem();
virtual double ObsProb(OBS_TYPE obs, const State& state, ACT_TYPE action) const;
}
Сообщение об ошибке
src/starmaze.cpp:317:80: error: no matching function for call to 'despot::StarMazeProblem::ObsProb(despot::OBS_TYPE&, const int&, despot::ACT_TYPE&) const'
double p = state->weight * next.weight*ObsProb(obs, next.state_id, action);
^
src/starmaze.cpp:206:8: note: candidate: virtual double despot::StarMazeProblem::ObsProb(despot::OBS_TYPE, const despot::State&, despot::ACT_TYPE) const
double StarMazeProblem::ObsProb(OBS_TYPE obs, const State& state,
^~~~~~~~~~~~~~~
src/starmaze.cpp:206:8: note: no known conversion for argument 2 from 'const int' to 'const despot::State&'
src/starmaze.cpp: In constructor 'despot::StarMazeBelief::StarMazeBelief(std::vector<despot::State*>, const despot::DSPOMDP*, despot::Belief*)':
Любое предложение, как я могу решить эту проблему?
Из второго примечания, которое показывает компилятор, вы пытаетесь передать значение int (state_id
) параметру, которому требуется const despot::State &
.
Предполагая, что идентификатор состояния принадлежит состоянию, которое вы хотите передать, он уже есть в next
. Вместо того, чтобы проходить next.state_id
, просто проходите next
:
double p = state->weight * next.weight*ObsProb(obs, next, action);
// ^^^^
Ваш звонок:
ObsProb(obs, next.state_id, action)
Подпись:
virtual double ObsProb(OBS_TYPE obs, const State& state, ACT_TYPE action) const;
Ошибка:
no known conversion for argument 2 from 'const int' to 'const despot::State&'
Итак, ваш звонок должен быть:
ObsProb(obs, next, action)