From 8f335f2576f7f7b6e11cdac17245ec6fa4bb46fe Mon Sep 17 00:00:00 2001 From: wassname Date: Fri, 18 Jan 2019 10:56:44 +0800 Subject: [PATCH] misc --- src/js/charts.js | 104 -------------------------------------- src/js/config.js | 4 +- src/js/ddpg/ddpg_agent.js | 1 + src/js/game.js | 3 -- src/js/walker.js | 24 ++++----- 5 files changed, 15 insertions(+), 121 deletions(-) delete mode 100644 src/js/charts.js diff --git a/src/js/charts.js b/src/js/charts.js deleted file mode 100644 index 78d48bc..0000000 --- a/src/js/charts.js +++ /dev/null @@ -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 -} diff --git a/src/js/config.js b/src/js/config.js index f510569..a46b311 100644 --- a/src/js/config.js +++ b/src/js/config.js @@ -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 }; diff --git a/src/js/ddpg/ddpg_agent.js b/src/js/ddpg/ddpg_agent.js index 53bfe7a..4a2c520 100644 --- a/src/js/ddpg/ddpg_agent.js +++ b/src/js/ddpg/ddpg_agent.js @@ -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) { diff --git a/src/js/game.js b/src/js/game.js index 5a6bef0..fcce134 100644 --- a/src/js/game.js +++ b/src/js/game.js @@ -1,7 +1,4 @@ const config = require('./config') -const { - Charts -} = require('./charts') const { tf } = require('./ddpg//tf_import') diff --git a/src/js/walker.js b/src/js/walker.js index 9788263..410e8b7 100644 --- a/src/js/walker.js +++ b/src/js/walker.js @@ -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