function symmetricRand() { return 2 * Math.random() - 1; } var slope = symmetricRand(); var intercept = symmetricRand(); var amplitudeSlope = symmetricRand(); var amplitudeIntercept = symmetricRand(); var frequency = symmetricRand(); var phase = symmetricRand(); function f(x) { return slope * x + intercept + (amplitudeSlope * x + amplitudeIntercept) * Math.sin(frequency * x + phase); } function g(x, params) { return params[0] * x + params[1] + (params[2] * x + params[3]) * Math.sin(params[4] * x + params[5]); } // Generate some samples var numPoints = 200; var points = new Array(numPoints); for (var i = 0; i < numPoints; i++) { var x = -20 + i * .2; points[i] = {x: x, y: f(x)}; } // Initialize swarm var swarm = new PSO.Swarm(30, 6); console.log(points) var canvas = $('canvas')[0]; var ctx = canvas.getContext('2d'); function draw() { canvas.width = innerWidth; canvas.height = innerHeight; var xmin, xmax, ymin, ymax; for (var i in points) { var x = points[i].x; var y = points[i].y; xmin = Math.min(x, xmin || x); xmax = Math.max(x, xmax || x); ymin = Math.min(y, ymin || y); ymax = Math.max(y, ymax || y); } console.log(xmin, xmax, ymin, ymax); ctx.fillStyle = '#ff0000'; var xmul = canvas.width / (xmax - xmin); var ymul = canvas.height / (ymax - ymin); for (var i in points) { var x = (points[i].x - xmin) * xmul; var y = (points[i].y - ymin) * ymul; ctx.beginPath(); ctx.arc(x, y, 2, 0, 2 * Math.PI, false); ctx.fill(); } for (var i in swarm.particles) { var params = swarm.particles[i].params; var errorSum = 0; var pathStarted = false; ctx.beginPath(); for (var j in points) { var x = points[j].x; var y = params[0] * x + params[1] + (params[2] * x + params[3]) * Math.sin(params[4] * x + params[5]); var error = points[j].y - y; errorSum += error * error; // Draw var xt = (x - xmin) * xmul; var yt = (y - ymin) * ymul; if (pathStarted) { ctx.lineTo(xt, yt); } else { ctx.moveTo(xt, yt); pathStarted = true; } } ctx.stroke(); swarm.particles[i].setFitness(errorSum); } swarm.update(); for (var i = 0; i < 1; i++) { swarm.particles[parseInt(Math.random() * swarm.numParticles)].jitter(); } requestAnimationFrame(draw); } draw();