XanderCat
XanderCat | |
Author(s) | Skotty |
Extends | AdvancedRobot |
Targeting | GF / Linear / Anti-Mirror |
Movement | WS(GoTo) / Anti-Mirror / RamEscape / IdealPosition |
Released | 2011-5-20 (v 1.0) |
Best Rating | #20 (v 10.7.1) |
Current Version | 10.7.1 |
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 (GoTo-style), 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 while driving).
Best against: Generally a good performer; probably most notable for having simple yet effective anti-mirroring capabilities.
Worst against: DrussGT of course.
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.
Name Origin?
Xander comes from my son's name Alexander. Cat was originally meant to be of the feline variety, as I like cats, have used the term in other software projects, and seemed appropriate. Cat could also be associated with the tractor variety, which I think also works (a tractor with a gun), and I'm fine if people make that association too.
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.
Surfing Multiple Waves?
Starting with version 9.5, XanderCat now surfs up to 2 waves at a time. The general approach is as follows:
- Calculate the first n best factor angles to drive to for the next wave to hit, each of which must be separated by a given amount. Each has an associated danger value.
- From the end points of the n factor angles, continue to predict into the future surfing of the second wave to hit. For the second wave, only the best factor angle is used.
- Add the first wave danger value to the corresponding second wave danger value for both the factor angles of the first wave. Choose which first wave factor angle to drive to by which has the lowest combined danger value.
Note the image below, where:
- a = reachable factor range for first wave
- b = minimum distance that must exist between first and second choice
- c = first choice for surfing first wave
- d = second choice for suring first wave
- e = current robot position
If the sum of the danger values represented by orange lines was less than the sum of the danger values represented by the red lines, the second choice for the first wave would be used.
Multi-Mode Scenarios / Component Chain
Component Chain:
Default --> Basic Radar | v RamScenario --> Ram Escape Drive, Linear Gun | v MirrorScenario --> Anti-Mirror Drive, Anti-Mirror Gun | v NoBulletWavesScenario --> Ideal Orbital Drive | v CircularDriverScenario --> Circular Gun | v Defaults --> Guess Factor Gun Array, Drive Array | ______|_______________ | / \ | Targeting Detector Drive Main Wave Surfing Drive __________|________________________ / \ \ Original Gun Middle-Ground Gun The Anti-Scarlet Gun
Ram Scenario
This scenario applies whenever the opponent appears to be ramming. At present, this works be simply testing the opponent's distance being under some threshold. This sometimes happens against robots who are not really ramming -- this can happen due to initial round positioning, or just due to drive paths that happen to run too close together -- but in these cases there is no real disadvantage to using the ram scenario to back away from the opponent. This distance of ram detection will increase the more the ram scenario is applied. This makes the ram scenario kick in sooner and more often against the real rammers who ram consistently.
When this scenario is applied, a Ram Escape Drive is paired with a linear targeting gun. At present, this is the only place in which I utilize linear targeting. The Ram Escape Drive attempts to drive away from the enemy as much as possible, and uses turning to try and dodge some of the opponents shots (for example, it may change the direction of turn at the moment an opponent shot is detected).
Mirror Scenario
This scenario applies whenever the opponent appears to be using a mirroring drive strategy. The countering technique is to plan a drive path into the future such that it is known where to shoot in order to hit the mirrored position in the future. At present, this can be fooled by creative mirrorers that utilize a delay or position shifting.
No-Bullet-Waves Scenario
This scenario applies whenever the opponent has no bullets in the air (note: this can happen alot with a rammer, but the ram scenario happens earier in the component chain and thus superscedes this scenario). When the opponent has no bullets in the air, the Ideal Position Drive takes over and moves the robot directly to what it perceives as the ideal position on the battlefield given the battlefield size and the current position of the opponent.
I've attempted to replace this somewhat crude drive a few times, but each time resulted in a lower overall score in the RoboRumble, giving rise to the idea that this drive is embued with magical powers.
Circular Driver Scenario
This scenario doesn't affect overall performance much, but it does two things that make me feel better: first, it brings back my circular gun, which otherwise would not be in use. I once spent a lot of time on it, and would like it to be used somewhere. Second, it makes me feel better when pitted against simple circular drivers like SpinBot, where my guess factor gun still misses quite a few shots, but my circular gun can hit nearly every time.
To make this scenario as effective as possible without degrading any performance elsewhere, it is not enough for an opponent to appear to be moving in a circular path at the time a shot is to be taken for this scenario to be applied. The opponent must have been moving (and still be moving) in a consistent circular path. Furthermore, that path must not intersect any walls before the shot would reach them. The circular movement path is predicted into the future until the bullet would arrive to check for this.
Default Gun Array
The gun array consists of several guess factor guns. This is not too computationally expensive because they are currently all using the same cached copy of data. They just use the selected data differently when building the factor array to use for aiming. The Anti-Scarlet Gun and the Middle-Ground gun both use a certain amount of data rolling. This technique was first implemented to counter Scarlet, thus the name.
Default Drive Array
The drive array consists of two drives: what I currently call the Targeting Detector Drive and the Main Wave Surfing Drive. Both drives are direct wave surfing drives. They just differ in what data they use to surf. I use the term direct to indicate how the drive moves the robot; the robot is moved at a fixed angle until it reaches the desired surfing factor angle for the current wave, in essense moving there directly in as straight a line as possible rather than using an orbital path. However, in action, it may still appear to use a somewhat orbital path, as where to move is recalculated for the same wave under various conditions -- such as when the waves are updated due to new bullet shadows, or the opponent moves too far away from it's predicted path.
Main Wave Surfing Drive
This drive uses Dynamic Clustering with a KD Tree for it's data management. A simple equation is used to determine how many nearest neighbor data points to pull, and those points are logged into a factor array to surf.
Targeting Detector Drive
This drive uses a combination of targeting detectors that are designed to detect specific types of targeting. Each targeting detector can add a data point to the factor array, with the data point weight based on how often the detector thinks it is detecting it's specific form of targeting. This system is designed to improve scores against robots that use predictable targeting (non-guess-factor), something I have had trouble getting my main wave surfing approach to handle as well as other top robots.
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 |
9.5 | 30 / 830 (81.71 APS) | 3.6% | wiki.BasicGFSurfer | 65.3 -> 75.5 | rampancy.Durandal 2.2d | 80.3 -> 67.6 |
9.6 | 28 / 830 (81.91 APS) | 3.4% | darkcanuck.Gaff 1.50 | 43.3 -> 52.4 | kenran.mega.Panthiest 1.1 | 89.6 -> 78.9 |
9.7.1 | 25 / 832 (82.05 APS) | 3.0% | rampancy.Durandal 2.2d | 77.8 -> 88.3 | brainfade.Fallen 0.63 | 64.0 -> 57.0 |
9.8 | 25 / 832 (82.12 APS, 1600 PL) | 3.0% | asm.Statistas 0.1 | 70.4 -> 77.1 | wcsv.PowerHouse.PowerHouse 1.7e3 | 53.9 -> 46.8 |
9.9.5 | 24 / 831 (82.37 APS, 1604 PL) | 2.9% | ncj.MoxieBot 1.0 | 74.9 -> 86.0 | cx.mini.Cigaret 1.31 | 64.9 -> 55.2 |
9.15 | 20 / 833 (82.74 APS, 1646 PL) | 2.4% | janm.Jammy 1.0 | 75.2 -> 91.4 | davidalves.net.DuelistMicro 1.22 | 72.1 -> 63.8 |
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 | Notes | Gun Avg/Tick | Gun Peak | Drive Avg/Tick | Drive Peak |
---|---|---|---|---|---|
6.5 | Single wave surfing, single guess factor gun. | 1.01 | 13.41, 8.77, 8.41, 7.15, 6.94 | 0.21 | 7.70, 7.61, 6.93, 6.93, 6.49 |
9.13 | Multi-wave surfing, single guess factor gun. | 0.301 | 6.23, 6.21, 5.82, 5.13, 4.74 | 0.775 | 22.52, 20.01, 16.26, 16.23, 15.94 |
9.14 / 10.0 | Multi-wave surfing, gun array with 3 guess factor guns, Levy's KD Tree. | 0.182 | 6.13, 6.07, 5.24, 4.05, 3.93 | 0.544 | 15.24, 14.55, 14.13, 13.91, 13.78 |
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:
- Switch to using my own scan from 2 ticks ago (instead of 1 tick ago) when creating opponent waves.
- Implemented form of surfing 2 waves at once. The surf selector will choose both a first and second choice for where to surf for the closest wave. From where each of those choices would position the robot, the first choice for the second wave will be considered. The first wave danger is added to the second wave danger for both the first and second choice. The drive will then use whichever choice had the lower combined danger value (see description at top of page for more detail).
Version 9.6
While rolling drive data in the past has provided dubious results, latest testing suggests that rolling drive data will have a positive impact. This version takes a first stab at rolling the drive data.
Changes from previous version:
- Now rolling drive data (previous there was no rolling at all). As currently configured, data point significance will drop in a linear manner with age, dropping to 1% of original significance after 1000 ticks. Data will never roll off completely; once significance has dropped to 1%, it will not drop any further.
Version 9.7
Changes from previous version:
- Fixed bug where robot history snapshots were not getting cleared out between rounds.
- Updated KNNFactorArrayProcessor to initialize with a linear point when used for a gun and no data is available (previously it would initialize with a head-on point).
- Fixed issue where multi-wave surfing was not being updated when bullet-hit-bullet eliminated a wave other than the next wave to hit.
- Changed gun so that aiming only occurs when gun heat is low.
- Updated multi-wave surfing so that multiple first wave points can be considered (currently using 6 points with minimum 1 robot width separation between each), rather than just a first and second choice.
- Changed wave weighting from equal to bullet damage / time until hit.
- Added flattener that engages whenever opponent hit ratio exceeds 12.5%. Will not engage until at least the 3rd round. This is still somewhat experimental, but initial test results are encouraging.
Version 9.7.1
- Relaxed flattener a little. Now engages at 13% hit ratio, and not until 4th round.
- Fixed issue with anti-ram and anti-mirror gun power selectors not honoring x5 requirements.
Version 9.8
Changes from previous version:
- Increase granularity on main drive segmentation:
- Increased slices on bullet travel time segmenter from 18 to 24.
- Increased slices on attacker bearing segmenter from 12 to 24.
- Change main gun segmentation:
- Increased slices on defender speed segmenter from 8 to 16.
- Increased slices on bullet travel time segmenter from 12 to 24.
- Increased slices on attacker bearing segmenter from 10 to 24.
- Increase energy level to stop firing at from 0.1 to 0.5.
- Reduce default number of first wave surf position options from 6 to 5. (given current wave weighting, option 6 is almost never being selected)
Version 9.9
Changes from previous version:
- Updated distancing equation (techincally, I added and use a new SmartDistancingEquation that extends the original DistancingEquation). The original DistancingEquation is considered a Xander framework class, while the new SmartDistancingEquation is not.
- Now takes wall proximity into account and will no longer recommend retreat angles when against a wall (as doing so can negatively affect the reachable range the drive uses).
- Now behaves differently against top competitors.
Version 9.9.1
- Fix a couple of issues with the updated distancing.
- Reduce flattener engage percentage back to the original 12.5% opponent hit ratio (from 13%)
Version 9.9.2
- Turn flattener off. Once again, it has proved to be more trouble than it's worth.
- Improve how distancing determines if robot is against a wall.
Version 9.9.3
- Turn flattener back on. Flattener now engages at 12.5% opponent hit ratio, but only if my own hit ratio is under 12%.
- Added saving of certain battle statistics to file. This is used only for performance analysis; it is not used by the robot for in-battle tactics. Currently saving hit ratios and some flattener info.
- XanderGun now reduces fire power to 1/3 the normal level when robot energy drops below 7.
Version 9.9.4
- For the flattener, instead of requiring my own hit ratio to be under 12%, instead require that my own hit ratio simply be less than the opponent hit ratio.
- Remove the robot energy 1/3 power when robot energy is below 7 adjustment.
- When not "for real" aiming due to gun heat, point gun directly at opponent to keep it in the generally correct direction.
- Power selection now reduces power to slightly less than what opponent is using when both self hit ratio and opponent hit ratio are very low (try to let the opponent run itself out of energy before us).
- Implement factor array caching in the KNNFactorArrayProcessor. This should improve overall drive efficiency, especially with the multi-wave surfing.
Version 9.9.5
- Fix issue where power selector could try to fire power 0 bullets (bug introduced with a change in 9.9.4).
- Add new and improved bullet-shielding protected gun. Take that MoxieBot!
- Stop logging no-fire forced energy drains as opponent bullet waves (a minor issue, but needed to be fixed for the new bullet-shielding protected gun to function properly).
Version 9.10
- Fixed significant bug in how drive data is rolled with age. This may have been a "performance enhancing bug", as my drive isn't perfected yet and the bug gave the drive data more randomness. With the bug fixed, it will take a significant amount of new analysis before the drive parameters are properly re-tuned.
- Improved ram escape drive. APS should be about the same against some of the trickier rammers like xbots, but should increase by a reasonable margin against some other rammers such as RedBull.
- New Drive Array added to further improve scores against simple targeters. Drive array includes Anti-HeadOn drive, Anti-Linear drive, Anti-Circular drive, and the main drive. Drives other than the main drive are only used so long as the opponent hit ratio against them remain very low. Some comments on each:
- Anti-HeadOn Drive -- not expected to improve score overall, as the main drive handled head-on targeters just fine, but this will drop CPU usage a fair amount against head-on targeters.
- Anti-Linear Drive -- The main drive does a fair enough job against linear targeters, but this drive does better. Several APS increase against linear targeters expected.
- Anti-Circular Drive -- The main drive has a harder time with certain circular targeters. APS increase could be as high as +15 in some cases. However, the number of cases where this will apply is expected to be very low.
- Now rolling gun data when my hit ratio is below a certain threshold.
Version 9.10.1
- Disable drive array. This should stabilize the robot until certain other parameters can be adjusted, and will also help indicate if the new drive array is hurting more than it is helping (it definitely helps against some robots, but could it be hurting overall?)
Version 9.10.2
- Increase data roll rates.
- Minor tweak to low hit ratios power selection.
Version 9.11
Changes from previous version:
- Slight refactoring to allow same data logging system to be used with multiple factor array processors with different parameters.
- Take first stab at dynamic drive data rolling.
- Remove special low-hit-ratio power selection routine due to poor performance.
Version 9.12
Changes from previous version:
- Make dynamic drive data rolling a linear effect, instead of the more crude on/off approach.
Version 9.13
Changes from previous version
- Minor tweak to Ideal Position Drive so that it keeps robot a little further away from opponent when attempting to drive past opponent.
- Double the granularity of drive segmenters for bearing and bullet travel time.
Version 9.14+
All versions from 9.14 through the end of the 9.x series are alpha and beta tests for series 10.x. Refer to Version 10.0 notes for an idea of what these versions may include.
Series 10.x
The "Pro" series.
Version 10.0
Changes from previous version:
- Switch to using a true KD Tree for managing drive and gun data. KD Tree from Simon D. Levy at the Washington and Lee University in Lexington, Virginia.
- Gun set up to use k-nearest neighbor data selection.
- Drive set up to use k-nearest neighbor data selection (explored some other variations such as range search, but staying with straight knn for now).
- Remove bullet travel time segmenter and reverse direction wall stick segmenter from the drive.
- Fix massive bug in my Bullet Travel Time Segmenter. This bug has surprisingly been around for a long time, and was rendering the bullet travel time segmentation ineffective for the drive. However, since this segmenter has been removed from the drive, this change will have no impact.
- Fix bug in AbstractSegmenter (the base class for most of my segmenters) that was causing dimension values to fall out of the proper range for the KD Tree (note: it sounds a little weird to have a bug fix related to the KD Tree when the KD Tree is listed as new to this version; this is because the final versions of the 9.x series used the KD Tree as beta tests for the upcoming 10.x series, but I didn't want to officially list the KD Tree as a feature until this version).
- Minor refactoring of Guess Factor and Wave Surfing components to better separate responsibilities and allow for better caching.
- Implement virtual gun array. Currently 3 guns, each being a guess factor gun but with slightly different parameters on how to surf the data. This takes advantage of the better caching, as each gun uses the same caching log reader, meaning each gun after the first uses a cached copy of the nearest neighbor search results.
- Implement drive array. Currently 2 drives, a targeting detector drive and the main wave surfing drive. Targeting detector drive is only used so long as it's hit ratio is lower than the main drive ratio, and that ratio stays under 8%.
- Implemented more aggressive energy conservation at low energy levels.
- Reduce opponent hit ratio to start rolling drive data at from 9% to 7%.
- Opponent hit ratios against specific drives are only updated if the active drive had at least 5 ticks to react to the wave. This prevents penalizing drives for getting hit by close range shots.
Version 10.1
- Flattener issues again. Increase flattener engage percentage to opponent hit ratio of 13% (up from 11.5%).
Version 10.2
- Return flattener and drive roll parameters to their magic numbers from beta version 9.15.
Version 10.3
- Replace Ideal Position Drive with Ideal Orbital Drive. The new drive should hopefully do a better job of getting the robot to a good position when bullets are not flying (primarily at the beginning of each round). The goal of this change is to hopefully give a small improvement across the entire field of competitors. I tried this once before without success...hopefully this time will work better!
Version 10.3.1
- Give the Ideal Orbital Drive more aggressive "king of the hill" positioning (more favor towards centering in battlefield, less favor towards distancing from opponent).
Version 10.4
- Revert to using the Ideal Position Drive for beginning of round positioning. It's magical powers are undeniable.
- See if I can pull off an "lxx" APS increase by increasing my robot's preferred distance (from 400 to 450).
Version 10.5
- Revert to original preferred distance (from 450 back down to 400).
- Bring back the performance enhancing age roll bug to see if it still works, only now it's a feature! *grin*
Version 10.5.1
- Don't use creative age roll feature against top robots.
Version 10.6
- Switched to using power selector that increases fire power when my hit ratio is high. Hoping for a broad-range small APS increase on this one.
- Added new scenario to use Circular Gun when extensive circular driving is detected. Won't make that much impact. I just felt dirty missing so many shots against opponents like SpinBot. And I missed having my Circular Gun in action.
Version 10.7
- Trying a different power selection.
- Added ZIP compression to battle stats file.
Version 10.7.1
- Fix bug in file IO that was causing security violation.
Version 10.7.2
- Add common battle stats support and log common wins by round to the battle stats file. This will provide insight into early battle, mid battle, and late battle performance.
- See what happens if the Middle-Ground Gun is removed from the Gun Array (leaving only the original gun and the Anti-Scarlet gun).
Version 10.8
- Try swapping back and forth a bit between two different KD Tree selection methods in the main drive. This is accomplished by introducing a new drive array with the original main drive and a range search main drive, which is then put into another drive array with the targeting detector drive (nested drive arrays).
- Turn the "creative" drive data roll back off.
Version 10.9
- Revert second KD Tree selection experiment.
- Double the weighting on the speed and bearing segmenters in both the drive and gun.
Version 10.9.1
- Readjust weighting of all segmenters.
Version 10.9.2
- Readjust weighting of segmenters.
- Adjust drive data roll parameters.
Version 10.9.3
- Revert drive data roll parameter changes.
- Reduce minimum weight for old data point from 1% to 0.1%.