Difference between revisions of "DeBroglie"
Line 3: | Line 3: | ||
| author = [[User:Tkiesel|Tkiesel]] | | author = [[User:Tkiesel|Tkiesel]] | ||
| extends = [[AdvancedRobot]] | | extends = [[AdvancedRobot]] | ||
− | | targeting = [[ | + | | targeting = [[GuessFactor Targeting (traditional)|GuessFactor]] |
| movement = simple orbiter | | movement = simple orbiter | ||
| current_version = 0.2 | | current_version = 0.2 |
Revision as of 04:25, 27 October 2010
deBroglie | |
Author(s) | Tkiesel |
Extends | AdvancedRobot |
Targeting | GuessFactor |
Movement | simple orbiter |
Released | 25 October 2010 |
Best Rating | N/A |
Current Version | 0.2 |
Contents
Name
This is my first wave surfing bot, and I'm a physicist by training, so it's named in honor of Louis de Broglie, who discovered that matter has wavelike properties. This was a foundational discovery in Quantum Mechanics.
In honor of the namesake, all data collection is done in the form of waves. Waves emanate from the bot for targeting data, and from the enemy for movement data.
This bot is very much a work in progress.
Design
Goals
I wanted to gather waves to use as targeting information, both incoming waves from the enemy for movement, but also outgoing waves from de Broglie for targeting. I wanted to reuse as little code as possible, so I've been working on implementing the wave system in as modular a way as possible.
Universe
The bot has a Universe object which contains all elements of its picture of the battlefield, including two simple Bot objects, one for itself, and one for the enemy. The Bots are updated on every scan.
The Universe feeds information to the Eyes, Wheels, and Sword which are radar, movement, and targeting respectively.
WavePredictor
The universe has two WavePredictor objects, one from the perspective of de Broglie being fired upon by the enemy, and one from the perspective of the enemy being fired upon by de Broglie. The data available to the targeting WavePredictor is (of course) more precise than the data available to the movement WavePredictor, but other than this caveat, there is total symmetry in how data is handled.
The WavePredictor handles all firing of Waves and data collection. The relevant WavePredictor can be queried by the Wheels and Sword.
Wheels (movement)
My movement plans call for a GoTo wave surfing style movement, with a choice of "safe point" designed to flatten the profile as much as possible.
The details above are currently unimplemented. Right now, de Broglie uses an old sine wave based orbiter from my earliest ever Advanced bot. It uses a compound sine function to make the movement take longer for pattern matchers to get a lock on.
It will close or open distance to an orbiting band it feels comfortable in. If close enough, however, it goes for the ram damage.
Sword (targeting)
Currently the bot uses a Guess Factor type of targeting system, though instead of angles, it segments on 18 pixel (1/2 bot) wide slices of the arc. The best bin for the current firing situation is determined, then converted into an angle for firing.
By using all angle measurements in radians, this lets me use zero trig functions whatsoever in the angle-to-bin (when waves break) and bin-to-angle (when firing a bullet) calculations.
Currently, the best bin is determined via a simple score, with heavier weighting for real waves over virtual ones to (hopefully) do better against wave surfing targets.
The design of the WavePredictor will allow Sword to easily implement a virtual guns style system, especially an anti-surfer system, since deBroglie will use the exact same class to surf enemy waves as it uses to target with its own waves. In other words, adding a "shoot where a wave surfer would go" method is going to be essentially already done once my bot actually surfs waves in the first place. This is what I'm looking forward to in terms of the symmetry of the design: if I implement true wave surfing as a movement, I can also immediately shoot at it!
Eyes (radar)
Narrow Lock radar with a factor of 2.0.
Testing / Performance
Well, something's working right targeting-wise, because the current simple gun implementation can quickly learn sample bots like Walls and SpinBot. This tells me that I'm barking up the right tree so far.
Code
This bot's code (messy a state as it's in right now) is available under the Creative Commons Attribution-ShareAlike 3.0 Unported license. You can grab it off of the roborumble participants page until I get a Robocode Repository account going.