xxxxxxxxxx
102
let yAlvo = 50;
let xAlvo = 350;
let velAlvo = 0.5;
let xd = 30;
let x1 = 0;
let x2 = 30;
let a = 0.1;
let b = 200;
let taxaDeAprendizagem = 0.002;
// Entradas
// posição em Y e a velocidade
let VX = [];
// pesos
let VW = [0, 0];
// [1.1428, -1.0256] // melhores pesos encontrados
function reta(x,ca,cb) {
return (cb + x*ca);
}
function ativacao(net) {
let resultado = net;
if ( net > 0.7 ) {
resultado = 0.7;
}
else if ( net < -0.7 ) {
resultado = -0.7;
}
return resultado;
}
function perceptron(entradas,pesos) {
// somatário dos pesos multiplicados pela entrada
let soma = 0;
for (let i=0; i<pesos.length; i++){
soma = soma + entradas[i]*pesos[i];
}
// ativação
return ativacao(soma);
}
function ajusteDosPesos(erro,entradas,pesos){
for (let i=0; i<pesos.length; i++){
pesos[i] = pesos[i] + taxaDeAprendizagem*entradas[i]*erro;
}
}
function desenhaAlvo(x,y) {
strokeWeight(1);
fill(255,250,50);
ellipse(x,y, 10,100);
fill(255,50,50);
ellipse(x,y, 4,22);
}
function setup() {
createCanvas(400, 400);
frameRate(30);
yAlvo = random(0,400);
}
function draw() {
background(230);
// alvo
desenhaAlvo(xAlvo,yAlvo);
yAlvo = yAlvo + velAlvo;
if (yAlvo > height)
yAlvo = 0;
// Atualiza a entrada
VX[0] = yAlvo/height; // aultura normalizada
VX[1] = velAlvo;
// Desenha a reta / canhão
strokeWeight(5);
line(x1, reta(x1,a,b), x2,reta(x2,a,b) );
// Disparo
yd = reta(xd,a,b);
xd=xd+8;
//desenha disparo
strokeWeight(1);
fill(10,10,200);
ellipse(xd,yd,4,4);
// Ajuste do peso
if (xd > xAlvo ) {
// calcula o erro
let erro = yAlvo - yd;
// ajusta os pesos
if (erro < 250 && erro > -250)
ajusteDosPesos(erro,VX,VW);
// Encontra a inclinação da reta com o perceptron
a = perceptron(VX,VW);
// posiciona a bala no canhão novamente
xd = x2;
console.log(a);
console.log(VW);
console.log(erro);
}
}