Talk:Gilgalad/movementStrategy
Jump to navigation
Jump to search
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)