Robo Home | Changes | Preferences | AllPages

Showing revision 62
by Corbos


What's special about it?

His second toe is longer than his big toe.

Great, I want to try it. Where can I download it?

Version 2.3.He: http://scatterbright.com/robots/cjm.chalk.Chalk_2.5.jar

How does it move?

It tries to Wave Surf without stats buffers.

  1. Collect the 'features' an enemy would see in Chalk's movement. (velocity, distance from wall, etc, etc...).
  2. Determine the historical scans that are most like Chalk's current move.
  3. Use these scans to avoid predictive behavior.

How does it fire?

  1. Store a record of each enemy scan's 'features' (velocity, distance, etc...).
  2. Find the most common n scan to the enemy's current behavior.
  3. Generalize to one bearing.
  4. Shoot.

How does it dodge bullets?


How does the melee strategy differ from one-on-one strategy?

It's exclusively one-on-one.

What does it save between rounds and matches?

Its collection of movement and enemy movement patterns along with 'feature' weights.

Can I use your code?

Sure, just give credit... and by credit, I mean original credit. Most of the sexy Robocode ideas (is that an oxymoron?) have been proved and improved by generous RoboWiki contributors.

What's next for your robot?

Improve, improve, improve.

Does it have any WhiteWhales?

After thinking about what it means to be a WhiteWhale, I've decided Chalk doesn't have any. There's no single bot that drives him to the edge of insanity. For the most part, he gets a good night sleep, pays his taxes, and is thankful he's come as far as he has.

However, he takes regular beatings from any of the following packages:
abc, apv, axeBots, cx, davidalves, dft, florent, jam, jcs, jekl, kawigi, mue, pe, pez, pulsar, rz, tide, trab, voidious, wcsv

What other robot(s) is it based on?

Chalk was built using everything I could absorb from this wiki.
Specifically, it's movement grew from peeks at Pugilist, CassiusClay, RaikoMX, Cyanide and DarkHallow.
Its gun was inspired from the description of TronsGun. Apparently, Musashi, SilverSurfer and Ali implement the same sort of thing.
I've also perused Dookious, Cigaret, and any number of other OpenSource bots.
Its limitations, however, are all my own. Thanks to everyone for contributing.

Comments, questions, feedback:

Hey man, nice tank! I actually ended up looking through your source (cool that you included it) because I noticed the codesize was so small, and your tank is doing well in the RoboRumble. As a newcomer to Robocode, I am also just starting to do WaveSurfing, and I had a couple thoughts to share with you if you don't mind. (I am as eager to be corrected as to hear that the idea is good, just fyi!)

One thing I do with my multiple buffers is multiply the bin score by the number of total segments in that buffer (after retrieving the value); I do this because the buffer with far fewer segments would have, on average, much higher values in their bins, but they would actually be giving less accurate data as the match goes on. (You kind of provide a natural weighting by not doing that, in favor of the lesser segmented buffers.)

The other idea, which I'm more convinced is a good one, is that for velocities near 0 I tried incrementing the bin for that factor *and* for its negative, since you're technically not oriented to either direction over the other. (You are using relative factors, I think, as in 1.0 is forward and not "clock-wise"...) I just did this in the dev version of Dookious, and my WaveSurfingChallenge scores went from 90% for both to 95%/91.5%. (Edit: Actually, that ChallengeA? score must have been out of date, because all the factors should be 0 in that one anyway. :)) (CurveFlatteningChallenge didn't change noticeably over 100 matches, but I'm still convinced it's the right move.) Anyway, please don't think I'm just trying to be critical of your code, it's very clean and efficient. -- Voidious

Nice tank to you too! While I was wrapping up the first version of Chalk, I had a pretty good idea of where I stood against most bots. Then suddenly, WHAM!, add Dookious v0.50 to my loss list.

Regarding WaveSurfing, thanks for the tips. My surfing has some issues. I noticed Chalk lost his second RoboRumble battle to Gruwel. This isn't a comment on Gruwel's quality but GrubbmGait describes its gun as an 'Iterative circular gun' with '(rolling) averaged velocity'. Seems the gun should be vulnerable to WaveSurfing when it's implemented correctly. Mine, obviously, isn't

I like the idea of favoring highly segmented buffers. It makes good sense - though currently I'm not even sure if I'm using the right segments let alone weighting them correctly. I can't see anything wrong with mirror incrementing at low velocities, either. Hope you won't mind seeing your tips in Chalk 1.1. ;) Thanks again. --Corbos

Any adequate WaveSurfer should score 90% against Gruwel, as it really uses an 'Iterative circular gun with bullerpower adaption against wallshots' (no averaging on velocity). If you have the figures, please fill in the WaveSurfingChallenge. It is nice to see some recent bots there, although a good score is no guarantee for real-life performance. -- GrubbmGait

Corbos, not at all, I'd be honored. :) Congrats on the ranking jump of 1.01, too. I'd been waiting until he scored better to fill in the WaveSurfingChallenge scores for Dookious, but I'll test and post 0.50's scores for the heck of it. I'm more concerned with the MovementChallenge and Dookious's gun at the moment! -- Voidious

I'm proud to be a ProblemBot for another top-40 tank :) Nice work! -- Voidious

Well, I'm certainly intrigued... I would definitely be interested in a more detailed description of its WaveSurfing methods. (Though I am planning to read through the source some when I'm less tired.) Pretty interesting RoboRumble results so far. Neat! -- Voidious

Glad to see someone else traveling the "no stats buffers" path. Don't give up, a 2060 ranking is possible! ;) -- ABC

Congrats on cracking the 1900 mark, Corbos! (These last couple of versions give Dookious a very close match, too, if you didn't notice.) -- Voidious

Just in cast you thought your humor had gone unobserved, I did catch the element version numbers. -- Martin

Aha, thanks for mentioning that... I'd been wondering =) -- Voidious

Hell, they're sequential. If I run out of elements before the next 'minor' release, I know my versioning scheme (and development) sucks. Which reminds me... how about a new rule - 'All top 10 bots must be versioned 1.* or higher.'? Seems fair to me. --Corbos

Naturally, version 1.0 would coincide with taking over the #1 spot. =) -- Voidious

Making steady progress there, and taking down a few top-25 bots while you're at it - nice work. You've even got me thinking about trying a no-stats-buffers tank. Also, did you realize the irony that your tank is "Chalk" (white), modeled after ideas used in "Shadow" (black)? =) -- Voidious

The interesting thing about the stats-buffer/no-stats-buffer dichotomy is that I'm sure they're mathematically equivalent. I just don't have the math chops (and patience) to prove it. I like the white/black observation; though I currently view pattern matchers as the most evil and "Black" bots. I imagine I could scare up a few more points by shaking a few off my problem bot list. Cheers. --Corbos

Ouch, dealing losses to Dookious once again! Nice work. -- Voidious

Wow, welcome to the top 20! Find a bug in your WaveSurfing, maybe? Keep up the good work. -- Voidious

Actually, 2.3.He was a gun-only update. I knew the gun had issues, but finding 40 points worth of issues was a bonus. --Corbos

Finding 40 points in your gun is amazing - congrats. By the way, I'm not sure if you noticed this, but it seems that some classes used in your code are not packaged in the .jar. Namely, I don't see cjm.Debug and Util, which are referenced in a few places in the source. I was going to run a TC2K6 test of Chalk 2.3.He, but I wasn't sure what Util.ONE_EIGHTH was supposed to be :-\ (I figured 1/8 or Pi/8...) If you could post those, I'd gladly run some TC2K6 tests while I'm playing my new favorite video game, [Metroid Prime Hunters] :-) -- Voidious

Lucky you! I can't wait for it to be released over here. You probably have Tetris DS too... grr ;) -- ABC

Hmmm. 2.3.He shouldn't reference cjm.Util any longer. I moved those values into cjm.chalk.Evader. A quick 'Find in Files' confirms it. Could you be looking at 2.1.He? As for cjm.Debug, that's actually my answer to conditional compilation in Java - an interface that is never implemented and contains behavioral constants. From what I understand, if an interface constant eliminates a logical branch, the compiler ignores the branch all together. Apparently, the robocode packager ignores it all together, as well. ;) Anyhow, it's simply:

package cjm;

public interface Debug {
    public static final boolean IS_MC = false;
    public static final boolean IS_TC = false;
    public static final boolean PRINT_STATS = false;

Sorry for any confusion. I'll probably run some TC2K6 tests as well. --Corbos

You know, I probably was looking at 2.1.He. Thanks for the clarifications; I'll see if I can run some TC2K6-500 seasons tonight. -- Voidious

In case you missed it, I posted a (1 season) TC2K6 score for chalk; 83.68, just behind PulsarMax, and above RaikoMX and Cyanide. I'd guess you could probably break 2K by a decent margin without touching your gun again. -- Voidious

Thanks for running those. I know Chalk has become a bit of a SlowBot so I really appreciate it. I wish I had more time to make the run for 2000. I'm too addicted to ignore it but reality might slow development for a while. Thanks again and keep shooting for that #1 spot. --Corbos

Nice job on Chalk 2.3.B, still plugging along towards the 2K mark. I finally started studying some of the source code this week, and I'm learning quite a lot from it. It's a lot simpler than I imagined the Trons-gun-style methodology to be, though I don't have the experience to know how different your implementation is from Tron/Shadow. (Your source code is always very neat and straightforward, which helps. =)) It's really got me wanting to try a tank of my own that doesn't use GuessFactors, but first I must continue on Dookious for a bit longer... -- Voidious

I've just uploaded an open source version of a simplified Tron/Shadow? gun here: http://robocode.aclsi.pt/abc.wiki.DCBot_1.0.jar. I'll make a page for it soon. Have fun. ;)-- ABC

Wow. Thanks for sharing this. It'll be interesting to see the differences and similarities with Chalk's gun. If you don't mind the publicity, this might be a nice addition to DynamicClustering as well. Thanks again. --Corbos

Yeah, way cool that you posted that! I will definitely be taking a look when I get a chance. Thanks! -- Voidious

Hey Corbos, two things concerning your "BAND_WIDTH" variable. First, what is it exactly? =) Second, your calculation:

    static final double BAND_WIDTH = 20 / 3;
From what I can tell, and testing it in a stand-alone Java program, this will assign the value "6.0" to BAND_WIDTH, not "6.66" as you're probably looking for. Best of luck in your hunt for 2K! -- Voidious

Thanks for catching that. I use BAND_WIDTH in my kernel density calculations. This intro explains it better than I could: http://www.stat.mq.edu.au/staff/tduong/seminars/intro2kde/. Also, Albert provides a KernelDensity page with several pluggable kernels. Basically, band width determines the smoothness of a curve estimation. Given n observed bearings, a kernel density estimation "roughs out" a curve that fits the observations. The larger the band width, the fewer peaks and valleys the curve will have. Once you have an estimated curve, you either move away from or shoot at the densest part of it.

...makes me wonder if I have other integer/double math bugs. Thanks again for the heads-up. --Corbos

Wow! This is not a step, not a jump, but a leap forward to #4. Congrats on this amazing improvement! -- GrubbmGait

Wow, amazing... Big congrats, Corbos, absolutely incredible rating jump with 2.5! I patiently await your post to the version history to see what you did =) -- Voidious

Holy crap, did you just gain 50 rating points with one update? I thought my 30 point gain was impressive, but man... huge congrats from me! =) --David Alves

Thanks everyone. I'm really happy with the result - couldn't have done it without so many shared ideas. --Corbos

Which of the changes do you think produced the biggest gain in rating? Incidentally, that's how Phoenix surfs too. =) --David Alves

The min/max calculation was definitely the biggest factor. Squishing a couple of bugs in Chalk's movement prediction amplified the effect. Gun changes gave a nominal boost, at best. I always assumed the nearest wave was most important with the second, third, etc, waves providing fuzzy pressure. After a little thought (and watching the result), predicting completely through at least two waves makes a lot of sense. The nearest wave is important, obviously, but it's the wave you can do the least about. Treating all waves with equal respect gives a little more time to set up a nice surfing sequence.

Out of curiosity, what do you credit for your 30 point jump? That seems far crazier than Chalk's 50 considering Phoenix was already in the thin, thin air. --Corbos

My jump was due entirely to a change in the rolling speed of my surfing stats, rolling them faster than before. --David Alves

Well, it ain't another 50, but another ~10 point jump at that high a rating is still pretty sweet. Great to see Chalk kicking butt in the top 10! Keep it up, man. -- Voidious

Pretty sweet PL performance with that last version, tied for 1st and beating both Dookious and Phoenix. Actually the last several versions have been about draws with Dookious on average. What kinda changes you been making? Haven't seen an update to /VersionHistory in a while ;) Cheers, -- Voidious

Robo Home | Changes | Preferences | AllPages
Edit revision 62 of this page | View other revisions | View current revision
Edited December 1, 2006 0:41 EST by Voidious (diff)