Udacity的C++编程练习: Python转C++

练习 1

在机器人定位的课程中,Sebastian Thrun 已经带领你了解了一维机器人传感和运动的 Python 代码。最后你得到了一个 sense() 函数,它基于传感器的测量数据来更新概率。你也得到了一个 move() 函数,它根据机器人在网格中的运动更新概率。

现在请将下面的 Python 代码翻译成 C++ 代码:

p = [0.2, 0.2, 0.2, 0.2, 0.2]
world = ['green', 'red', 'red', 'green', 'green']
measurements = ['red', 'green']
motions = [1,1]
pHit = 0.6
pMiss = 0.2
pExact = 0.8
pOvershoot = 0.1
pUndershoot = 0.1

def sense(p, Z):
    q=[]
    for i in range(len(p)):
        hit = (Z == world[i])
        q.append(p[i] * (hit * pHit + (1-hit) * pMiss))
    s = sum(q)
    for i in range(len(q)):
        q[i] = q[i] / s
    return q

def move(p, U):
    q = []
    for i in range(len(p)):
        s = pExact * p[(i-U) % len(p)]
        s = s + pOvershoot * p[(i-U-1) % len(p)]
        s = s + pUndershoot * p[(i-U+1) % len(p)]
        q.append(s)
    return q

for k in range(len(measurements)):
    p = sense(p, measurements[k])
    p = move(p, motions[k])

print p         

我改写的C++版本:

#include <iostream>
#include <vector>

using namespace std;

vector<float> p(5,0.2);
vector<string> world = {"green", "red", "red", "green", "green"};
vector<string> measurements = {"red","green"};
vector<int> motions = {1,1};
float pHit,pMiss,pExact,pOvershoot,pUndershoot;


vector<float> sense(vector<float> p,string Z){

//    for (int i=0;i<p.size();i++){
//        cout<<p[i]<<endl;
//    }
    pHit = 0.6;
    pMiss = 0.2;

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




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

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

    return q;
}

vector<float> move(vector<float> p, int U){
    vector<float> q;
    float s;
    pOvershoot = 0.1;
    pUndershoot = 0.1;
    pExact = 0.8;
    for (int i=0;i<p.size();i++){
        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;

}

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

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

    }

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

//    cout << p << endl;

//    for (int i;i<world.size();i++){
//        cout<<world[i]<<endl;
//    }
//    cout << "Hello world!" << endl;
    return 0;
}

 显示结果:

 

转载于:https://www.cnblogs.com/wangyarui/p/11232040.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值