Q-Learing(房间移动) - (1)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define Actions_Num 6
#define Target 5
#define Episode 600000
#define gamma 0.8
const int INF = 0x3f3f3f3f;
int max(int* p, int m) {
	int Max = *p;
	for (int i = 1; i < m; i++) if (*(p + i) > Max)
		Max = *(p + i);
	return Max;
}
int main() {
	int Q[6][6] = { 0 };
	for (int i = 0; i < 6; i++) Q[i][i] = -1;
	int R[6][6] = {
	{ -1, -1, -1, -1, 0, -1},
	{-1, -1, -1, 0, -1, 100.0},
	{ -1, -1, -1, 0, -1, -1},
	{-1, 0, 0, -1, 0, -1},
	{0, -1, -1, 0, -1, 100.0},
	{ -1, 0, -1, -1, 0, 100.0 }
	};
	int Start_Room, Cur_Sta, Cur_Act, Nex_Sta;
	for (int i = 0; i < Episode; i++) {
		srand(time(NULL));
		Cur_Sta = Start_Room = rand() % 5; // 取0~4进行位置初始化.
		while (Cur_Sta != Target) {
			Cur_Act = rand() % 6;// 取0~5进行行动位置初始化.
			int Cur_Reward = R[Cur_Sta][Cur_Act]; // 保存当前行动奖赏值.
			if (Cur_Reward >= 0) { // 目标位置可以行走.
				Nex_Sta = Cur_Act; // 保存下一状态.
				Q[Cur_Sta][Cur_Act] = Cur_Reward + gamma * max(&Q[Nex_Sta][0], 6);
				Cur_Sta = Nex_Sta;
			}
			else Q[Cur_Sta][Cur_Act] = Cur_Reward;
		}
	}
	Start_Room = rand() % 5; // 取0~4进行位置初始化.
	Cur_Sta = Start_Room; // 保存当前位置
	int step = 0;
	while (Cur_Sta != Target) {
		int Max = -INF;
		for (int i = 0; i < 6; i++) if (Max < Q[Cur_Sta][i])
			Max = Q[Cur_Sta][i];
		for (int j = 0; j < 6; j++) if (Max == Q[Cur_Sta][j])
			Nex_Sta = j;
		printf("\n Agent 由 %d 号房间移动到了 %d 号房间\n", Cur_Sta, Nex_Sta);
		Cur_Sta = Nex_Sta;
		step++;
	}
	printf("\n Agent 在 %d 号房间开始移动了 %d 步到达了目标房间\n", Start_Room, step);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值