Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package bg;
- import org.encog.engine.network.activation.ActivationSigmoid;
- import org.encog.ml.data.basic.BasicMLData;
- import org.encog.ml.train.MLTrain;
- import org.encog.neural.data.NeuralDataSet;
- import org.encog.neural.data.basic.BasicNeuralDataSet;
- import org.encog.neural.networks.BasicNetwork;
- import org.encog.neural.networks.layers.BasicLayer;
- import org.encog.neural.networks.training.lma.LevenbergMarquardtTraining;
- import robocode.AdvancedRobot;
- import robocode.HitByBulletEvent;
- import robocode.Rules;
- import robocode.ScannedRobotEvent;
- import robocode.util.Utils;
- import java.awt.*;
- import java.util.ArrayList;
- import java.util.concurrent.ConcurrentLinkedQueue;
- @SuppressWarnings("UnusedDeclaration")
- public class prototype02 extends AdvancedRobot {
- public static final int WAVE_NEURO_OUT = 7;
- public static final int WAVE_NEURO_IN = 2;
- class IncomingWave {
- public final Double x, y, firingDistance, bulletEnergy, perfectFiringAngle, bearing, heading, energy;
- public final Long firingTime;
- public Double hit = null;
- public IncomingWave(Double x, Double y, Double firingDistance, Long firingTime, Double bulletEnergy, Double perfectFiringAngle,
- Double bearing, Double heading, Double energy) {
- this.x = x;
- this.y = y;
- this.firingDistance = firingDistance;
- this.firingTime = firingTime;
- this.bulletEnergy = bulletEnergy;
- this.perfectFiringAngle = perfectFiringAngle;
- this.bearing = bearing;
- this.heading = heading;
- this.energy = energy;
- }
- }
- class IncomingWaveML {
- public final Double a,b,c,d,e,f;
- public final Double out;
- IncomingWaveML(Double a, Double b, Double c, Double d, Double e, Double f, Double out) {
- this.a = a;
- this.b = b;
- this.c = c;
- this.d = d;
- this.e = e;
- this.f = f;
- this.out = out;
- }
- }
- private ConcurrentLinkedQueue<IncomingWave> waves = new ConcurrentLinkedQueue<IncomingWave>();
- private Double enemyEnergy = null;
- private Double enemyVelocity = null;
- private BasicNetwork wavesNeuro = new BasicNetwork();
- private ArrayList<IncomingWaveML> wavesNeuroTrain = new ArrayList<IncomingWaveML>();
- public prototype02() {
- wavesNeuro.addLayer(new BasicLayer(new ActivationSigmoid(), true, WAVE_NEURO_IN)); // my (idealny kierunek, odległość)
- wavesNeuro.addLayer(new BasicLayer(new ActivationSigmoid(), true, 5));
- wavesNeuro.addLayer(new BasicLayer(new ActivationSigmoid(), true, 5));
- wavesNeuro.addLayer(new BasicLayer(new ActivationSigmoid(), true, WAVE_NEURO_OUT)); // kierunek
- wavesNeuro.getStructure().finalizeStructure();
- wavesNeuro.reset();
- }
- //x, y, distance, firingTime, enemyEnergyDrop, perfectFiringAngle, e.getBearingRadians(), e.getHeadingRadians(), e.getEnergy()
- private void incomingWaveTrain(Double x, Double y, Double firingDistance, Double perfectFiringAngle, Double bearing, Double heading, Double energy, Double out) {
- wavesNeuroTrain.add(new IncomingWaveML(x,y,firingDistance,perfectFiringAngle,bearing,heading,out));
- wavesNeuro.reset();
- double input[][] = new double[wavesNeuroTrain.size()][WAVE_NEURO_IN];
- double output[][] = new double[wavesNeuroTrain.size()][WAVE_NEURO_OUT];
- int i=0;
- for(IncomingWaveML waveTrain : wavesNeuroTrain) {
- input[i][0] = waveTrain.a;
- input[i][1] = waveTrain.b;
- output[i][0] = waveTrain.out;
- }
- NeuralDataSet trainingSet = new BasicNeuralDataSet(input, output);
- final MLTrain train = new LevenbergMarquardtTraining(wavesNeuro, trainingSet);
- for(i=0; i<100; i++) {
- train.iteration();
- if(train.getError() < 0.1) {
- break;
- }
- }
- }
- private Double incomingWaveCompute(Double x, Double y, Double firingDistance, Double perfectFiringAngle, Double bearing, Double heading, Double energy) {
- return wavesNeuro.compute(new BasicMLData(new double[]{x,y,firingDistance,perfectFiringAngle,bearing,heading,energy})).getData(0);
- }
- @Override
- public void run() {
- turnRadarRightRadians(Double.POSITIVE_INFINITY);
- //noinspection InfiniteLoopStatement
- do {
- scan();
- } while (true);
- }
- private boolean mathEq(Double x, Double y) {
- return mathEq(x, y, 0.0001);
- }
- private boolean mathEq(Double x, Double y, Double eps) {
- return Math.abs(x-y) < eps;
- }
- @Override
- public void onScannedRobot(ScannedRobotEvent e) {
- if(enemyEnergy != null && enemyEnergy > e.getEnergy()) {
- Double relative_bearing = e.getBearingRadians() + getHeadingRadians();
- Double x = getX() + e.getDistance() * Math.sin(relative_bearing);
- Double y = getY() + e.getDistance() * Math.cos(relative_bearing);
- Double distance = e.getDistance();
- Long firingTime = getTime();
- Double enemyEnergyDrop = enemyEnergy - e.getEnergy();
- Double perfectFiringAngle = 180.0 + e.getBearing() + getHeading();
- if (enemyEnergyDrop <= 3.0 && enemyEnergyDrop >= 0.1 && (enemyVelocity == null
- || (enemyVelocity - e.getVelocity() < 2.0
- && (((x >= 18.0001 && x <= getBattleFieldWidth() - 18.0001 && y >= 18.0001 && y <= getBattleFieldHeight() - 18.0001)
- || !mathEq(Rules.getWallHitDamage(enemyVelocity), enemyEnergyDrop)))))) {
- waves.add(new IncomingWave(x, y, distance, firingTime, enemyEnergyDrop, perfectFiringAngle, e.getBearingRadians(), e.getHeadingRadians(), e.getEnergy()));
- }
- }
- enemyEnergy = e.getEnergy();
- enemyVelocity = e.getVelocity();
- double radarTurn = getHeadingRadians() + e.getBearingRadians() - getRadarHeadingRadians();
- setTurnRadarRightRadians(2.0 * Utils.normalRelativeAngle(radarTurn)); // 2.0 for perfect lock
- }
- @Override
- public void onHitByBullet(HitByBulletEvent event) {
- super.onHitByBullet(event);
- if(!waves.isEmpty()) {
- IncomingWave wave = waves.peek();
- Double vbullet = 20 - 3 * wave.bulletEnergy; // robocode physics
- Double distance = (getTime()-wave.firingTime) * vbullet;
- if( mathEq(event.getPower(), wave.bulletEnergy)
- && mathEq(distance, wave.firingDistance, 25.5)) { // 25.5 ~= 18*sqrt(2) -- przekatna od centrum do "kantu" robota
- wave.hit = event.getBullet().getHeading() - wave.perfectFiringAngle;
- }
- }
- }
- @Override
- public void onPaint(Graphics2D g) {
- super.onPaint(g);
- int queue_toDelete = 0;
- for(IncomingWave wave : waves) {
- Double vbullet = 20 - 3 * wave.bulletEnergy; // robocode physics
- Double distance = (getTime()-wave.firingTime) * vbullet;
- if(distance.intValue() > wave.firingDistance) {
- queue_toDelete++;
- }
- int waveArc = 20;
- g.setColor(Color.GREEN);
- g.drawArc((int)(wave.x-distance), (int)(wave.y-distance), 2*distance.intValue(), 2*distance.intValue(), wave.perfectFiringAngle.intValue()-waveArc, 2*waveArc);
- g.setColor(Color.BLACK);
- Double tmp = Math.toRadians(wave.perfectFiringAngle);
- g.drawLine(wave.x.intValue(), wave.y.intValue(), (int)(wave.x+distance*Math.sin(tmp)), (int)(wave.y+distance*Math.cos(tmp)));
- g.setColor(Color.RED);
- Double res = incomingWaveCompute(wave.x, wave.y, wave.firingDistance, wave.perfectFiringAngle, wave.bearing, wave.heading, wave.energy);
- Double tmp2 = Math.toRadians(wave.perfectFiringAngle+res);
- g.drawLine(wave.x.intValue(), wave.y.intValue(), (int)(wave.x+distance*Math.sin(tmp2)), (int)(wave.y+distance*Math.cos(tmp2)));
- }
- for(; queue_toDelete > 0; queue_toDelete--) {
- IncomingWave wave = waves.remove();
- if(wave.hit != null) {
- incomingWaveTrain(wave.x, wave.y, wave.firingDistance, wave.perfectFiringAngle, wave.bearing, wave.heading, wave.energy, wave.hit);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement