人工智能 信息处理作业3

#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);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值