只是一段演示的例程,模拟了强化学习的基本模型。
例程通过强化学习的模型,学习了剪刀、石头、布游戏的出拳概率。
例程中出拳概率的调整就是强化学习的基本理念。
/* 本例程是学习《强化学习与深度学习:通过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;
}
本代码已经过测试。