使用Pygame创建了一个蛇游戏,我尝试使用AI来解决它。最初,我没有增加身体的长度来检查蛇头是否朝食物方向移动。网格大小为5 * 5。使用了DDQN网络。大多数情况下,头部朝墙壁移动或连续不断地被撞击。即使我训练了5000集,最高得分还是4分。
状态:这是一个大小为16的数组。前8个值在8个方向(左,左上,上,右上,右,右下)具有头部和墙壁之间的距离。 ,底部,左侧底部)。接下来的8个值表示头部和食物之间在8个方向上的距离。所有值都在0到1的范围内。1表示物体在附近,0表示物体在很远。
动作::共有3个动作,0,1,2。 0-头朝相同方向移动。 1-头向左转。 2-头向右转。
奖励:如果收集到食物,则奖励+50,如果碰到墙壁,则奖励-200。
我无法理解为什么我的神经网络以错误的方式学习。请帮我解决这个问题。我已经在这里附加了代码。
代码:
import React, { Component } from "react";
import {
Form,
Input,
Button,
PageHeader,
Select,
DatePicker,
message,
} from "antd";
import "antd/dist/antd.css";
import axios from "axios";
// defualt setting for django
axios.defaults.xsrfCookieName = "csrftoken";
axios.defaults.xsrfHeaderName = "X-CSRFToken";
// from layout setting
const formItemLayout = {
labelCol: {
xs: {
span: 24,
},
sm: {
span: 8,
},
},
wrapperCol: {
xs: {
span: 24,
},
sm: {
span: 16,
},
},
};
const tailFormItemLayout = {
wrapperCol: {
xs: {
span: 24,
offset: 0,
},
sm: {
span: 16,
offset: 8,
},
},
};
// end fform layout setting
// const onFinish = (values) => {
// console.log(values);
// axios.post("http://127.0.0.1:8000/api/create/", {
// title: values.title,
// manager: values.manager,
// });
// };
// const title = event.target.elements.title.value;
// const manager = event.target.elements.manager.value;
export default class ExtrashiftForm extends React.Component {
constructor(props) {
super(props);
this.state = {
Extrashifts: [],
};
}
// componentDidMount() {
// this.fetchExtrashift();
// }
handleSubmit = (values) => {
console.log(values)
// axios
// .post("http://127.0.0.1:8000/api/create", {
// data: {
// title: this.target.elements.title.value,
// manager: this.data.item.manager,
// },
// })
// .then((res) => {
// if (res.status == 200) message.success("data successfully updated!");
// this.fetchExtrashift();
// })
// .catch((err) => {
// message.error("data profile failed to update ...");
// });
};
render() {
return (
<div>
<Form {...formItemLayout} name="update" onFinish={this.handleSubmit}>
<Form.Item label="Title :" name="title">
<Input placeholder="Put a title here" />
</Form.Item>
<Form.Item label="Manager :" name="manager">
<Input placeholder="Enter manager name" />
</Form.Item>
<Form.Item {...tailFormItemLayout}>
<Button
type="primary"
htmlType="submit"
>
create
</Button>
</Form.Item>
</Form>
</div>
);
}
}
答案 0 :(得分:0)
您可以尝试的一些操作:
您定义状态的方式看起来有些复杂。顶部和底部不会给出相同的信息,一个是否为另一个?同样,如果您的蛇头在(1,1),而您的果实在(3,4),那么该果实根本不会出现在状态中。蛇代理实际上可以看到果实的时间将非常有限。也许您可以尝试用另一种方式定义状态?
在RL中,事情经常往南走,所以从基本的特工和基本的游戏开始并往上爬通常是有意义的。在简单的openai体育馆环境(如Mountaincar)中尝试使用同一代理,以检查代理类是否按预期工作。