Advertisement
kpfp_linux

prototype02 4:48am

Jun 29th, 2014
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.43 KB | None | 0 0
  1. package bg;
  2.  
  3.  
  4. import org.encog.engine.network.activation.ActivationSigmoid;
  5. import org.encog.ml.data.basic.BasicMLData;
  6. import org.encog.ml.train.MLTrain;
  7. import org.encog.neural.data.NeuralDataSet;
  8. import org.encog.neural.data.basic.BasicNeuralDataSet;
  9. import org.encog.neural.networks.BasicNetwork;
  10. import org.encog.neural.networks.layers.BasicLayer;
  11. import org.encog.neural.networks.training.lma.LevenbergMarquardtTraining;
  12. import robocode.AdvancedRobot;
  13. import robocode.HitByBulletEvent;
  14. import robocode.Rules;
  15. import robocode.ScannedRobotEvent;
  16. import robocode.util.Utils;
  17.  
  18. import java.awt.*;
  19. import java.util.ArrayList;
  20. import java.util.concurrent.ConcurrentLinkedQueue;
  21.  
  22.  
  23.  
  24.  
  25. @SuppressWarnings("UnusedDeclaration")
  26. public class prototype02 extends AdvancedRobot {
  27.  
  28.     public static final int WAVE_NEURO_OUT = 7;
  29.     public static final int WAVE_NEURO_IN = 2;
  30.  
  31.     class IncomingWave {
  32.         public final Double x, y, firingDistance, bulletEnergy, perfectFiringAngle, bearing, heading, energy;
  33.         public final Long firingTime;
  34.         public Double hit = null;
  35.  
  36.         public IncomingWave(Double x, Double y, Double firingDistance, Long firingTime, Double bulletEnergy, Double perfectFiringAngle,
  37.                             Double bearing, Double heading, Double energy) {
  38.             this.x = x;
  39.             this.y = y;
  40.             this.firingDistance = firingDistance;
  41.             this.firingTime = firingTime;
  42.             this.bulletEnergy = bulletEnergy;
  43.             this.perfectFiringAngle = perfectFiringAngle;
  44.             this.bearing = bearing;
  45.             this.heading = heading;
  46.             this.energy = energy;
  47.         }
  48.     }
  49.  
  50.     class IncomingWaveML {
  51.         public final Double a,b,c,d,e,f;
  52.         public final Double out;
  53.         IncomingWaveML(Double a, Double b, Double c, Double d, Double e, Double f, Double out) {
  54.             this.a = a;
  55.             this.b = b;
  56.             this.c = c;
  57.             this.d = d;
  58.             this.e = e;
  59.             this.f = f;
  60.             this.out = out;
  61.         }
  62.     }
  63.  
  64.     private ConcurrentLinkedQueue<IncomingWave> waves = new ConcurrentLinkedQueue<IncomingWave>();
  65.     private Double enemyEnergy = null;
  66.     private Double enemyVelocity = null;
  67.     private BasicNetwork wavesNeuro = new BasicNetwork();
  68.     private ArrayList<IncomingWaveML> wavesNeuroTrain = new ArrayList<IncomingWaveML>();
  69.  
  70.     public prototype02() {
  71.         wavesNeuro.addLayer(new BasicLayer(new ActivationSigmoid(), true, WAVE_NEURO_IN)); // my (idealny kierunek, odległość)
  72.         wavesNeuro.addLayer(new BasicLayer(new ActivationSigmoid(), true, 5));
  73.         wavesNeuro.addLayer(new BasicLayer(new ActivationSigmoid(), true, 5));
  74.         wavesNeuro.addLayer(new BasicLayer(new ActivationSigmoid(), true, WAVE_NEURO_OUT)); // kierunek
  75.         wavesNeuro.getStructure().finalizeStructure();
  76.         wavesNeuro.reset();
  77.     }
  78.  
  79.     //x, y, distance, firingTime, enemyEnergyDrop, perfectFiringAngle, e.getBearingRadians(), e.getHeadingRadians(), e.getEnergy()
  80.     private void incomingWaveTrain(Double x, Double y, Double firingDistance, Double perfectFiringAngle, Double bearing, Double heading, Double energy, Double out) {
  81.         wavesNeuroTrain.add(new IncomingWaveML(x,y,firingDistance,perfectFiringAngle,bearing,heading,out));
  82.  
  83.         wavesNeuro.reset();
  84.         double input[][] = new double[wavesNeuroTrain.size()][WAVE_NEURO_IN];
  85.         double output[][] = new double[wavesNeuroTrain.size()][WAVE_NEURO_OUT];
  86.  
  87.         int i=0;
  88.         for(IncomingWaveML waveTrain : wavesNeuroTrain) {
  89.             input[i][0] = waveTrain.a;
  90.             input[i][1] = waveTrain.b;
  91.             output[i][0] = waveTrain.out;
  92.         }
  93.  
  94.         NeuralDataSet trainingSet = new BasicNeuralDataSet(input, output);
  95.         final MLTrain train = new LevenbergMarquardtTraining(wavesNeuro, trainingSet);
  96.  
  97.         for(i=0; i<100; i++) {
  98.             train.iteration();
  99.             if(train.getError() < 0.1) {
  100.                 break;
  101.             }
  102.         }
  103.     }
  104.  
  105.     private Double incomingWaveCompute(Double x, Double y, Double firingDistance, Double perfectFiringAngle, Double bearing, Double heading, Double energy) {
  106.         return wavesNeuro.compute(new BasicMLData(new double[]{x,y,firingDistance,perfectFiringAngle,bearing,heading,energy})).getData(0);
  107.     }
  108.  
  109.     @Override
  110.     public void run() {
  111.         turnRadarRightRadians(Double.POSITIVE_INFINITY);
  112.         //noinspection InfiniteLoopStatement
  113.         do {
  114.             scan();
  115.         } while (true);
  116.     }
  117.  
  118.     private boolean mathEq(Double x, Double y) {
  119.         return mathEq(x, y, 0.0001);
  120.     }
  121.  
  122.     private boolean mathEq(Double x, Double y, Double eps) {
  123.         return Math.abs(x-y) < eps;
  124.     }
  125.  
  126.     @Override
  127.     public void onScannedRobot(ScannedRobotEvent e) {
  128.         if(enemyEnergy != null && enemyEnergy > e.getEnergy()) {
  129.             Double relative_bearing = e.getBearingRadians() + getHeadingRadians();
  130.             Double x = getX() + e.getDistance() * Math.sin(relative_bearing);
  131.             Double y = getY() + e.getDistance() * Math.cos(relative_bearing);
  132.             Double distance = e.getDistance();
  133.             Long firingTime = getTime();
  134.             Double enemyEnergyDrop = enemyEnergy - e.getEnergy();
  135.             Double perfectFiringAngle = 180.0 + e.getBearing() + getHeading();
  136.             if (enemyEnergyDrop <= 3.0 && enemyEnergyDrop >= 0.1 && (enemyVelocity == null
  137.                     || (enemyVelocity - e.getVelocity() < 2.0
  138.                     && (((x >= 18.0001 && x <= getBattleFieldWidth() - 18.0001 && y >= 18.0001 && y <= getBattleFieldHeight() - 18.0001)
  139.                     || !mathEq(Rules.getWallHitDamage(enemyVelocity), enemyEnergyDrop)))))) {
  140.                         waves.add(new IncomingWave(x, y, distance, firingTime, enemyEnergyDrop, perfectFiringAngle, e.getBearingRadians(), e.getHeadingRadians(), e.getEnergy()));
  141.             }
  142.         }
  143.         enemyEnergy = e.getEnergy();
  144.         enemyVelocity = e.getVelocity();
  145.         double radarTurn = getHeadingRadians() + e.getBearingRadians() - getRadarHeadingRadians();
  146.         setTurnRadarRightRadians(2.0 * Utils.normalRelativeAngle(radarTurn)); // 2.0 for perfect lock
  147.     }
  148.  
  149.     @Override
  150.     public void onHitByBullet(HitByBulletEvent event) {
  151.         super.onHitByBullet(event);
  152.         if(!waves.isEmpty()) {
  153.             IncomingWave wave = waves.peek();
  154.             Double vbullet = 20 - 3 * wave.bulletEnergy; // robocode physics
  155.             Double distance = (getTime()-wave.firingTime) * vbullet;
  156.             if(   mathEq(event.getPower(), wave.bulletEnergy)
  157.                && mathEq(distance, wave.firingDistance, 25.5)) { // 25.5 ~= 18*sqrt(2) -- przekatna od centrum do "kantu" robota
  158.                 wave.hit = event.getBullet().getHeading() - wave.perfectFiringAngle;
  159.             }
  160.         }
  161.     }
  162.  
  163.     @Override
  164.     public void onPaint(Graphics2D g) {
  165.         super.onPaint(g);
  166.  
  167.  
  168.         int queue_toDelete = 0;
  169.         for(IncomingWave wave : waves) {
  170.             Double vbullet = 20 - 3 * wave.bulletEnergy; // robocode physics
  171.             Double distance = (getTime()-wave.firingTime) * vbullet;
  172.             if(distance.intValue() > wave.firingDistance) {
  173.                 queue_toDelete++;
  174.             }
  175.             int waveArc = 20;
  176.  
  177.             g.setColor(Color.GREEN);
  178.             g.drawArc((int)(wave.x-distance), (int)(wave.y-distance), 2*distance.intValue(), 2*distance.intValue(), wave.perfectFiringAngle.intValue()-waveArc, 2*waveArc);
  179.  
  180.             g.setColor(Color.BLACK);
  181.             Double tmp = Math.toRadians(wave.perfectFiringAngle);
  182.             g.drawLine(wave.x.intValue(), wave.y.intValue(), (int)(wave.x+distance*Math.sin(tmp)), (int)(wave.y+distance*Math.cos(tmp)));
  183.  
  184.             g.setColor(Color.RED);
  185.             Double res = incomingWaveCompute(wave.x, wave.y, wave.firingDistance, wave.perfectFiringAngle, wave.bearing, wave.heading, wave.energy);
  186.             Double tmp2 = Math.toRadians(wave.perfectFiringAngle+res);
  187.             g.drawLine(wave.x.intValue(), wave.y.intValue(), (int)(wave.x+distance*Math.sin(tmp2)), (int)(wave.y+distance*Math.cos(tmp2)));
  188.  
  189.  
  190.         }
  191.         for(; queue_toDelete > 0; queue_toDelete--) {
  192.             IncomingWave wave = waves.remove();
  193.             if(wave.hit != null) {
  194.                 incomingWaveTrain(wave.x, wave.y, wave.firingDistance, wave.perfectFiringAngle, wave.bearing, wave.heading, wave.energy, wave.hit);
  195.             }
  196.         }
  197.     }
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement