mirror of
https://github.com/wassname/rl_2d_walker.js.git
synced 2026-09-09 11:33:20 +08:00
misc
This commit is contained in:
@@ -1,104 +0,0 @@
|
||||
var Charts = function () {
|
||||
this.__constructor.apply(this, arguments);
|
||||
}
|
||||
|
||||
Charts.prototype.__constructor = function () {}
|
||||
|
||||
Charts.prototype.collect = function (agents, n, chunkSize) {
|
||||
if (n === undefined) n = 1
|
||||
if (chunkSize === undefined) chunkSize = 1
|
||||
var data = {}
|
||||
|
||||
// collect data
|
||||
var keys = Object.keys(agents[0].infos[0])
|
||||
for (const key of keys) {
|
||||
if (key === 'x') continue
|
||||
data[key] = []
|
||||
for (let i = 0; i < agents.length; i += n) {
|
||||
const infos = agents[i].infos;
|
||||
// var borderColor = "hsl("+agents[i].walkerhue+",45%,"+(100-15*agents[i].walker.health/config.walker_health)+"%)";
|
||||
// build dataset
|
||||
var dataset = {
|
||||
label: 'Agent ' + i,
|
||||
data: [],
|
||||
fill: false,
|
||||
// borderColor
|
||||
}
|
||||
for (const info of infos) {
|
||||
// a datapoint
|
||||
dataset.data.push({
|
||||
x: info['x'],
|
||||
y: info[key]
|
||||
})
|
||||
}
|
||||
|
||||
// take means?
|
||||
var leftOver = dataset.data % chunkSize
|
||||
dataset.data = _.chunk(dataset.data, 4)
|
||||
.map(c => ({
|
||||
x: _.mean(_.map(c, 'x')),
|
||||
y: _.mean(_.map(c, 'y'))
|
||||
}))
|
||||
if (leftOver) dataset.data.pop()
|
||||
|
||||
data[key].push(dataset)
|
||||
}
|
||||
}
|
||||
for (let i = 0; i < agents.length; i++) {
|
||||
agents[i].infos = [] // empty it
|
||||
}
|
||||
|
||||
return data
|
||||
}
|
||||
|
||||
Charts.prototype.init = function (agents) {
|
||||
|
||||
var data = this.collect(agents, 1, 10)
|
||||
var div = document.getElementById('charts');
|
||||
|
||||
// make charts
|
||||
this.charts = []
|
||||
for (const key in data) {
|
||||
var canvas = document.createElement("canvas");
|
||||
div.appendChild(canvas)
|
||||
var ctx = canvas.getContext('2d');
|
||||
var lineChart = new Chart(ctx, {
|
||||
type: 'scatter',
|
||||
data: {
|
||||
datasets: data[key]
|
||||
},
|
||||
options: {
|
||||
title: {
|
||||
text: key,
|
||||
display: true
|
||||
},
|
||||
scales: {
|
||||
xAxes: [{
|
||||
type: 'linear',
|
||||
position: 'bottom'
|
||||
}]
|
||||
}
|
||||
}
|
||||
});
|
||||
this.charts.push(lineChart)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Charts.prototype.update = function (agents) {
|
||||
var data = this.collect(agents, 1, 10)
|
||||
var maxLen = 10000
|
||||
for (const chart of this.charts) {
|
||||
var newDatasets = data[chart.config.options.title.text]
|
||||
chart.data.datasets.forEach((dataset) => {
|
||||
var dat = newDatasets.filter(d => d.label == dataset.label)[0].data
|
||||
dataset.data.push(...dat);
|
||||
if (dataset.data.length > maxLen) dataset.data.splice(0, dataset.data.length - maxLen)
|
||||
});
|
||||
chart.update();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
Charts
|
||||
}
|
||||
+3
-1
@@ -7,5 +7,7 @@ module.exports = {
|
||||
population_size: 1,
|
||||
walker_health: 100,
|
||||
max_floor_tiles: 50,
|
||||
action_repeat: 1
|
||||
action_repeat: 1,
|
||||
STRENGTH: 2.2,
|
||||
SPEED: 30
|
||||
};
|
||||
|
||||
@@ -101,6 +101,7 @@ class DDPGAgent {
|
||||
this.ddpg.actor.model.save('downloads://actor-' + name);
|
||||
this.ddpg.critic.model.save('downloads://critic-' + name);
|
||||
}
|
||||
// TODO also save config
|
||||
}
|
||||
|
||||
async restore(folder, name, callback) {
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
const config = require('./config')
|
||||
const {
|
||||
Charts
|
||||
} = require('./charts')
|
||||
const {
|
||||
tf
|
||||
} = require('./ddpg//tf_import')
|
||||
|
||||
+11
-13
@@ -10,8 +10,6 @@ const {
|
||||
Renderer
|
||||
} = require('./renderer')
|
||||
|
||||
const STRENGTH = 2.6
|
||||
const SPEED = 30
|
||||
|
||||
class Walker {
|
||||
constructor(world, floor, config) {
|
||||
@@ -215,7 +213,7 @@ class Walker {
|
||||
jd.lowerAngle = deg2rad(-10 / 2);
|
||||
jd.upperAngle = deg2rad(30 / 2);
|
||||
jd.enableLimit = true;
|
||||
jd.maxMotorTorque = 10 * STRENGTH;
|
||||
jd.maxMotorTorque = 10 * this.config.STRENGTH;
|
||||
jd.motorSpeed = 0;
|
||||
jd.enableMotor = true;
|
||||
var j = this.world.CreateJoint(jd)
|
||||
@@ -272,7 +270,7 @@ class Walker {
|
||||
jd.lowerAngle = deg2rad(-100);
|
||||
jd.upperAngle = deg2rad(-2);
|
||||
jd.enableLimit = true;
|
||||
jd.maxMotorTorque = 260 * STRENGTH;
|
||||
jd.maxMotorTorque = 260 * this.config.STRENGTH;
|
||||
jd.motorSpeed = 0;
|
||||
jd.enableMotor = true;
|
||||
var j = this.world.CreateJoint(jd)
|
||||
@@ -287,7 +285,7 @@ class Walker {
|
||||
jd.lowerAngle = -deg2rad(-36);
|
||||
jd.upperAngle = deg2rad(30);
|
||||
jd.enableLimit = true;
|
||||
jd.maxMotorTorque = 90 * STRENGTH;
|
||||
jd.maxMotorTorque = 90 * this.config.STRENGTH;
|
||||
jd.motorSpeed = 0;
|
||||
jd.enableMotor = true;
|
||||
var j = this.world.CreateJoint(jd)
|
||||
@@ -347,7 +345,7 @@ class Walker {
|
||||
jd.lowerAngle = deg2rad(0);
|
||||
jd.upperAngle = deg2rad(85);
|
||||
jd.enableLimit = true;
|
||||
jd.maxMotorTorque = 150 * STRENGTH;
|
||||
jd.maxMotorTorque = 150 * this.config.STRENGTH;
|
||||
jd.motorSpeed = 0;
|
||||
jd.enableMotor = true;
|
||||
var j = this.world.CreateJoint(jd)
|
||||
@@ -362,7 +360,7 @@ class Walker {
|
||||
jd.lowerAngle = deg2rad(-35);
|
||||
jd.upperAngle = deg2rad(35);
|
||||
jd.enableLimit = true;
|
||||
jd.maxMotorTorque = 90 * STRENGTH;
|
||||
jd.maxMotorTorque = 90 * this.config.STRENGTH;
|
||||
jd.motorSpeed = 0;
|
||||
jd.enableMotor = true;
|
||||
var j = this.world.CreateJoint(jd)
|
||||
@@ -402,7 +400,7 @@ class Walker {
|
||||
jd.lowerAngle = -0.1/2;
|
||||
jd.upperAngle = 0.2/2;
|
||||
jd.enableLimit = true;
|
||||
jd.maxMotorTorque = 2 * STRENGTH;
|
||||
jd.maxMotorTorque = 2 * this.config.STRENGTH;
|
||||
jd.motorSpeed = 0;
|
||||
jd.enableMotor = true;
|
||||
var j = this.world.CreateJoint(jd)
|
||||
@@ -436,7 +434,7 @@ class Walker {
|
||||
jd.lowerAngle = deg2rad(-60);
|
||||
jd.upperAngle = deg2rad(125);
|
||||
jd.enableLimit = true;
|
||||
jd.maxMotorTorque = 250 * STRENGTH;
|
||||
jd.maxMotorTorque = 250 * this.config.STRENGTH;
|
||||
jd.motorSpeed = 0;
|
||||
jd.enableMotor = true;
|
||||
var j = this.world.CreateJoint(jd)
|
||||
@@ -448,7 +446,7 @@ class Walker {
|
||||
jd.lowerAngle = deg2rad(-60);
|
||||
jd.upperAngle = deg2rad(125);
|
||||
jd.enableLimit = true;
|
||||
jd.maxMotorTorque = 250 * STRENGTH;
|
||||
jd.maxMotorTorque = 250 * this.config.STRENGTH;
|
||||
jd.motorSpeed = 0;
|
||||
jd.enableMotor = true;
|
||||
var j = this.world.CreateJoint(jd)
|
||||
@@ -463,7 +461,7 @@ class Walker {
|
||||
jd.lowerAngle = deg2rad(-10);
|
||||
jd.upperAngle = deg2rad(80);
|
||||
jd.enableLimit = true;
|
||||
jd.maxMotorTorque = 400 * STRENGTH;
|
||||
jd.maxMotorTorque = 400 * this.config.STRENGTH;
|
||||
jd.motorSpeed = 0;
|
||||
jd.enableMotor = true;
|
||||
var j = this.world.CreateJoint(jd)
|
||||
@@ -475,7 +473,7 @@ class Walker {
|
||||
jd.lowerAngle = deg2rad(-10);
|
||||
jd.upperAngle = deg2rad(80);
|
||||
jd.enableLimit = true;
|
||||
jd.maxMotorTorque = 400 * STRENGTH;
|
||||
jd.maxMotorTorque = 400 * this.config.STRENGTH;
|
||||
jd.motorSpeed = 0;
|
||||
jd.enableMotor = true;
|
||||
var j = this.world.CreateJoint(jd)
|
||||
@@ -573,7 +571,7 @@ class Walker {
|
||||
simulationPreStep(motorSpeeds) {
|
||||
// act
|
||||
for (var k = 0; k < this.joints.length; k++) {
|
||||
this.joints[k].SetMotorSpeed(motorSpeeds[k] * SPEED); // action can range from -3 to 3, radians per second
|
||||
this.joints[k].SetMotorSpeed(motorSpeeds[k] * this.config.speed); // action can range from -3 to 3, radians per second
|
||||
}
|
||||
for (let i = 0; i < motorSpeeds.length - this.joints.length; i++) {
|
||||
this.grips[i] = motorSpeeds[i] > 0
|
||||
|
||||
Reference in New Issue
Block a user