使用C++编写的一段强化学习例程

只是一段演示的例程,模拟了强化学习的基本模型。

例程通过强化学习的模型,学习了剪刀、石头、布游戏的出拳概率。

例程中出拳概率的调整就是强化学习的基本理念。

/* 本例程是学习《强化学习与深度学习:通过C语言模拟》的代码演习 */
/****************************************************************/
/* ReinforcementLearning.cpp    */
/* 学习出拳的规律        */
/* 使用方法    */
/* ..\\RL */
/* 通过键盘输入0、1、2代表石头、剪刀、布*/
/****************************************************************/

/* Visual Studio兼容性检查 */
#define _CRT_SECURE_NO_WARNINGS

/* 头文件的包含项 */
#include <stdio.h>
#include <stdlib.h>

/* 常量定义 */
#define ST    0            /* 石头        */
#define JD    1            /* 剪刀        */
#define BU        2        /* 布        */
#define WIN        1        /* 胜        */
#define LOSE    -1        /* 负        */
#define DRAW    0        /* 平        */
#define ALPHA    0.01    /* 学习系数    */

/* 函数的声明 */
int Action(double rate[]);    /* 依据随机数和策略出拳 */
double fRand(void);            /* 0-1随机数生成器        */

/****************************************************/
/*                  main()函数                      */
int main()
{
    int n = 0;                /* 对战次数 */
    int myAct, RivalAct;    /* 自己的出拳和对手的出拳 */
    double rate[3] = { 1,1,1 };    /* 出拳的比例 */
    int gain;                /* 胜负结果 */
    double sumGain = 0.0;    /* 积分        */
    int Payoff[3][3] = {
        { DRAW,WIN,LOSE },
        { LOSE,DRAW,WIN },
        { WIN,LOSE,DRAW } };  /* 胜负矩阵 */

/* 对战和学习循环 */
    while (scanf_s("%d", &RivalAct) != EOF) {
        if ((RivalAct < ST) || (RivalAct > BU)) 
            continue;/* 出拳不合法 */

        myAct = Action(rate);            /* 按照出拳系数自动出拳 */
        gain = Payoff[myAct][RivalAct];    /* 胜负判断    */

        n++;                            /* 对战次数 */
        sumGain += gain;                /* 胜率        */

        printf("%d-%d:%d ", myAct, RivalAct, gain);/* 输出比赛结果 */

        rate[myAct] += gain*ALPHA*rate[myAct];    /* 学习出拳比例 */
        printf("%lf   %lf   %lf  Play Round:%d WinRate:%lf\n",
            rate[ST], rate[JD], rate[BU], n, (double)sumGain / n);    /* 输出出拳比例 */
    }
    return 0;
}

/****************************************************/
/*                  Action()函数                    */
/*                  rate[]出拳比例                  */
int Action(double rate[])
{
    double st, jd, bu;/* 出拳的对应值 */
    st = rate[ST] * fRand();
    jd = rate[JD] * fRand();
    bu = rate[BU] * fRand();
    if (st > jd)
    {
        if (st > bu) return ST;        /* ST大 */
        else return BU;                /* BU大 */
    }
    else
    {
        if (jd > bu) return JD;/*JD大  */
        else return BU;                /* BU大 */
    }
}

/****************************************************/
/*                  Action()函数                    */
/*                  rate[]出拳比例                  */
double fRand(void)
{
    return (double)rand() / RAND_MAX;
}
 

本代码已经过测试。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值