精华内容
下载资源
问答
  • 强化学习 Q-learning及python例子

    千次阅读 2019-05-29 10:04:24
    文章目录Q-learning原理python例子 本文是作者在学习莫烦的强化学习课程中的笔记,强烈推荐莫烦强化学习。 Q-learning原理 我们以一个走迷宫的小游戏为例:让探索者学会走迷宫. 黄色的是天堂 (reward 1), 黑色的地狱...


    本文是作者在学习莫烦的强化学习课程中的笔记,强烈推荐莫烦强化学习

    Q-learning原理

    我们以一个走迷宫的小游戏为例:让探索者学会走迷宫. 黄色的是天堂 (reward 1), 黑色的地狱 (reward -1). 大多数 RL 是由 reward 导向的, 所以定义 reward 是 RL 中比较重要的一点.

    Alt
    Q-learning原理实际上就是建立一个Q表(最本文最后有展示),里面包含所有状态下、不同动作的Q值(最终根据Q值走出迷宫),Q-learning通过不断尝试每个回合、每一步,不断的更新Q表,最终达到最优的状态。
    Alt
    整个算法就是一直不断更新 Q table 里的值, 然后再根据新的值来判断要在某个 state 采取怎样的 action. Qlearning 是一个 off-policy 的算法, 因为里面的 max action 让 Q table 的更新可以不基于正在经历的经验(可以是现在学习着很久以前的经验,甚至是学习他人的经验). 不过这一次的例子, 我们没有运用到 off-policy, 而是把 Qlearning 用在了 on-policy 上, 也就是现学现卖, 将现在经历的直接当场学习并运用. On-policy 和 off-policy 的差别我们会在之后的 Deep Q network (off-policy) 学习中见识到. 而之后的教程也会讲到一个 on-policy (Sarsa) 的形式, 我们之后再对比。

    python例子

    首先我们先 import 两个模块, maze_env 是我们的环境模块, 已经编写好了, 大家可以直接在这里下载, maze_env 模块我们可以不深入研究, 如果你对编辑环境感兴趣, 可以去看看如何使用 python 自带的简单 GUI 模块 tkinter 来编写虚拟环境. maze_env 就是用 tkinter 编写的. 而 RL_brain 这个模块是 RL 的大脑部分.

    from maze_env import Maze
    from RL_brain import QLearningTable
    

    下面的代码, 我们可以根据上面的图片中的算法对应起来, 这就是整个 Qlearning 最重要的迭代更新部分啦.

    def update():
        # 学习 100 回合
        for episode in range(100):
            # 初始化 state 的观测值
            observation = env.reset()
    
            while True:
                # 更新可视化环境
                env.render()
                # RL 大脑根据 state 的观测值挑选 action
                action = RL.choose_action(str(observation))
                # 探索者在环境中实施这个 action, 并得到环境返回的下一个 state 观测值, reward 和 done (是否是掉下地狱或者升上天堂)
                observation_, reward, done = env.step(action)
                # RL 从这个序列 (state, action, reward, state_) 中学习
                RL.learn(str(observation), action, reward, str(observation_))
                # 将下一个 state 的值传到下一次循环
                observation = observation_
                # 如果掉下地狱或者升上天堂, 这回合就结束了
                if done:
                    break
    
        # 结束游戏并关闭窗口
        print('game over')
        env.destroy()
    
    if __name__ == "__main__":
        # 定义环境 env 和 RL 方式
        env = Maze()
        RL = QLearningTable(actions=list(range(env.n_actions)))
    
        # 开始可视化环境 env
        env.after(100, update)
        env.mainloop()
    

    迷宫中各个状态的位置:

    在这里插入图片描述
    最终学到的Q表:
    在这里插入图片描述

    展开全文
  • spark python例子

    千次阅读 2015-11-05 17:10:30
    # -*- coding: utf-8 -*- from __future__ import print_function import sys from operator import add from pyspark import SparkContext #./pyspark /home/yunshouhu/PycharmProjects/untitled/word.py /home/
    # -*- coding: utf-8 -*-
    
    from __future__ import print_function
    import sys
    from operator import add
    
    from pyspark import SparkContext
    
    #./pyspark /home/yunshouhu/PycharmProjects/untitled/word.py /home/yunshouhu/PycharmProjects/untitled/data.txt
    if __name__=="__main__":
        if len(sys.argv)!=2:
            print ("useg: word <file>",file=sys.stderr);
            exit(-1)
    
        sc=SparkContext(appName="myword")
        lines=sc.textFile(sys.argv[1],1)
        counts=lines.flatMap(lambda x:x.split(' ')).map(lambda x:(x,1)).reduceByKey(add)
    
        output=counts.collect();
        for (word,count) in output:
            print("来自中国: %s %i" % (word,count))
        sc.stop()
    

    展开全文
  • 网上这样的例子很多,总结3种常用的方法: 代码实现: #coding:utf-8 #5**3 B表示5的3次方 #整除后取余数 1001%100 # 方法一: for bai in range(1,10): #百位 for shi in range(0,10): #十位 ...

    如果一个 3 位数等于其各位数字的立方和,则称这个数为水仙花数。  

    例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一个水仙花数

    求1000以内的水仙花数(3位数) 

    网上这样的例子很多,总结3种常用的方法:

    代码实现:

    #coding:utf-8
    #5**3  B表示5的3次方
    #整除后取余数 1001%100
    
    # 方法一:
    for bai in range(1,10):        #百位
        for shi in range(0,10):    #十位
            for ge in range(0,10): #个位
                i=bai*100+shi*10+ge
                if i==bai**3+shi**3+ge**3:
                    print(i)
    
    #方法二:将数字先转化为字符串,利用字符串索引找到百、十、个位的数字值
    for i in range(100,1000):
        s=str(i)   #将数字转化为字符串
        d=int(s[0])  #百位
        e=int(s[1])  #十位
        f=int(s[2])  #个位
        if i==d**3+e**3+f**3:
            print(i)
    
    #方法三:
    for i in range(100,1000):
    #// 使用取模,分别取出百位数、10位数、个位数
    #/// k = i // 10 % 10, 需要注意运算符号和运算顺序
        a=i // 100  #整除获得百位数
        b=i //10 % 10     # 或者b = (i % 100) // 10
        c=i % 10    #个位数
        if i == a ** 3 + b ** 3 + c ** 3:
            print(i)
    

     

    运行结果:

     

    注意:

     range() 函数创建一个整数列表,是前闭后开。

    例如range(1,10),取的是1,2,3,4,5,6,7,8,9

     

     

     

    展开全文
  • Linux下简单的c++调用python例子

    千次阅读 2019-05-13 16:22:06
    在linux一般自带python解释器,我的为python 2.7.5.(可根据python --version查看)。写环境验证代码,写简单的c++代码,引入头文件#include<python2.7/Python.h>,进行编译。可能出现如下错误: 采用yum ...

    1.环境问题:

    在linux一般自带python解释器,我的为python 2.7.5.(可根据python --version查看)。写环境验证代码,写简单的c++代码,引入头文件#include<python2.7/Python.h>,进行编译。可能出现如下错误:

    采用yum install python-devel.x86_64 命令解决,编译没有报错可以忽略。

     

    2.使用步骤(实例)

    1.新建python文件和c++文件

     

    2.编写想用python模块完成的代码,例如:

    class Student:

        def SetName(self,name):

            self._name = name

        def PrintName(self):

            print self._name

    def hello():

        print "Hello World\n"

    def world(name):

        print "name"

     

    实现了一个学生类,实现了set函数,一个对象set完之后可以答应出成员的信息。后面的两个函数单为简的测试函数。    

     

    3.编写c++代码,例如:

     

    #include <python2.7/Python.h>

    #include <iostream>

    #include <string>

     

    int main () {

     

    //使用python之前,要调用Py_Initialize();这个函数进行初始化

    Py_Initialize();

     

    //导入环境变量

    PyRun_SimpleString("import sys");

    //python脚本路径

    PyRun_SimpleString("sys.path.append('./')"); //放在cpp的同一路径下

     

    PyObject * pModule = NULL;

    PyObject * pFunc = NULL;

    PyObject * pClass = NULL;

    PyObject * pInstance = NULL;

     

    // PyImport_ImportModule函数载入python脚本,参数为为python脚本名称,因为是//模块化的导入,所以当代码处于运行期的时候就会生成一个.pyc文件,这样的话和直//接使用.pyc文件有同样的效果,下面做了两种方式运行效率的比较

    pModule = PyImport_ImportModule("nounpy");

     

    //这里是要调用的函数名

    pFunc= PyObject_GetAttrString(pModule, "hello");

    //调用函数

    PyEval_CallObject(pFunc, NULL);

    Py_DECREF(pFunc);

     

    //测试调用python的类

    pClass = PyObject_GetAttrString(pModule, "Student");

    if (!pClass) {

        printf("Can't find Student class.\n");

        return -1;

    }

    pInstance = PyInstance_New(pClass, NULL, NULL);

    if (!pInstance) {

        printf("Can't create Student instance.\n");

        return -1;

    }

    //调用其中的类方法

    PyObject_CallMethod(pInstance, "SetName", "(s)","I am c++ args");

    PyObject_CallMethod(pInstance, "PrintName",NULL,NULL);

     

    //调用Py_Finalize,这个根Py_Initialize相对应的。

    Py_Finalize();

    return 0;

    }

     

    加粗函数为c++提供的专门操作python对象的函数。

     

    使用g++ -o noun noun.cpp -lpython2.7 进行编译

     

    可以把c++调用python步骤总结如下:

    分别为:1.进行python的初始化工作(表示要执行python脚本等工作);2.声明需要的PyObject*类型的指针变量;3.采用PyImport_ImportModule导入模块,参数为python脚本名称(因为有的时候 python解释器是不会生成.pyc文件的),如果名称不对会导入失败,函数返回为空;4.然后通过PyObject_GetAttrString函数获取类型或者函数,如果成功,返回python*类型的指针(有点类似与调用dll的GetProcAddress,获取到了函数或者类型的地址);5.如果是直接要调用的是函数,采用PyEval_CallObject、Py_DECREF进行调用,如果是类,需要先调用PyInstance_New函数,然后再通过PyObject_CallMethod函数执行类方法。  

     

    可以分为对单个函数的使用和对类的使用,两种场景采用不同的步骤和方法,主要区别于上述的 第5点。

     

     

    3.直接使用.py和提前编译好.pyc使用效率比较

    运行效率的比较,python实现了一个五百万次的循环:

     

    1.使用.pyc文件的方式(对python的源码文件进行模块化编译,例如python -m py_compile nounpy.py,将生成的nounpy.pyc拷贝到如下目录,进行如下图使用)

    g++ -o noun noun.cpp -lpython2.7

    ./noun

    结果如下:

    2.使用.py文件的方式:

    g++ -o noun noun.cpp -lpython2.7

    ./noun

     

    结果如下:

     

    针对python代码不大的调用,可以看出,提前编译好.pyc使用和直接使用.py区别不是很大(耗时基本相同)。每一次把脚本模块导入的时候会检测相应路径下是否有相应的.pyc,如果没有会生成,如果有就直接快速加载。因为python代码少,解释出来耗时很短,所以这两种使用方式最终耗时也基本一样。不过建议先编译好代码,生成.pyc供c++使用,这样的话可以做到隐藏源代码并且需要的功能也可以持久化保存。

     

    4.一些关键函数(c++提供给操作python对象的)

    初始化

    Py_Initialize

    PyRun_SimpleString

    PyRun_SimpleString

     

    加载脚本

    PyImport_ImportModule

     

    函数的使用

    PyObject_GetAttrString

    PyEval_CallObject

    Py_DECREF

     

    类的使用

    PyObject_GetAttrString

    PyInstance_New

    PyObject_CallMethod

     

    结束

    Py_Finalize

    展开全文
  • 实现的简单python例子

    万次阅读 2014-04-16 09:39:25
    本人学python没多久,不足的望指点 1.输入三个变量,然后安小到大排序
  • In [63]: SE() is SE() init init del del Out[63]: False

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 45,469
精华内容 18,187
关键字:

python例子

python 订阅