Congrats to #4 position on EternalRumbleTad! Whatever you did with the ShortTermLearning? of your bot worked. -- PEZ

Sorry that, I checked the results again, Dalek 0.97 actually beat SandboxDT and Cigaret but did not beat DuelistMini in the eternal-rumble. However, it's quite impressive. I know Dalek 0.97 did not include the data in jar, so maybe next turn it will climb up to #2 or #1. -- iiley

And now it's time to congratulate you on the #3 position! I tried Dalek 0.97 seconds after you had uploaded it and I immediately noticed it seemed much stronger than 0.96. Can you tell us some of what you did to the bot to give it that extra boost? iiley told me he has checked the detailed results of Dalek in the last rumble and that it actually beat SandboxDT and Cigaret. Maybe my money on you to be the first to catch that #1 spot from DT was well spent? =) -- PEZ

Thanks for the encouraging words, guys. I was surprised to get to #3. I was expecting a fall or at best to stay where I was. How do you know I don't include data in the jar? As for what I did from version 0.96 to 0.97, the main one is that I have tailored my movement against some of the top bots. Ironically, I expected to beat DuelistMini but not SandboxDT or Cigaret. Chance, as always, plays a role. So luck is part of the reason I got to where I am. I figure I had better enjoy being #3 while I can. From the outside it may appear as if Dalek is a strong bot getting ever stronger, but to me it looks as though I am desperately hanging on by my fingernails, grabbing at any chance to get a few points off a particular adversary. Despite all my efforts SandboxDT still beats me by about 5 points per round in 10k round battles. -- Tad

Modest as always. =) Only 5 points down per round against DT is good. I think that makes Dalek the second best 1-v-1 bot in the world. Since you ask that question about how we know we now also know you have not started saving data between rounds at all. =) Which means you have a 'very big improvement of your bot left to do. I envy you that! It won't help you beat DT in battle, but I think it might be enough to snatch that #1 ER spot. I'm pretty sure of it actually. Since your bot is such a good learner and since it uses StatisticalTargeting you will boost your scores against all those micros/minis that can't afford saving data. Go get'em! I'm keeping my fingers crossed here in sunny Stockholm. -- PEZ

I cut and paste movement profiles of the top bots into the java source. This is ugly, I know, but it has got me this far. I know Dalek is not the 2nd best 1 vs 1 bot because Cigaret, Avipes, LauLectrik and SandboxDT all beat it in 10k round battles. I think Predator beats it too. Here in rainy Sydney I know that things don't look so rosy for Dalek. --Tad

Ahhh. Too bad you didn't have that card still to play... BTW. To view the contents of a .jar just run "unzip -l" on it (or drag it and drop it into a WinZip? window.) -- PEZ

My name is Tad Boniecki and I am the author of Dalek. I have spent 4 1/2 months on developing him. The movement is still not very good, but the gun seems to operate well. The credit should go to Paul Evans for his excellent description of virtual bullets. Funnily enough, I seem to get a better hit rate against my own bot (20.2%) than SandboxDT gets against it (18.7%), though of course his movement is much better than mine (my hit rate against SandboxDT is only 14.5%). I use the mode (most commonly occurring score) rather than the average in choosing where to fire, as this works better for me. I also want to thank David Alves for his generous advice - it was very useful.
I wonder if any other bot gets as much as 14.5% against SandboxDT. I'd like to know more about this "most commonly occuring score" thingy. Marshmallow alternates between what has worked most recently and what has worked historically, but I can't reliably verify that this is effective. -- PEZ

Just to make it very clear, supposing you had 3 sectors: 0, 1 and 2, and that the virtual bullet hit scores for these 3 sectors were 6, 4 and 5. Then the average sector would be (6x0 + 4x1 + 5x2)/(6 + 4 + 5) = 0.9. The sector for the mode would be simply 0, as this got the most hits. I suspect that the average may work better when there is a small number of hits and that the mode comes into its own with more hits, but this is just a theory at the moment. If the mode value repeats eg { 3, 4, 4, 4, 2 } then I take the average of the first and last occurrence, ie sector 2 in the example. --Tad

I ran a couple of quick calculations (50 rounds) counting 1(fired) per bullet fired and 1(hit) per HitEvent?. Aspid is getting a 12% hits against SandBoxDT?, and LauLectrik is getting a 12.25%. -- Albert

I've tried it against PrairieWolf, SandboxDT and a few other top bots and it seems to be equipped with a best in breed gun. -- PEZ

Since Dalek hits about everything with "better than random" hit rate I want to look into VirtualBullets some more. Do you fire your virtual bullets at every turn? -- PEZ

No, I only fire virtual bullets when I fire a real one. Otherwise bullet avoiding bots would be very hard to hit. -- Tad

Yes, that's what I do as well. Though my scheme I call VirtualGuns since it really tracks the success of different guns rather than bullets. My reason for not firing off the virtual guns more often is partially because I want to be able to deal with dodgers. But
mainly because my current pattern matching gun consumes a lot of turn time. If it wasn't because of the latter I would just keep track of when virtual and real guns are fired at the same time. -- PEZ

Err, I'm not really sure if you understood about the averages used in the Sandbox bots and my Duelist bots. We don't average the angle to fire at, we are finding the average hit rate at a given angle. e.g. For DuelistMicro aiming 1 radian behind the enemy might hit 4% of the time, aiming directly at him hits 15% of the time, and aiming 1 radian ahead hits 12% of the time, so it chooses to fire directly at it. The reason moving averages (Paul Evans calls them rolling averages) are used is that in this way the system adapts to enemies that change movement styles, since in a moving average the more recent hit rate has a greater effect on the average than the hit rate a long time ago. To make a long story short, I think you're saying you use about the same basic system that Duelist/Sandbox? use, just giving it a different name. --David Alves
By the way, the percentages you're citing are almost meaningless... RamFire gets nearly 100% vs. any bot - does that mean it has incredible aim? 20% is great at range 800 but terrible at range 100. If you want to compare hit rates, you can only compare them at comparable ranges. Try recording the hit rate for all shots fired at a range between 400 and 500. --David Alves

Thanks, David. It looks like Paul, you and I are substantially doing the same thing with targeting. It would be interesting to compare who does it best and why.

I accept your point about hit rates. I got a figure for my hit rate against SandboxDT in the range 400-500. It is not very impressive: 11.0%. I'm not sure how accurate it is. --Tad

DuelistMicro gets about 8.6%, so I'd guess that 11% is quite good. That measurement was made on a standard 800x600 battlefield - it'd probably be lower on 1000x1000. Interestingly enough, firing directly at DT gets over 12%... David Alves

Marshmallow Gets 12.4% on DT at this range on a 800x600 field (measured over 100 rounds). It could be that it often fires directly at DT, it has three guns that could do that (one of which is a HeadOnTargeting gun). -- PEZ

I have to correct that. Marshmallow doesn't yet filter out the results if its cowboy guns in the statistics collected. Those guns fire weak bullets and as such have a higher hit ratio. I'll try to filter them away and see what the "real" ratio is. -- PEZ

My data-gathering bot StatistRobot Gets 12.92% on DT at range 491-810,13.76% at range 251-490,23.02% at range 91-250,34.61% at range 0-90(500 rounds) I will upload the VB Statistic Graph. Its aiming system is not wave system,in fact it is a similar to DuelistMicro's VB system. -- iiley

Hmmm... Perhaps my percentages are wrong then - if your system is similar then we should be getting similar numbers... --David Alves

It isn't that StatistRobot fires weak bullets? Then the hit rate should be higher and SandboxDT might choose not to dodge for weak bullets. (If, indeed, it dodges bulets.) -- PEZ

These numbers are the hit rate of the best *virtual* bullet. Real bullets may not do as well, since the virtual bullet collision code is different than the real bullet collision code. --David Alves

I haven't a clue of how the real bullet code is written, but Marshmallow happens to have a very exact match between real and virtual bullet hit rates. I know Marshmallow is a TopSecret? bot (David's label) but I might consider publishing it's VirtualBullets code if anyone is interested. -- PEZ

I'm interested. :-) My virtual bullet collision code is

if(Point2D.distance(targetX, targetY, bulletX, bulletY) < 40){...}

I picked 40 since the bots are 36 pixels square, so they are between 36 and 36 * root 2 (about 50.9) pixels "wide" depending on whether you are shooting at them horizontally/vertically (36) or from a diagonal (50.9) --David Alves

Hmmm... Perhaps my percentages are wrong then - if your system is similar then we should
be getting similar numbers... --David Alves

I think the hit ratios are not the same although using the same aiming system but with different movements.:) -- iiley Yes, I agree. --Tad

Here's how Robocode does the bullet checking roughly, I'm sure David has figured it out with his recent hacking and such, but just for some closure. It appears to use lines and rectangles, rather than circular (distance-based stuff) like you described:

java.awt.geom.Line2D boundingLine = new java.awt.geom.Line2D.Double();
//x and y are the current coordinates of the bullet, lastX and lastY are the previous coordinates:
boundingLine.setLine(lastX, lastY, x, y);
java.awt.geom.Rectangle2D.Float boundingBox = new java.awt.geom.Rectangle2D.Float();
//here, x and y are the coordinates of the robot, width is the width of the robot,
//height is the height of the robot.
boundingBox.setRect((x - (double)(width / 2)) + 2D, (y - (double)(height / 2)) + 2D, width - 4, height - 4);
if (BoundingBox.intersectsLine(boundingLine))
//it's a hit!