Вектор, который я запрограммировал в C ++, ничего не возвращает.Предполагается вернуть 5 элементов - PullRequest
0 голосов
/ 07 июня 2018

Привет, у меня проблемы с его кодом C ++, разработанным с помощью Code Blockers.Он реализует смысл и движение робота (очень простой), есть вектор p вероятностей, которые меняют меня. Я применяю смысл и двигаюсь в своей основной функции.

Есть функция чувств и функция перемещения ниже, которые в основном меняют мой вектор вероятностей p .

Я вызываю их в своем главномфункция, но она, похоже, не работает, возвращает 5 нан. значений.

#include <iostream>
#include <vector>
#include <string>

using namespace std;

vector<float> p (5);
vector<string> world (5);
vector<string> measurements (2);
vector<int> motions (2);
float pHit;
float pMiss;
float pExact;
float pOvershoot;
float pUndershoot;
vector<float> sense(vector<float> p, string Z);
vector<float> move(vector<float> p, int U);


int main(){
    vector<float> p = {0.2, 0.2, 0.2, 0.2, 0.2};
    vector<string> world = {"green", "red", "red", "green", "green"};
    vector<string> measurements = {"red", "green"};
    //string measurements = "red";
    vector<int> motions = {1,1};
    float pHit = 0.6;
    float pMiss = 0.2;
    float pExact = 0.8;
    float p0vershoot = 0.1;
    float pUndershoot = 0.1;

    vector<float> sense(vector<float> p, string Z);
    vector<float> moves(vector<float> p, int U);


    for(int i=0; i<measurements.size(); i++){
        p = sense(p, measurements[i]);
        p = moves(p, motions[i]);
    }

    for(int i=0; i<p.size(); i++){
        cout << p[i] << " ";
    }

    return 0;
}

vector<float> sense(vector<float> p, string Z){
    vector<float> q;
   // q.reserve(p.size());
    for(int i=0; i<p.size(); i++){
        bool hit = (Z == world[i]);
        q.push_back(p[i] * (hit * pHit + (1-hit) * pMiss));
    }

    float s = 0.0;
    for(int i=0; i<q.size(); i++){
        s += q[i];
    }

    for(int i=0; i<q.size(); i++){
        q[i] /= s;
    }

    return q;
}

vector<float> moves(vector<float> p, int U){
    vector<float> q;
   // q.reserve(p.size());
    for(int i=0; i<p.size(); i++){
        float s = pExact * p[(i-U) % p.size()];
        s = s + pOvershoot * p[(i-U-1) % p.size()];
        s = s + pUndershoot * p[(i-U+1) % p.size()];
        q.push_back(s);
    }
    return q;
}

1 Ответ

0 голосов
/ 07 июня 2018

Ваш код не будет компилироваться так, как вы его здесь представили.Во-первых, вы пытаетесь ссылаться на локальные переменные, определенные в main, в других функциях. Во-вторых, у вас есть куча неявных преобразований типа double в float.Если эти проблемы решаются так или иначе, ваш код, кажется, работает (см. Код ниже).

#include <vector>
#include <iostream>

using namespace std;

vector<double> p = { 0.2, 0.2, 0.2, 0.2, 0.2 };
vector<string> world = { "green", "red", "red", "green", "green" };
vector<string> measurements = { "red", "green" };

float pHit = 0.6;
float pMiss = 0.2;
float pExact = 0.8;
float pOvershoot = 0.1;
float pUndershoot = 0.1;

int main() {
    //string measurements = "red";
    vector<int> motions = { 1,1 };

    vector<double> sense(vector<double> p, string Z);
    vector<double> moves(vector<double> p, int U);


    for (int i = 0; i<measurements.size(); i++) {
        p = sense(p, measurements[i]);
        p = moves(p, motions[i]);
    }

    for (int i = 0; i<p.size(); i++) {
        cout << p[i] << " ";
    }

    return 0;
}

vector<double> sense(vector<double> p, string Z) {
    vector<double> q;
    // q.reserve(p.size());
    for (int i = 0; i<p.size(); i++) {
        bool hit = (Z == world[i]);
        q.push_back(p[i] * (hit * pHit + (1 - hit) * pMiss));
    }

    float s = 0.0;
    for (int i = 0; i<q.size(); i++) {
        s += q[i];
    }

    for (int i = 0; i<q.size(); i++) {
        q[i] /= s;
    }

    return q;
}

vector<double> moves(vector<double> p, int U) {
    vector<double> q;
    // q.reserve(p.size());
    for (int i = 0; i<p.size(); i++) {
        float s = pExact * p[(i - U) % p.size()];
        s = s + pOvershoot * p[(i - U - 1) % p.size()];
        s = s + pUndershoot * p[(i - U + 1) % p.size()];
        q.push_back(s);
    }
    return q;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...