Difference between revisions of "Talk:Gilgalad/movementStrategy"

From Robowiki
Jump to navigation Jump to search
(Talk page autocreated when first thread was posted.)
 
(classification data)
 
Line 1: Line 1:
 +
So, I've always been a big fan of Tomcat's movement strategy where, if I understand correctly, you use a bunch of classification schemes and then give them scores based on their performance.  I tried this a long tie ago with Gilgalad, but it didn't work well.  I'm giving it another shot now, and if nothing else, hopefully it will give me a better idea of what classifiers to use and when.
  
 +
 +
some data against raiko at the end of 35 rounds:
 +
 +
Classifier scores are based on the predicted probability given for a known bullet being within a certain range (for now +or- 0.2 radians).  After each known enemy bullet, this is updated and the printed score is classifierNScore/classifier0Score.
 +
 +
<code><syntaxhighlight>
 +
 +
Battle 1:
 +
 +
 +
Classifier 0 scores :1.0
 +
Classifier 1 scores :0.9755870469605517
 +
Classifier 2 scores :1.2369225462233957
 +
Classifier 3 scores :1.7528612982062486
 +
Classifier 4 scores :1.5329624603178138
 +
Classifier 5 scores :1.234924887594898
 +
Classifier 6 scores :1.4174531972595874
 +
Classifier 7 scores :1.3371945667211411
 +
Classifier 8 scores :1.4380071717393625
 +
Classifier 9 scores :1.893821500835094
 +
Classifier 10 scores :1.9142428440452988
 +
Classifier 11 scores :1.813500313301308
 +
 +
Battle 2:
 +
Classifier 0 scores :1.0
 +
Classifier 1 scores :1.1423071895729844
 +
Classifier 2 scores :1.3729425281975491
 +
Classifier 3 scores :1.7008483463501145
 +
Classifier 4 scores :1.182167218778795
 +
Classifier 5 scores :1.4489710167607848
 +
Classifier 6 scores :1.458752434946134
 +
Classifier 7 scores :1.4119814269034254
 +
Classifier 8 scores :1.5747806346700741
 +
Classifier 9 scores :1.7756977755746486
 +
Classifier 10 scores :1.8393932242812359
 +
Classifier 11 scores :1.6320145203001994
 +
 +
Battle 3:
 +
Classifier 0 scores :1.0
 +
Classifier 1 scores :0.9247600453962282
 +
Classifier 2 scores :1.1469307013639247
 +
Classifier 3 scores :1.5011101838893393
 +
Classifier 4 scores :1.6256472273752074
 +
Classifier 5 scores :1.5499125684940858
 +
Classifier 6 scores :1.425592000093903
 +
Classifier 7 scores :1.5781481081082624
 +
Classifier 8 scores :1.6686308538501025
 +
Classifier 9 scores :1.7011388408736738
 +
Classifier 10 scores :1.7764882022837205
 +
Classifier 11 scores :1.6438392150877148
 +
 +
 +
the classifiers are set up as follows:
 +
 +
ClassificationWeightingScheme CWS = new AntiSimpleTargeterWeightingScheme();
 +
MovementClassifier MC = new KNNMovementClassifier(CWS, 36, 0, 5, 3, 1.0,
 +
Double.MIN_VALUE, 0.0, 0.15);
 +
 +
CWS = new AntiSimpleTargeter2WeightingScheme();
 +
MC = new KNNMovementClassifier(CWS, 36, 0, 5, 3, 1.0, Double.MIN_VALUE, 0.0, 0.15);
 +
 +
CWS = new AntiSimpleTargeter3WeightingScheme();
 +
MC = new KNNMovementClassifier(CWS, 36, 0, 5, 3, 1.0, Double.MIN_VALUE, 0.0, 0.15);
 +
 +
CWS = new AntiStandardTargeterWeightingScheme();
 +
MC = new KNNMovementClassifier(CWS, 36, 0, 5, 10, 50.0, Double.MIN_VALUE, 0.0, 0.08);
 +
 +
CWS = new AntiSemiAdvancedTargeterWeightingScheme();
 +
 +
MC = new KNNMovementClassifier(CWS, 36, 1, 5, 5, 50.0, Double.MIN_VALUE, 4.0, 0.08);
 +
Classifiers.add(MC);
 +
MC = new KNNMovementClassifier(CWS, 36, 3, 5, 5, 50.0, Double.MIN_VALUE, 4.0, 0.08);
 +
Classifiers.add(MC);
 +
MC = new KNNMovementClassifier(CWS, 36, 5, 5, 5, 50.0, Double.MIN_VALUE, 4.0, 0.08);
 +
Classifiers.add(MC);
 +
MC = new KNNMovementClassifier(CWS, 36, 10, 5, 5, 50.0, Double.MIN_VALUE, 4.0, 0.08);
 +
Classifiers.add(MC);
 +
MC = new KNNMovementClassifier(CWS, 36, 20, 5, 5, 50.0, Double.MIN_VALUE, 4.0, 0.08);
 +
Classifiers.add(MC);
 +
MC = new KNNMovementClassifier(CWS, 55, 50, 5, 5, 50.0, Double.MIN_VALUE, 4.0, 0.08);
 +
Classifiers.add(MC);
 +
MC = new KNNMovementClassifier(CWS, 105, 100, 5, 5, 50.0, Double.MIN_VALUE, 4.0, 0.08);
 +
Classifiers.add(MC);
 +
MC = new KNNMovementClassifier(CWS, 36, 0, 5, 10, 50.0, Double.MIN_VALUE, 4.0, 0.08);
 +
Classifiers.add(MC);
 +
 +
 +
 +
public class AntiSemiAdvancedTargeterWeightingScheme extends
 +
ClassificationWeightingScheme {
 +
 +
public AntiSemiAdvancedTargeterWeightingScheme() {
 +
_weights = new double[] { 4.0, 4.0, 1.5, 2.0, 3.0, 3.0, 3.0, 3.0, 2.0};
 +
// _weights = new double[] { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
 +
}
 +
 +
@Override
 +
public double[] getPointCoordinates(DataWave wave) {
 +
MovementDataWave movementWave = (MovementDataWave) wave;
 +
 +
double[] dataPointCoordinates = new double[_weights.length];
 +
dataPointCoordinates[0] = _weights[0] * movementWave.getBulletTravelTime()
 +
* 0.009166667;
 +
dataPointCoordinates[1] = _weights[1]
 +
* Math.min(Math.PI / 2, wave.getAheadWallDist()) / (Math.PI / 2);
 +
dataPointCoordinates[2] = _weights[2]
 +
* Math.min(Math.PI / 2, wave.getReverseWallDist()) / (Math.PI / 2);
 +
dataPointCoordinates[3] = _weights[3]
 +
* (wave.getVChange() + Rules.DECELERATION)
 +
/ (Rules.ACCELERATION + Rules.DECELERATION);
 +
dataPointCoordinates[4] = _weights[4]
 +
* Math.sin(movementWave.getRelHeading());
 +
 +
dataPointCoordinates[5] = _weights[5]
 +
* (Math.cos(movementWave.getRelHeading()) + 1) / 2;
 +
dataPointCoordinates[6] = _weights[6]
 +
* Math.abs(wave.getTargetVelocity()) / 8.0;
 +
dataPointCoordinates[7] = _weights[7] * Math.min(1.0, movementWave.getTicksSinceVelocityChange() / movementWave.getBulletTravelTime());
 +
dataPointCoordinates[8] = _weights[8] * movementWave.getRobotDistLast10Ticks() * 0.0125;
 +
 +
 +
return dataPointCoordinates;
 +
}
 +
}
 +
 +
public class AntiStandardTargeterWeightingScheme extends
 +
ClassificationWeightingScheme {
 +
 +
public AntiStandardTargeterWeightingScheme() {
 +
_weights = new double[] { 4.0, 4.0, 1.0, 2.0, 3.0, 3.0, 3.0, 3.0, 2.0};
 +
// _weights = new double[] { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
 +
}
 +
 +
@Override
 +
public double[] getPointCoordinates(DataWave wave) {
 +
MovementDataWave movementWave = (MovementDataWave) wave;
 +
 +
double[] dataPointCoordinates = new double[_weights.length];
 +
dataPointCoordinates[0] = _weights[0] * movementWave.getBulletTravelTime()
 +
* 0.009166667;
 +
dataPointCoordinates[1] = _weights[1]
 +
* Math.min(Math.PI / 2, wave.getAheadWallDist()) / (Math.PI / 2);
 +
dataPointCoordinates[2] = _weights[2]
 +
* Math.min(Math.PI / 2, wave.getReverseWallDist()) / (Math.PI / 2);
 +
dataPointCoordinates[3] = _weights[3]
 +
* (wave.getVChange() + Rules.DECELERATION)
 +
/ (Rules.ACCELERATION + Rules.DECELERATION);
 +
dataPointCoordinates[4] = _weights[4]
 +
* Math.sin(movementWave.getRelHeading());
 +
 +
dataPointCoordinates[5] = _weights[5]
 +
* (Math.cos(movementWave.getRelHeading()) + 1) / 2;
 +
dataPointCoordinates[6] = _weights[6]
 +
* Math.abs(wave.getTargetVelocity()) / 8.0;
 +
dataPointCoordinates[7] = _weights[7] * Math.min(1.0, movementWave.getTicksSinceVelocityChange() / movementWave.getBulletTravelTime());
 +
dataPointCoordinates[8] = _weights[8] * movementWave.getRobotDistLast10Ticks() * 0.0125;
 +
 +
return dataPointCoordinates;
 +
}
 +
}
 +
 +
 +
public class AntiSimpleTargeterWeightingScheme extends
 +
ClassificationWeightingScheme {
 +
 +
public AntiSimpleTargeterWeightingScheme() {
 +
_weights = new double[] { 1.0, 1.0 };
 +
}
 +
 +
@Override
 +
public double[] getPointCoordinates(DataWave wave) {
 +
MovementDataWave movementWave = (MovementDataWave) wave;
 +
 +
double[] dataPointCoordinates = new double[_weights.length];
 +
dataPointCoordinates[0] = _weights[0] * movementWave.getBulletTravelTime()
 +
* 0.009166667;
 +
dataPointCoordinates[1] = _weights[1] * Math.abs(movementWave.getTargetVelocity() * Math.sin(movementWave.getRelHeading()))
 +
/ 8.0;
 +
 +
 +
return dataPointCoordinates;
 +
}
 +
}
 +
 +
public class AntiSimpleTargeter2WeightingScheme extends
 +
ClassificationWeightingScheme {
 +
 +
public AntiSimpleTargeter2WeightingScheme() {
 +
_weights = new double[] { 1.0, 1.0, 1.0};
 +
}
 +
 +
@Override
 +
public double[] getPointCoordinates(DataWave wave) {
 +
MovementDataWave movementWave = (MovementDataWave) wave;
 +
 +
double[] dataPointCoordinates = new double[_weights.length];
 +
dataPointCoordinates[0] = _weights[0] * movementWave.getBulletTravelTime()
 +
* 0.009166667;
 +
dataPointCoordinates[1] = _weights[1] * Math.abs(movementWave.getTargetVelocity())
 +
/ 8.0;
 +
dataPointCoordinates[2] = _weights[2] * (Math.cos(movementWave.getRelHeading()) + 1) / 2;
 +
 +
 +
return dataPointCoordinates;
 +
}
 +
}
 +
 +
public class AntiSimpleTargeter3WeightingScheme extends
 +
ClassificationWeightingScheme {
 +
 +
public AntiSimpleTargeter3WeightingScheme() {
 +
_weights = new double[] { 1.0, 1.0, 1.0, 1.0, 1.0};
 +
}
 +
 +
@Override
 +
public double[] getPointCoordinates(DataWave wave) {
 +
MovementDataWave movementWave = (MovementDataWave) wave;
 +
 +
double[] dataPointCoordinates = new double[_weights.length];
 +
dataPointCoordinates[0] = _weights[0] * movementWave.getBulletTravelTime()
 +
* 0.009166667;
 +
dataPointCoordinates[1] = _weights[1]
 +
* Math.sin(movementWave.getRelHeading());
 +
dataPointCoordinates[2] = _weights[2]
 +
* (Math.cos(movementWave.getRelHeading()) + 1) / 2;
 +
dataPointCoordinates[3] = _weights[3] * Math.abs(movementWave.getTargetVelocity())
 +
/ 8.0;
 +
dataPointCoordinates[4] = _weights[4] * (wave.getVChange() + Rules.DECELERATION)
 +
/ (Rules.ACCELERATION + Rules.DECELERATION);
 +
 +
 +
return dataPointCoordinates;
 +
}
 +
}
 +
 +
</syntaxhighlight>
 +
</code>
 +
 +
 +
[[User:AW|AW]] 16:16, 31 March 2013 (UTC)

Latest revision as of 18:16, 31 March 2013

So, I've always been a big fan of Tomcat's movement strategy where, if I understand correctly, you use a bunch of classification schemes and then give them scores based on their performance. I tried this a long tie ago with Gilgalad, but it didn't work well. I'm giving it another shot now, and if nothing else, hopefully it will give me a better idea of what classifiers to use and when.


some data against raiko at the end of 35 rounds:

Classifier scores are based on the predicted probability given for a known bullet being within a certain range (for now +or- 0.2 radians). After each known enemy bullet, this is updated and the printed score is classifierNScore/classifier0Score.

Battle 1:


Classifier 0 scores :1.0
Classifier 1 scores :0.9755870469605517
Classifier 2 scores :1.2369225462233957
Classifier 3 scores :1.7528612982062486
Classifier 4 scores :1.5329624603178138
Classifier 5 scores :1.234924887594898
Classifier 6 scores :1.4174531972595874
Classifier 7 scores :1.3371945667211411
Classifier 8 scores :1.4380071717393625
Classifier 9 scores :1.893821500835094
Classifier 10 scores :1.9142428440452988
Classifier 11 scores :1.813500313301308

Battle 2:
Classifier 0 scores :1.0
Classifier 1 scores :1.1423071895729844
Classifier 2 scores :1.3729425281975491
Classifier 3 scores :1.7008483463501145
Classifier 4 scores :1.182167218778795
Classifier 5 scores :1.4489710167607848
Classifier 6 scores :1.458752434946134
Classifier 7 scores :1.4119814269034254
Classifier 8 scores :1.5747806346700741
Classifier 9 scores :1.7756977755746486
Classifier 10 scores :1.8393932242812359
Classifier 11 scores :1.6320145203001994

Battle 3:
Classifier 0 scores :1.0
Classifier 1 scores :0.9247600453962282
Classifier 2 scores :1.1469307013639247
Classifier 3 scores :1.5011101838893393
Classifier 4 scores :1.6256472273752074
Classifier 5 scores :1.5499125684940858
Classifier 6 scores :1.425592000093903
Classifier 7 scores :1.5781481081082624
Classifier 8 scores :1.6686308538501025
Classifier 9 scores :1.7011388408736738
Classifier 10 scores :1.7764882022837205
Classifier 11 scores :1.6438392150877148


the classifiers are set up as follows:

		ClassificationWeightingScheme CWS = new AntiSimpleTargeterWeightingScheme();
		MovementClassifier MC = new KNNMovementClassifier(CWS, 36, 0, 5, 3, 1.0, 
				Double.MIN_VALUE, 0.0, 0.15);

		CWS = new AntiSimpleTargeter2WeightingScheme();
		MC = new KNNMovementClassifier(CWS, 36, 0, 5, 3, 1.0, Double.MIN_VALUE, 0.0, 0.15);

		CWS = new AntiSimpleTargeter3WeightingScheme();
		MC = new KNNMovementClassifier(CWS, 36, 0, 5, 3, 1.0, Double.MIN_VALUE, 0.0, 0.15);
		
		CWS = new AntiStandardTargeterWeightingScheme();
		MC = new KNNMovementClassifier(CWS, 36, 0, 5, 10, 50.0, Double.MIN_VALUE, 0.0, 0.08);

		CWS = new AntiSemiAdvancedTargeterWeightingScheme();
		
		MC = new KNNMovementClassifier(CWS, 36, 1, 5, 5, 50.0, Double.MIN_VALUE, 4.0, 0.08);
		Classifiers.add(MC);
		MC = new KNNMovementClassifier(CWS, 36, 3, 5, 5, 50.0, Double.MIN_VALUE, 4.0, 0.08);
		Classifiers.add(MC);
		MC = new KNNMovementClassifier(CWS, 36, 5, 5, 5, 50.0, Double.MIN_VALUE, 4.0, 0.08);
		Classifiers.add(MC);
		MC = new KNNMovementClassifier(CWS, 36, 10, 5, 5, 50.0, Double.MIN_VALUE, 4.0, 0.08);
		Classifiers.add(MC);
		MC = new KNNMovementClassifier(CWS, 36, 20, 5, 5, 50.0, Double.MIN_VALUE, 4.0, 0.08);
		Classifiers.add(MC);
		MC = new KNNMovementClassifier(CWS, 55, 50, 5, 5, 50.0, Double.MIN_VALUE, 4.0, 0.08);
		Classifiers.add(MC);
		MC = new KNNMovementClassifier(CWS, 105, 100, 5, 5, 50.0, Double.MIN_VALUE, 4.0, 0.08);
		Classifiers.add(MC);
		MC = new KNNMovementClassifier(CWS, 36, 0, 5, 10, 50.0, Double.MIN_VALUE, 4.0, 0.08);
		Classifiers.add(MC);



public class AntiSemiAdvancedTargeterWeightingScheme extends
		ClassificationWeightingScheme {
	
	public AntiSemiAdvancedTargeterWeightingScheme() {
		_weights = new double[] { 4.0, 4.0, 1.5, 2.0, 3.0, 3.0, 3.0, 3.0, 2.0};
//		_weights = new double[] { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
	}

	@Override
	public double[] getPointCoordinates(DataWave wave) {
		MovementDataWave movementWave = (MovementDataWave) wave;

		double[] dataPointCoordinates = new double[_weights.length];
		dataPointCoordinates[0] = _weights[0] * movementWave.getBulletTravelTime()
				* 0.009166667;
		dataPointCoordinates[1] = _weights[1]
				* Math.min(Math.PI / 2, wave.getAheadWallDist()) / (Math.PI / 2);
		dataPointCoordinates[2] = _weights[2]
				* Math.min(Math.PI / 2, wave.getReverseWallDist()) / (Math.PI / 2);
		dataPointCoordinates[3] = _weights[3]
				* (wave.getVChange() + Rules.DECELERATION)
				/ (Rules.ACCELERATION + Rules.DECELERATION);
		dataPointCoordinates[4] = _weights[4] 
				* Math.sin(movementWave.getRelHeading());
		
		dataPointCoordinates[5] = _weights[5]
				* (Math.cos(movementWave.getRelHeading()) + 1) / 2;
		dataPointCoordinates[6] = _weights[6]
				* Math.abs(wave.getTargetVelocity()) / 8.0;
		dataPointCoordinates[7] = _weights[7] * Math.min(1.0, movementWave.getTicksSinceVelocityChange() / movementWave.getBulletTravelTime());
		dataPointCoordinates[8] = _weights[8] * movementWave.getRobotDistLast10Ticks() * 0.0125;


		return dataPointCoordinates;
	}
}

public class AntiStandardTargeterWeightingScheme extends
		ClassificationWeightingScheme {
	
	public AntiStandardTargeterWeightingScheme() {
		_weights = new double[] { 4.0, 4.0, 1.0, 2.0, 3.0, 3.0, 3.0, 3.0, 2.0};
//		_weights = new double[] { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
	}

	@Override
	public double[] getPointCoordinates(DataWave wave) {
		MovementDataWave movementWave = (MovementDataWave) wave;

		double[] dataPointCoordinates = new double[_weights.length];
		dataPointCoordinates[0] = _weights[0] * movementWave.getBulletTravelTime()
				* 0.009166667;
		dataPointCoordinates[1] = _weights[1]
				* Math.min(Math.PI / 2, wave.getAheadWallDist()) / (Math.PI / 2);
		dataPointCoordinates[2] = _weights[2]
				* Math.min(Math.PI / 2, wave.getReverseWallDist()) / (Math.PI / 2);
		dataPointCoordinates[3] = _weights[3]
				* (wave.getVChange() + Rules.DECELERATION)
				/ (Rules.ACCELERATION + Rules.DECELERATION);
		dataPointCoordinates[4] = _weights[4] 
				* Math.sin(movementWave.getRelHeading());
		
		dataPointCoordinates[5] = _weights[5]
				* (Math.cos(movementWave.getRelHeading()) + 1) / 2;
		dataPointCoordinates[6] = _weights[6]
				* Math.abs(wave.getTargetVelocity()) / 8.0;
		dataPointCoordinates[7] = _weights[7] * Math.min(1.0, movementWave.getTicksSinceVelocityChange() / movementWave.getBulletTravelTime());
		dataPointCoordinates[8] = _weights[8] * movementWave.getRobotDistLast10Ticks() * 0.0125;

		return dataPointCoordinates;
	}
}


public class AntiSimpleTargeterWeightingScheme extends
		ClassificationWeightingScheme {
	
	public AntiSimpleTargeterWeightingScheme() {
		_weights = new double[] { 1.0, 1.0 };
	}

	@Override
	public double[] getPointCoordinates(DataWave wave) {
		MovementDataWave movementWave = (MovementDataWave) wave;

		double[] dataPointCoordinates = new double[_weights.length];
		dataPointCoordinates[0] = _weights[0] * movementWave.getBulletTravelTime()
				* 0.009166667;
		dataPointCoordinates[1] = _weights[1] * Math.abs(movementWave.getTargetVelocity() * Math.sin(movementWave.getRelHeading()))
				/ 8.0;

		
		return dataPointCoordinates;
	}
}

public class AntiSimpleTargeter2WeightingScheme extends
		ClassificationWeightingScheme {
	
	public AntiSimpleTargeter2WeightingScheme() {
		_weights = new double[] { 1.0, 1.0, 1.0};
	}

	@Override
	public double[] getPointCoordinates(DataWave wave) {
		MovementDataWave movementWave = (MovementDataWave) wave;

		double[] dataPointCoordinates = new double[_weights.length];
		dataPointCoordinates[0] = _weights[0] * movementWave.getBulletTravelTime()
				* 0.009166667;
		dataPointCoordinates[1] = _weights[1] * Math.abs(movementWave.getTargetVelocity())
				/ 8.0;
		dataPointCoordinates[2] = _weights[2] * (Math.cos(movementWave.getRelHeading()) + 1) / 2;

		
		return dataPointCoordinates;
	}
}

public class AntiSimpleTargeter3WeightingScheme extends
		ClassificationWeightingScheme {
	
	public AntiSimpleTargeter3WeightingScheme() {
		_weights = new double[] { 1.0, 1.0, 1.0, 1.0, 1.0};
	}

	@Override
	public double[] getPointCoordinates(DataWave wave) {
		MovementDataWave movementWave = (MovementDataWave) wave;

		double[] dataPointCoordinates = new double[_weights.length];
		dataPointCoordinates[0] = _weights[0] * movementWave.getBulletTravelTime()
				* 0.009166667;
		dataPointCoordinates[1] = _weights[1]
				* Math.sin(movementWave.getRelHeading());
		dataPointCoordinates[2] = _weights[2]
				* (Math.cos(movementWave.getRelHeading()) + 1) / 2;
		dataPointCoordinates[3] = _weights[3] * Math.abs(movementWave.getTargetVelocity())
				/ 8.0;
		dataPointCoordinates[4] = _weights[4] * (wave.getVChange() + Rules.DECELERATION)
				/ (Rules.ACCELERATION + Rules.DECELERATION);

		
		return dataPointCoordinates;
	}
}


AW 16:16, 31 March 2013 (UTC)