XanderCat
XanderCat | |
Author(s) | Skotty |
Extends | AdvancedRobot |
Targeting | GF / Linear / Circular / Anti-Mirror |
Movement | WS(Hybrid) / Anti-Mirror / RamEscape / IdealPosition |
Released | 2011-5-20 (v 1.0) |
Best Rating | #34 (v 9.3) |
Current Version | 9.3 |
Code License | GCWCD |
Download |
Contents
Introduction
MegaBot based on my "Xander" robot framework with pluggable guns, radars, and drives. XanderCat is the flagship of my robot fleet. It is a multi-mode robot using multiple guns and drives. It's main gun is a guess factor gun, and the main drive is a wave surfing drive, but a number of other guns and drives exist for special situations. Both the main gun and drive are currently using a hybrid form of dynamic clustering. The drive is somewhat unique in that it decides where it wants to go and goes there directly (no orbiting -- though the path still is somewhat orbital in nature due to distancing -- and no wall stick required).
Best against: Any robot that spends too much time standing still, going straight, going in circles, or doing basic mirroring.
Worst against: Nothing specific, but still need to improve against the middle pack.
Arch Nemisis: lazarecki.mega.PinkerStinker 0.7 (not only because I have trouble beating that one, but because I hate it's name)
Past Version Notes: For information on versions prior to the current series, see the XanderCat/History page.
Component Chain:
Default --> Basic Radar | v RamScenario --> Ram Escape Drive, Linear Gun | v MirrorScenario --> Anti-Mirror Drive, Anti-Mirror Gun | v NoBulletWavesScenario --> Ideal Position Drive | v Defaults --> GuessFactorGun, Direct Wave Surfing Drive
Hybrid Dynamic Clustering?
XanderCat uses Dynamic Clustering (DC) in the sense that data about past waves is stored in a tree structure. For each wave, past data is pulled from the tree that as closely as possible matches the current situation, and that data is used to decide where to aim or drive. However, once the data is pulled, how to use it differs from classic DC. In classic DC, some form of kernel density algorithm is used to determine what to do. In the XanderCat hybrid approach, it behaves more like VCS, in that the data is logged into a factor array, and that array is surfed in the GoTo style.
Version Notes
Version Ranks
Note: Best Change and Worst Change are the change from previous version against the given opponent.
Note: Starting from version 6.4 onward in the table, I am ignoring nat.BlackHole 2.0gamma and nat.Samekh 0.4, as scores against them always fluctuate rather wildly.
Version | 1-on-1 Rank | Top | Best Change | % Score Change | Worst Change | % Score Change |
---|---|---|---|---|---|---|
1.0 | ~475 / 805 | 59% | N/A | N/A | N/A | N/A |
2.0 | 386 / 806 | 48% | mld.Wisdom 1.0 | 4.18 -> 76.13 | SuperSample.SuperCrazy 1.0 | 61.97 -> 37.00 |
2.1 | 320 / 805 | 40% | dz.MostlyHarmlessNano 2.1 | 20.90 -> 63.01 | jf.Dodger 1.1 | 78.98 -> 41.10 |
3.0 | 148 / 805 | 18% | gg.Wolverine 2.0 | 41.08 -> 94.57 | xiongan.Xiongan 1.1 | 100.0 -> 74.39 |
3.1 | 145 / 804 | 18% | zyx.nano.RedBull 1.0 | 53.4 -> 85.3 | pulsar.PulsarNano 0.2.4 | 89.3 -> 64.2 |
3.2 | 116 / 806 | 14% | ags.polished.PolishedRuby 1 | 28.5 -> 83.5 | rsim.micro.uCatcher 0.1 | 91.7 -> 31.8 |
3.3 | 115 / 806 | 14% | nat.Samekh 0.4 | 24.9 -> 64.9 | simonton.micro.GFMicro 1.0 | 62.2 -> 39.2 |
3.4 | 85 / 806 | 11% | dsx724.VSAB_EP3a 1.0 | 67.2 -> 93.4 | intruder.PrairieWolf 2.61 | 65.6 -> 48.4 |
3.5.1 | 94 / 805 | 12% | rsim.micro.uCatcher 0.1 | 21.3 -> 96.4 | nat.BlackHole 2.0gamma | 69.2 -> 42.5 |
3.8 | 81 / 805 | 10% | synapse.rsim.GeomancyBS 0.11 | 36.5 -> 49.8 | mn.Combat 1.0 | 80.1 -> 60.8 |
3.9 | 75 / 805 | 9.3% | pez.mini.ChironexFleckeri 0.5 | 42.2 -> 64.9 | rsim.mini.BulletCatcher 0.4 | 57.7 -> 7.0 |
4.0 | 92 / 805 | 11% | rsim.mini.BulletCatcher 0.4 | 7.0 -> 72.1 | nat.Samekh 0.4 | 73.3 -> 45.2 |
4.1 | 74 / 805 (73.66 APS) | 9.2% | nat.Samekh 0.4 | 45.2 -> 75.7 | staticline.whiskey.Whiskey 0.6 | 75.5 -> 57.5 |
4.2 | 74 / 805 (73.73 APS) | 9.2% | mladjo.iRobot 0.3 | 53.8 -> 69.9 | jcs.AutoBot 4.2.1 | 60.1 -> 35.1 |
4.3 | 74 / 805 (73.92 APS) | 9.2% | kc.mini.Vyper 0.311 | 33.0 -> 53.0 | positive.Portia 1.26e | 60.0 -> 36.2 |
4.4 | 71 / 805 (74.11 APS) | 8.8% | pez.frankie.Frankie 0.9.6.1 | 45.9 -> 62.8 | fromHell.CHCI3 0.1.4 | 74.4 -> 55.7 |
4.4.1 | 71 / 805 (74.11 APS) | 8.8% | brainfade.Fallen 0.63 | 45.7 -> 65.5 | jam.micro.RaikoMicro 1.44 | 64.0 -> 49.8 |
4.5.1 | 71 / 805 (74.25 APS) | 8.8% | spinnercat.CopyKat 1.2.3 | 51.6 -> 69.3 | synapse.rsim.GeomancyBS 0.11 | 54.4 -> 38.6 |
4.6 | 71 / 805 (74.35 APS) | 8.8% | deo.virtual.RainbowBot 1.0 | 54.8 -> 69.1 | jab.DiamondStealer 5 | 80.6 -> 61.7 |
4.8 | 57 / 803 (76.46 APS) | 7.1% | ar.QuantumChromodynamics 1.2.1 | 69.2 -> 90.5 | nat.BlackHole 2.0gamma | 60.8 -> 42.0 |
5.0 | 70 / 805 (74.37 APS) | 8.7% | deo.FlowerBot 1.0 | 53.4 -> 84.6 | kcn.unnamed.Unnamed 1.21 | 79.1 -> 58.0 |
5.1 | 49 / 815 (78.59 APS) | 6.0% | ary.SMG 1.01 | 35.5 -> 90.3 | nat.BlackHole 2.0gamma | 54.4 -> 33.0 |
5.1.1 | 49 / 815 (78.75 APS) | 6.0% | rz.Apollon 0.23 | 69.6 -> 94.0 | nat.Samekh 0.4 | 72.7 -> 53.6 |
6.1.8 | 59 / 806 (76.65 APS) | 7.3% | cx.Princess 1.0 | 47.8 -> 65.1 | toz.Gnome 1.1 | 88.4 -> 61.6 |
6.2 | 59 / 806 (76.84 APS) | 7.3% | nat.BlackHole 2.0gamma | 42.1 -> 67.0 | stelo.RamTrackSurfer 1.2 | 89.2 -> 72.9 |
6.3 | 56 / 806 (77.04 APS) | 6.9% | kid.Gladiator .7.2 | 47.7 -> 65.5 | nat.BlackHole 2.0gamma | 53.4 -> 33.3 |
6.4 | 51 / 806 (78.22 APS) | 6.3% | dmp.micro.Aurora 1.41 | 62.1 -> 79.1 | myl.micro.NekoNinja 1.30 | 77.3 -> 61.3 |
6.5 | 48 / 808 (78.70 APS) | 5.9% | ncj.MoxieBot 1.0 | 76.9 -> 92.6 | bayen.nut.Squirrel 1.621 | 89.3 -> 74.9 |
6.7 | 45 / 807 (79.17 APS) | 5.6% | apv.ScruchiPu 1.0 | 57.9 -> 79.5 | trab.nano.AinippeNano 1.3 | 91.4 -> 74.7 |
6.8 | 42 / 808 (79.69 APS) | 5.2% | trab.nano.AinippeNano 1.3 | 72.2 -> 89.5 | rampancy.Durandal 2.2d | 81.5 -> 69.4 |
9.0 | 46 / 827 (79.73 APS) | 5.6% | N/A | N/A | N/A | N/A |
9.0.1 | 45 / 827 (80.03 APS) | 5.4% | ary.SMG 1.01 | 50.5 -> 76.4 | ncj.MoxieBot 1.0 | 95.5 -> 75.5 |
9.1 | 43 / 828 (80.25 APS) | 5.2% | kc.mini.Vyper 0.311 | 54.7 -> 60.7 | ab.DangerousRoBatra 1.3 | 74.0 -> 66.7 |
9.2 | 38 / 828 (80.84 APS) | 4.6% | Bemo.Sweet30 1.6.1 | 57.9 -> 68.3 | kenran.mega.Pantheist | 75.3 -> 57.1 |
9.3 | 34 / 829 (81.35 APS) | 4.1% | ags.micro.Carpet 1.1 | 76.3 -> 89.2 | ary.SMG 1.01 | 81.2 -> 64.9 |
9.4 | 33 / 830 (81.55 APS) | 4.0% | kenran.mega.Panthiest | 73.9 -> 85.3 | bayen.nut.Squirrel 1.621 | 88.8 -> 80.9 |
Version CPU Usage
All values are averages in milliseconds with the exception of those listed as Peak values, which are the maximum time in milliseconds encountered during a typical 35 round battle.
Version | Gun | Gun Peak | Drive | Drive Peak | Drive Array Select | Drive Hit Logging | Drive Predictions | Drive Adjustments | Drive Rolling Avgs |
---|---|---|---|---|---|---|---|---|---|
6.5 | 1.01 | 13.41, 8.77, 8.41, 7.15, 6.94 | 0.21 | 7.70, 7.61, 6.93, 6.93, 6.49 | 1.19 (5.53 peak) | 0.02 (0.04 peak) | 0.88 (6.77 peak) | 0.09 (1.51 peak) | 0.07 (0.89 peak) |
Series 1.x
This series of robots was released while work on the Xander framework was still ongoing. Targeting and drive strategies were somewhat simple. No surfing or guess-factor targeting.
Series 2.x
This series introduced my earlist concept on guess factor targeting. Drive strategy was still simple.
Series 3.x
This series introduced wave surfing, and improvements to the guess factor gun. Version 3.0 used a modified version of the BasicGTSurfer wave surfing drive as a reference point, with all later versions in the line using a wave surfing drive of my own design. Towards the end of this line, I introduced virtual hit ratios, where all guns would provide aiming information for every shot to determine whether or not their aims would have hit the target or not.
Series 4.x
This series focused largely on drive improvements, including improvements to the wave surfing drive, dive protection, and a new Ram Escape drive. This series also improved how fire power is selected.
Series 5.x
This series focuses on using a new strategy for calculating factors in guess factor guns and wave surfing drives, surfing multiple waves simultaneously (explored by never implemented), paying more attention to robot width, improving wall avoidance, and improving segmentation selection and processing.
Series 6.x
XanderCat series 6 focuses on taking everything learned so far and evolving it into a new set of components, or at the very least, cleaning up old components or features that did not work out. Series 6 introduces the new Evolution Drive, an updated Wave Surfing drive, and new ways of handling factor arrays.
Series 7.x
XanderCat series 7 uses the first release-ready version of the Xander framework. With the knowledge gained over prior versions of XanderCat, the Xander framework has undergone a final refactoring and cleanup and is now considered ready for public use. The Xander framework can be considered as version 1.0. In addition to using the finished Xander framework, series 7 may see updates to the main drive and gun, as well as a first release into the melee competition.
Series 8.x
This series will use my own take on using a K-nearest-neighbor (KNN) approach for the main drive and gun. It may also finally introduce surfing multiple waves at once.
My KNN approach to to create a KNN Factor Array Processor that can be used in both drives and guns. I already have a FactorArrayProcessor interface built into my guess factor / wave surfing framework that it will utilize. However, instead of saving a large number of factor arrays and combining them, it will instead store a tree of data points, retrieve the closest data points to the current situation, and build a single factor array from those data points. One advantage of this approach is that is should allow for a greater number of segmenters and slices per segmenter.
Series 9.x
This series uses the updated Xander framework version 2.0. There are a variety of changes as a result. Hopefully, some buggy areas will be improved. Some new features will be added.
Version 9.0
The changes in this version from previous are fairly extensive. Changes listed are just a quick summary.
Changes from previous version:
- Using Xander framework 2.0.
- Using Bullet Shadows in the main wave surfing drive.
- Various segmenter changes.
Version 9.0.1
Changes from previous version:
- Re-added x5 power selection from previous versions.
Version 9.1
Changes from previous version:
- Increase the ganularity of the drive segmenters.
- Defender Speed Segmenter increased from 8 to 12 slices.
- Bullet Travel Time Segmenter increased from 12 to 18 slices.
- Attacker Bearing Segmenter increased from 10 to 12 slices.
- Defender Acceleration Segmenter unchanged (3 slices).
- Wall Smoothing Segmenter unchanged (4 slices).
- Re-added robot colors and changed color scheme a little.
- A few minor adjustments to maintain compatibility with some older versions of Robocode (for RoboResearch...yeah, yeah, I should just set up RoboResearch with a newer version of Robocode :-P)
Version 9.2
Changes from previous version:
- Replaced my old wall smoothing segmenter with a new wall stick segmenter. The new segmenter has the following advantages:
- More slices. The old segmenter was fixed at 4 slices; the new segmenter has a variable number of slices.
- Taking movement direction into account. The old segmenter looked at clockwise vs counter-clockwise; the new segmenter looks at forward vs reverse.
- More efficient. The old segmenter used a robot predictor which was processing expensive; the new segmenter uses a simple wall stick approach that is quick to calculate.
Version 9.3
Changes from previous version:
- Started using bullet-hit-bullet as valid data points for the main wave surfing drive.
- Implemented improved algorithm for handling distancing. In addition to providing better overall distancing, this takes care of a recently discovered bug in the old system. The new system picks from a range of drive angles for distancing instead of having a fixed drive angle. For example, if the robot only has to drive a very short distance to reach the desired factor angle, it can choose to use a steeper advancing or retreating angle to get closer to the optimal distance (so long as it can still achieve the same desired facor angle).
Version 9.4
Changes from previous version:
- Replaced DefenderSpeedSegmenter with LateralVelocitySegmenter in the main drive.
Version 9.5
Changes from previous version:
- Implemented targeting detectors in the main drive (more specifically, in the KNNFactorArrayProcessor). These detectors change the base array initialization when the number of data points is low, and also change what data is used when detection percentage of any detector is high. This change should improve scores against certain simple targeters, and maybe just maybe improve overall performance in first couple of rounds of any battle.