#include <stdio.h>
#include <stdlib.h>
#define GENMAX 50
#define STATENO 7
#define ACTIONNO 2
#define ALPHA 0.1
#define GAMMA 0.9
#define EPSILON 0.3
#define SEED 32767
#define REWARD 10
#define GOAL 6
#define UP 0
#define DOWN 1
#define LEVEL 2
int rand0or1();
double frand();
void printqvalue(double qvalue[][ACTIONNO]);
int selecta(int s, double qvalue[][ACTIONNO]);
double updateq(int s, int snext, int a, double qvalue[][ACTIONNO]);
int set_a_by_q(int s, double qvalue[][ACTIONNO]);
int nexts(int s, int a);
/*
main()西数*/
/****************/
int main()
{
int i, j;
int s, snext;/*现在的状态和下一个状态*/
int t;/*循环计数器*/
int a;/*行动*/
double qvalue[STATENO][ACTIONNO];/*Q*/
srand(SEED);/*随机数初始化*/
for (i = 0; i < STATENO; ++i)
for (j = 0; j < ACTIONNO; ++j)
qvalue[i][j] = frand();
printqvalue(qvalue);
/*学习循环*/
for (i = 0; i < GENMAX; ++i) {
s = 0;/*行动的初始状态*/
for (t = 0; t < LEVEL; ++t) {/*—直循环到最后一次行动*/
/*行动选择*/
a = selecta(s, qvalue);
fprintf(stderr, " s= %d a=%d\n", s, a);
snext = nexts(s, a);
/*Q值更新*/
qvalue[s][a] = updateq(s, snext, a, qvalue);
s = snext;
}
/*输出Q值 */
printqvalue(qvalue);
}
return 0;
}
double updateq(int s, int snext, int a, double qvalue[][ACTIONNO])
{
double qv;/*更新后的Q值*/
/*Q值更新*/
if (snext == GOAL) /*获得奖赏的情況*/
qv = qvalue[s][a] + ALPHA * (REWARD - qvalue[s][a]);
else/*没有获得奖赏的情况*/
qv = qvalue[s][a] + ALPHA * (GAMMA* qvalue[snext][set_a_by_q(snext, qvalue)] - qvalue[s][a]);
return qv;
}
int selecta(int s, double qvalue[][ACTIONNO])
{
int a;/*被选择的行动*
/*用a-Greedy法进行行动选择*/
if (frand() < EPSILON)
/*随机行动*/
a = rand0or1();
else
/*选择最大Q值进行行动*/
a = set_a_by_q(s, qvalue);
return a;
}
int set_a_by_q(int s, double qvalue[][ACTIONNO])
{
if ((qvalue[s][UP]) > (qvalue[s][DOWN]))
return UP;
else
return DOWN;
}
/***************************/
/* nexts()函数 */
/*根据行动转移到下一个状态 */
/****************************/
int nexts(int s, int a)
{
return s * 2 + 1 + a;
}
/* printqvalue()函数 */
/* 输出Q值 */
void printqvalue(double qvalue[][ACTIONNO])
{
int i, j;
for (i = 0; i < STATENO; ++i) {
for (j = 0; j < ACTIONNO; ++j)
printf("Q(%d,%d)=%.3lf ",i,j, qvalue[i][j]);
printf("\t");
}
printf("\n");
}
/* frand()函数 */
/*返回0~1之间的实数随机数函数*/
double frand()
{
/*随机数计算*/
return(double)rand() / RAND_MAX;
}
/* rand0or1()函数 */
/* 返回0或者1的随机数函数 */
int rand0or1()
{
int rnd;
/*除以随机数最大值*/
while ((rnd = rand()) == RAND_MAX);
/*随机数计算*/
return (int)((double)rnd / RAND_MAX * 2);
}
人工智能 信息处理作业3
于 2023-04-13 11:38:13 首次发布