Robo Home | Changes | Preferences | AllPages

Do tell. :-)

--David Alves

Yes, sorry for just throwing it out like that, but I was dead tired. I started with the bot at midnight yesterday and when it compiled, was still and mini, and seemed to run without throwing exceptions I released it. No further testing whatsoever. That's me, in'it? Of course I don't create a top-10 material bot in two hours from thin air. This is really Aristocles grown to a mini. Grown to fit AdaptiveMovement. Like Paolo. But where Paolo uses the MusashiTrick to try to balance the number of hits it allows at GF1, Pugilist uses EnemyWaves to try avoid any GF it has recently been hit at. It uses enemy waves to avoid HeadOnTargeting too, which makes it very good at that. -- PEZ

/HelpRequests - /LatestUpdates - /GuessFactorChat - /ChatLog20040501 - See also PugilistGL

What's special about it?

It's the first MiniBot doing WaveSurfing.

How competetive?

Quite so.

It's the only MiniBot having breaken the 2K barrier in the general class of RoboRumble@Home. 2007 points for version 2.0.8.

It's #8 in general rumble. #1 in mini rumble!

In fact in minirumble it beats all opponents. Making it a PremierLeague king there. It not only beats them actually it beats them on average by 81.58%! Check it out: http://rumble.robowiki.net/servlet/PremierLeague?game=minirumble&table=2

Where can I download it?

At the RobocodeRepository of course:

How does it fire?

Heavily segmented GuessFactorTargeting. Not too different from the Bee gun used in CassiusClay and BeeRRGC.

How does it move?

It's a RandomMovementBot style of movement. Only, it's not random at all. It's my home grown (with good advice from Jamougha) WaveSurfing. Pugilist "surfs" the EnemyWaves carrying real bullets. It tries to move to the least hit guess factor possible on those waves.

Why that name?

I insist in thinking that 1v1 Robocode is very much like boxing. It's about hitting well and avoid getting hit too hard too often. But Paolo was already taken so i decided to do David Alves style naming and use the more general term.

Can I use your code?

Sure. It's packed with the bot jar file and released under the terms of the RWPCL. Might be a bit dense though, since lately it has been a desperate chase for bytes in this bot.

What's next for this bot?

  1. DONE!: Figure out how break the 2K limit in the general RoboRumble.
  2. DONE!: Grab the #1 spot in mini RoboRumble
  3. Make a cool logo


Thanks to Jamougha for helping me getting the WaveSurfing to work. And to Jim for reviewing the implementation and telling me he thought it must be on the right track. And to ABC and Axe for "baby watching" P's development. And to everyone else who have tried to help me figure. Which are quite a few!

Question / comments department

I guess the 2K clubs are not for me...

This P only loses to one minibot yet. Quite surprisingly this is Tityus. (Although, it's almost a tie.) I would have thought that the Tityus gun would be very vulnerable to P's style of WaveSurfing...

-- PEZ

Could you please explain what you do for the edge-smoothing protection? -- ABC

What I would like to do is to have two or three extra bins on either side of the edges and then mirror the bins on the inside of the edge to the outside when writing to the stats array. But that won't fit in my byte starved mini. Instead I just do index = min(index, FACTORS - 2) before reading the data. That way reading the last (GF1) bin gets the next last instead and the GF1 bin weights less. Does this make any sense? How about some code...

    double smoothedVisits(int index) {
	index = (int)Math.min(index, Pugilist.FACTORS - 2);
	double smoothed = 0;	
        for (int i = 0; i < Pugilist.FACTORS; i++) {
	    smoothed += (double)visits[i] / Math.sqrt((double)(Math.abs(index - i) + 1.0));
	return smoothed / Math.sqrt(distanceToTarget() / bulletVelocity);
-- PEZ

Check this out...

Now I only need 5 points and I will have fulfilled my new years promise of 2004 - with a mini. That would be sweeet. But how? The air is really thin this high in the ranking table nowadays...

-- PEZ

3.76 points and 327 battles left :D --deathcon

pez.mini.Pugilist	2001.73	details	graph	228	15-5-2004:14:56

Looking good! What did you do? Found that Thread.sleep() bug or something? I know I know, too early to say... -- Pulsar

I surely touched 2K ground a while there! I've decided to always treat that as a sign. =) Thanks for letting me know. Now it's 1991 with 426 battles. And, more importantly, I'm past DT! It's gonna be a high tensed PEZ until it's decided if it's stay there. Seems my performance against iiley's PM guns has gotten worse though. P is not undefeated in mini any more. But since I know what changes I made I just might be able to correct that. Problem is, as always, byte starvation. I only have three (3!) bytes left as it is. If anyone sees where I can save some bytes, please, please let me know. Tons of thanks to Jim who helped me save 13 bytes by being smarter about my wall segmentation. -- PEZ

I think I might have some clues to improve my wae surfing in particular and maybe wave surfing in general now. It seems that segmenting on wall proximity instead of acceleration improves performance against many pattern matchers, but degrades over all performance. This could mean that wall-segmentation works against many pattern matchers. But, more likely I think, it' is acceleration segmentation that gives these pattern matchers an easier target. I can't explain how, but my gut feeling is that the time variable involved in pattern matching somehow gets important when the target is segmenting its movement on acceleration. What do you rocket scientists out there think about this? -- PEZ

I really wish I'd know... I have made up many theories about why the PM bots perform so well against wavesurfing opponents, but none of them work as well as expected when I implement the correspondent "solution". I also don't know what to say about your feeling regarding acceleration segmentation, if you test it further and it evolves from a "gut feeling" to a proven method, please share ;). Atm, my feeling tells me that the only way you can improve performance against good PM guns is by reintroducing some kind of random factor, slightly sacrificing dodging performance against the "typical" GF gun. -- ABC

Hell will freeze before I do that. =) -- PEZ

1997 with 407 battles fought. 2K club better prepare a chair for Pugilist. Even if it will collect some dust while I figure out where to find the missing points. =) -- PEZ

I really thought you had it, Pug was 2001 after about 200 battles with a positive momentum. Depending on how deperate you are to make the club, i reckon you could actually tip the scales by removing a couple of your older bots (Mako, Gloomy and Frankie all have high PBI's). As they're your bots there is no reason you couldn't, it just the ethical issue you need to think about....Brainfade

=) Gloomy must have been lucky. Those old bots are too dear to me for me to remove them. P must do this on his own I guess. He's like SilverSurfer on that account. Suffering alone. -- PEZ

No pain no gain... 460 battles , 1996.83 pts... That 1.9.7b.6 looks very good, maybe u get the 2K... -- Axe

Thanks. But what's bothering me is that I only can do it with this targeting bug in place. It's the most peculiar thing I've yet come across in my robocoding. And, I've come across one or two peculiarities. =) -- PEZ

I really understand what u are talking about, sometimes is like rc universe laws and properties conspire against the logic. -- Axe

Well, 1989 it is now with 849 battles. I think maybe that the overload of mini battles can have dragged it down some. Seen it happen before. -- PEZ

As usual it wont last. But it sure is a nice picture (literally):

=) -- PEZ

congrats on the 2000-club by the way! Well done!!! -- Pulsar

Contgrats from me too. Way cool !!! --deathcon

Thanks! Now this is my road map:

  1. Push Pugilist a few points higher, making it a stable member of The2000Club despite the drop in points from all those mini battles.
  2. Create a MegaBot, CassiusClay, with the explicit goal to dethrone RaikoMX. It has been allowed to rule alone for too long time now. =)

I know step 2 there can be a too hard for me, but I think I must try. One thing is for certain; If I don't try it I won't make it. Lacking Jam's talent I can only answer with hard work and persistance. And I've got plenty of the latter. =)

-- PEZ

What can I say? Congrats!! A truly incredible ranking from a mini. I look forward to duking it out with Cassius. ;-) -- Jamougha

Thanks. It'll be like "old times". Only this time I hope to end up the winner. =) -- PEZ

After i cribbed your gun, i changed the firing condition so it's something like:
And in the (few) tests i did, it seemed to give a small rise in overall score, it especially seems to help against iileys bots... --Brainfade

Yes, I think there is a bit more bullet damage as a result. Can't fit it in Pugilist, but I'll keep it in mind with CassiusClay. Thanks! -- PEZ

PEZ, do you mind me introducing a wiki bot featuring the WaveSurfing of Pugilist and a Moebius style PM-gun? As most WaveSurfers have problems with PM-gun, i am curious how high this bot will rank. --Loki

Of course I don't mind. I'm as curious as you are about the results! -- PEZ

Ok. I think i will have a version ready this evening. How do you like the name "wiki.mini.FeederOfRavens" ? --Loki

Ravens? Still in norse mythology land? =) feeder of ravens is cool. But feeder of vultures would be more videly understood I think. -- PEZ

yes, still in norse prose land. Although 'kennings' are known in Dutch too. I thought using a kenning would be a nice idea for a mostly Swedish bot (and so i can keep the norse gods 'exclusively' for the bvh.* series of bots =) ).

The basic version is 'clean compiled'. Pugilist set-up is quit clean for a mini, i could quite easily add the PM-code! I will now run some tests and upload it soon. --Loki

It's out! Cool! -- PEZ

Yes. Let's see where it ends up. --Loki

Shrinking help

The difference in rating between 2.4.03 and 2.4.14 is quite striking; 1977 vs 1959. Yet all there should be to it is a failed attempt at shrinking. Here's the relevant .03 code:
	static Point2D wallSmoothedDestination(Point2D location, double direction) {
		Point2D destination = new Point2D.Double();
		int tries = 0;
		while (tries < 2) {
			double currentSmoothing = 0;
	        	while (currentSmoothing < 100 && !fieldRectangle.contains(destination = project(location, absoluteBearing(location, enemyLocation) -
        			direction*(Math.PI / 2 + 0.2 - (currentSmoothing++ / 100.0)), enemyDistance / 5.0)));
	        	direction -= direction;
	        	if (currentSmoothing < 45) {
		return destination;
And here's the .14 code:
	static Point2D wallSmoothedDestination(Point2D location, double direction) {
		Point2D destination = new Point2D.Double();
		int triesLeft = 1;
		double currentSmoothing;
		do {
			currentSmoothing = 0;
	        	while (!fieldRectangle.contains(destination = project(location, absoluteBearing(location, enemyLocation) -
        		        direction*(Math.PI / 2 + 0.2 - (currentSmoothing++ / 100.0)), enemyDistance / 5.0)) && currentSmoothing < 100);
	        	direction -= direction;
		} while (triesLeft-- < 1 && currentSmoothing > 46);
		return destination;
Anyone that sees where these two snippets should differ in functionality?

-- PEZ

I think the second one will only loop once in the do/whie. You set triesLeft = 1, then do..while(triesLeft-- < 1). That triesLeft-- will evaluate to 1 and then decrement triesLeft. Maybe you want "triesLeft-- > 0"? -- Voidious

{Edit conflict]First thing that catches my eye is the 'triesLeft-- < 1' construction. If I understand it correctly, the do-loop will be done only once. triesLeft starts with 1, then tested if it is smaller than one and then decremented. I think that you wanted to do something like 'triesLeft-- > 0' -- GrubbmGait

Just in case you didn't know it, --triesLeft will decrease and then use that value in your evaluation, while triesLeft-- will evaluate the present value of triesLeft and then decrease the variable independently. -- Martin

Thanks guys. Yes I knew about the post-decrement and did that intentionally. But I reversed the logic as you both noticed... Great. New hope for Pugilist! Since most of the > .03 releases used the buggy code I might even have a version among them that will kick some major ass with the bug nailed! -- PEZ

Nope. Checked it now, this logic error was introduced with 2.4.12 so I don't have a Pugilist hiding there that would outrank 2.4.03. Not to mention 2.0.9 which was the strongest Pugilist by far. It's awful having spent so much time trying to improve a bot and never ever coming close! -- PEZ

Yeah, well, I don't have that much pity for you ... I am at that stage with Komarious, and still about 40 points behind the best version of Pugilist in the mini-rumble. :P (j/k) -- Voidious

Do you know what version of Pugilist has the highest rating in the MiniBot rumble? As far as I can tell, it's 2.2c with a rating of 2076, but I thought I recalled seeing a version at 2080+ at one point. -- Voidious

Robo Home | Changes | Preferences | AllPages
Edit text of this page | View other revisions
Last edited October 4, 2006 18:16 EST by Voidious (diff)