Bedankt voor de suggesties. Het gaat nog steeds erg moeizaam, ik maak zoveel stomme fouten
[ Voor 80% gewijzigd door Toryu op 22-11-2011 21:47 ]
[ Voor 80% gewijzigd door Toryu op 22-11-2011 21:47 ]
1
2
3
4
5
| if(!state.grid[loc.row][loc.col].isWater) { state.makeMove(state.myAnts[ant], d); break; } |
1
2
3
4
5
| if(!state.grid[loc.row][loc.col].isWater && state.grid[loc.row][loc.col].ant == -1) { state.makeMove(state.myAnts[ant], d); break; } |
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Daar kan ik me iets bij voorstellen. Hoewel (zoals je zelf aangeeft) wel iets te veel kamikaze speelt. Dat is leuk als het goed gaat, maar het kan ook heel slecht aflopen...Janoz schreef op woensdag 23 november 2011 @ 22:27:
Ik moet zeggen dat ik dit wel een leuke pot vind (..)
while (me.Alive) {
me.KickAss();
}
Klopt niet. Zoek even uit waarom dit niet waar is...Toryu schreef op woensdag 23 november 2011 @ 21:33:
Tijdens path plannen is dat vrij lastig, maar voor de eerstvolgende move is dat vrij eenvoudig te doen.
Het starter package begon met:
code:
1 2 3 4 5 if(!state.grid[loc.row][loc.col].isWater) { state.makeMove(state.myAnts[ant], d); break; }
Als je dat veranderd naar:
code:
1 2 3 4 5 if(!state.grid[loc.row][loc.col].isWater && state.grid[loc.row][loc.col].ant == -1) { state.makeMove(state.myAnts[ant], d); break; }
botsen ze niet meer
ASSUME makes an ASS out of U and ME
Dit klopt wel degelijk, tenminste als je na dat je een zet van een ant hebt doorgegeven direct de state update.H!GHGuY schreef op donderdag 24 november 2011 @ 12:40:
[...]
Klopt niet. Zoek even uit waarom dit niet waar is...
while (me.Alive) {
me.KickAss();
}
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Ik geef het op, leg maar uit als je het zo goed weet...?H!GHGuY schreef op donderdag 24 november 2011 @ 12:40:
Klopt niet. Zoek even uit waarom dit niet waar is...
Klopt, maar de claim was alleen dat de code voorkomt dat mieren tegen elkaar botsen. Dat lijkt me juist, ook al is de code iets te conservatief.Janoz schreef op donderdag 24 november 2011 @ 16:20:
Nu weet ik niet hoe de c++ code in elkaar steekt, maar als met -1 wordt bedoeld dat er nu geen mier staat, dan is de code maar gedeeltelijk juist. Alle nog te behandelen mieren zullen immers nog op hun oude plek staan.
1
2
3
4
5
6
7
8
| void State::makeMove(const Location &loc, int direction) { cout << "o " << loc.row << " " << loc.col << " " << CDIRECTIONS[direction] << endl; Location nLoc = getLocation(loc, direction); grid[nLoc.row][nLoc.col].ant = grid[loc.row][loc.col].ant; grid[loc.row][loc.col].ant = -1; }; |
Dit zijn van die leuke subtiele verschillen in de starterkits. In de c# variant hoef je die niet te proberen, omdat als je de volgende situatie hebt het helemaal verkeerd gaat:Soultaker schreef op donderdag 24 november 2011 @ 17:18:
[...]
Ik geef het op, leg maar uit als je het zo goed weet...?
[...]
x | x | x |
mier 1 | x | mier 2 |
x | x | x |
[ Voor 5% gewijzigd door Caelorum op 24-11-2011 21:26 ]
Nu gebruik ik weinig tot niets uit de starterkit, maar los daarvan: met zoiets moet je zelf rekening houden als je zeker wilt weten dat het goed gaat, toch? En dan kan het wel degelijk goed zijn (zoals reeds betoogd).Caelorum schreef op donderdag 24 november 2011 @ 21:25:
Mier 1 gaat naar rechts en mier 2 gaat naar links. De grid wordt namelijk zo ver ik weet in de C# starterkit niet elke keer geupdate na elke move van de mier (..)
while (me.Alive) {
me.KickAss();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| using System.Collections.Generic; namespace Ants { public interface IBot { /// <summary>Initializes the bot.</summary> void Initialize(IEnumerable<Instruction> instructions); /// <summary>Update the bot.</summary> void Update(IEnumerable<Instruction> instructions); /// <summary>Let do some turns.</summary> void DoTurn(IMoveReceiver receiver); } public interface IMoveReceiver { /// <summary>Receive a move.</summary> void Receive(Instruction move); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
| using System; using System.Collections.Generic; using System.Text; namespace Ants { public class Instruction : IEquatable<Instruction> { /// <summary>Represents the GO instruction.</summary> public static readonly Instruction Go = new Instruction() { Type = InstructionType.go }; /// <summary>Represents the READY instruction.</summary> public static readonly Instruction Ready = new Instruction() { Type = InstructionType.ready }; /// <summary>Represents the END instruction.</summary> public static readonly Instruction End = new Instruction() { Type = InstructionType.end }; /// <summary>Constructor.</summary> /// <remarks>Sets some defaults.</remarks> private Instruction() { this.Value = -1; this.Row = -1; this.Col = -1; this.Color = -1; } /// <summary>Gets and set the type.</summary> public InstructionType Type { get; set; } /// <summary>Gets and set the value.</summary> public long Value { get; set; } /// <summary>Gets and set the row.</summary> public int Row { get; set; } /// <summary>Gets and set the column.</summary> public int Col { get; set; } /// <summary>Gets and set the color.</summary> public int Color { get; set; } /// <summary>Gets and set the dirction.</summary> public DirectionType Direction { get; set; } /// <summary>Represents the instruction as System.String.</summary> public override string ToString() { var sb = new StringBuilder(); sb.Append(this.Type); if (this.Value >= 0) { sb.Append(' ').Append(this.Value); } else if (this.Row >= 0 && this.Col >= 0) { sb.Append(' ').Append(this.Row).Append(' ').Append(this.Col); if (this.Color >= 0) { sb.Append(' ').Append(this.Color); } else if (this.Direction != DirectionType.X) { sb.Append(' ').Append(this.Direction); } } return sb.ToString(); } /// <summary>Gets a hash code.</summary> public override int GetHashCode() { return ToString().GetHashCode(); } /// <summary>Implements equals.</summary> public override bool Equals(object obj) { if (obj is Instruction) { return Equals((Instruction)obj); } return false; } /// <summary>Implements equals.</summary> public bool Equals(Instruction other) { if (object.Equals(other, null)) { return false; } return this.Type == other.Type && this.Value == other.Value && this.Row == other.Row && this.Col == other.Col && this.Color == other.Color; } /// <summary>Equals operator.</summary> public static bool operator ==(Instruction inst0, Instruction inst1) { if (!object.Equals(inst0, null)) { return inst0.Equals(inst1); } return object.Equals(inst1, null); } /// <summary>Don't equals operator.</summary> public static bool operator !=(Instruction inst0, Instruction inst1) { return !(inst0 == inst1); } /// <summary>Parses an instruction.</summary> public static Instruction Parse(string line) { var instr = new Instruction(); var tp = InstructionType.None; string[] tokens = line.Split(); if (tokens.Length > 0) { tp = (InstructionType)Enum.Parse(typeof(InstructionType), tokens[0]); if (TokenLength[tp] == tokens.Length) { if (tokens.Length == 2) { if (tp == InstructionType.player_seed) { instr.Value = long.Parse(tokens[1]); } else { instr.Value = (int)uint.Parse(tokens[1]); } } if (tokens.Length == 4) { if (tp == InstructionType.o) { instr.Direction = (DirectionType)Enum.Parse(typeof(DirectionType), tokens[3]); } else { instr.Color = (int)uint.Parse(tokens[3]); } } if (tokens.Length == 3 || tokens.Length == 4) { instr.Row = (int)uint.Parse(tokens[1]); instr.Col = (int)uint.Parse(tokens[2]); } instr.Type = tp; return instr; } } throw new ArgumentException(string.Format("The line '{0}' is not a valid instruction.", line)); } /// <summary>Parses a multi line input.</summary> public static List<Instruction> ParseMultiLine(string text) { var list = new List<Instruction>(); var lines = text.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); foreach(var line in lines) { list.Add(Instruction.Parse(line)); } return list; } /// <summary>Creates a move based on a row, a column and a direction.</summary> public static Instruction CreateMove(int row, int col, DirectionType dir) { return new Instruction() { Type = InstructionType.o, Row = row, Col = col, Direction = dir, }; } /// <summary>Helper for parsing instructions.</summary> private static Dictionary<InstructionType, int> TokenLength = new Dictionary<InstructionType, int>() { { InstructionType.None, 0 }, { InstructionType.ready, 1 }, { InstructionType.go, 1 }, { InstructionType.end, 1 }, { InstructionType.player_seed, 2 }, { InstructionType.players, 2 }, { InstructionType.cols, 2 }, { InstructionType.rows, 2 }, { InstructionType.turntime, 2 }, { InstructionType.loadtime, 2 }, { InstructionType.viewradius2, 2 }, { InstructionType.attackradius2, 2 }, { InstructionType.spawnradius2, 2 }, { InstructionType.turn, 2 }, { InstructionType.turns, 2 }, { InstructionType.f, 3 }, { InstructionType.r, 3 }, { InstructionType.w, 3 }, { InstructionType.d, 4 }, { InstructionType.a, 4 }, { InstructionType.h, 4 }, { InstructionType.o, 4 }, }; } } |
[ Voor 2% gewijzigd door Corniel op 24-11-2011 23:48 . Reden: extra interface toegevoegd. ]
while (me.Alive) {
me.KickAss();
}
1
2
3
4
5
6
7
8
9
10
11
| rows 8 cols 8 players 2 m 0....... m %%...... m ........ m ...%%... m ....1... m ........ m ........ m *....... |
while (me.Alive) {
me.KickAss();
}
[ Voor 10% gewijzigd door Bolukan op 28-11-2011 23:15 ]
Hmm, ik ben me van geen kwaad bewust.Bolukan schreef op maandag 28 november 2011 @ 23:12:
Ik heb het gevoel dat je posts - Corniel - zo overweldigend zijn dat niemand meer durft (..)
Bedoel je hiermee, ant(s) v.s. ant(s), of aanvallen op een hill? Ik neem aan het eerste. Daar heb ik wel ideeën over. Ik heb iets geïmplementeerd, dat werkt redelijk, maar ik zag dat ik van de nummer een toch nog redelijk soepel verloor (gek, heel gek.Zijn er ook ideeën hoe je een (gecoördineerde) fight moet aansturen.
while (me.Alive) {
me.KickAss();
}
'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.
[ Voor 138% gewijzigd door SaphuA op 31-01-2022 15:53 ]
'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.
Herkenbaar, dat is ook wat ik gedaan heb. Initieel kost het iets meer tijd, maar je snapt beter wat er gebeurt.Boeboe schreef op dinsdag 29 november 2011 @ 00:26:
Ben begonnen vanuit de starterkit en ben nu volop dingen aan het aanpassen, al lijkt het beter om volledig from scratch te herbeginnen zodra ik de werking volledig doorheb (..)
Tja, dat zijn drie int properties, dus dat is op zich ook weer niet zo'n ramp, detecteren of je hem nog hebt kost wellicht zelfs meer tijd. (Ik doe het wel hoor, daar niet van)In de starterkit wordt iedere ant immers iedere beurt volledig nieuw geïnitialiseerd lijkt me zo (..)
So what? Je bent net begonnen, dan is het niet heel onlogisch dat ie nog niet zoveel doet. We zijn niet allemaal zoals Sjaakie. Zijn eerste versie haalde een top van 70,0. Gewoon melden je nick, anderen kunnen dan ook makkelijker advies geven op basis van wat ze zien.Men ingame nick geef ik nog niet door, men ants zijn nog veel te debiel
Ben zelf op dit moment aan mijn derde grote refactor bezig. Kom elke keer weer diepe krochten tegen waar obsolete, invalid, en unused code rondzwerft.SaphuA schreef op dinsdag 29 november 2011 @ 10:39:
Ik merk wel dat mijn code een behoorlijke zooi aan het worden is met zo'n beetje alle logica in 1 klasse (..)
Dat is redelijk effectief blijkt in praktijk. Zorg wel dat ze zich niet doodlopen op een nuttige verdediging.Hebben jullie nog een taktiek voor razen? Op dit moment stuur ik gewoon een lange stream van ants naar de enemy hill tot ie kapot is (..)
[ Voor 0% gewijzigd door Corniel op 03-12-2011 21:39 . Reden: micro typo ]
while (me.Alive) {
me.KickAss();
}
while (me.Alive) {
me.KickAss();
}
Nope, dat doe ik pas na de challenge.
while (me.Alive) {
me.KickAss();
}
1
2
3
| WWW WxW ... |
1
2
3
4
5
6
| MaximumTijd = DieWaardeDieJeVanDeServerKrijgt - 10% BeginTijd = VraagTijdOp ForEach Ant Ant.DoeJeDing If VraagTijdOp - BeginTijd > MaximumTijd BreekUitForEach |
486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22
[ Voor 99% gewijzigd door SaphuA op 31-01-2022 15:52 ]
@SaphuA: Dank! Maar met welke versie werkte je, en op wat voor map? Mijn versies voor 1.15 waren zeer slecht in het exploren op maze-maps. In open mappen is de vooruitgang tussen 1.11 en 1.15 niet zo groot (nog steeds niet slecht). En deze versie heeft nu een score van 76.5, dus nét geen top-100.SaphuA schreef op woensdag 30 november 2011 @ 11:53:
Zo, Corniel, je nieuwste versie is een hele vebetering (..)
while (me.Alive) {
me.KickAss();
}
[ Voor 104% gewijzigd door SaphuA op 31-01-2022 15:52 ]
Ik doe het volgende. Bij het afhandelen van de instructies:Toryu schreef op woensdag 30 november 2011 @ 16:29:
pff wat een drama is het. Ik probeer nog steeds mijn ants statefull te maken, maar het wil maar niet lukken (..)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| /// <summary>Updates own ant.</summary> public override AntsAnt OnUpdateOwnAnt(AntsAnt ant) { if (this.Ants.Get(ant) == ant.Color) { ant = this.OwnAnts.Get(ant); } else { this.Ants.Set(ant, ant.Color); this.OwnAnts.Add(ant); } ant.IsUpdated = true; return ant; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| public override void OnUpdateAfter() { // Remove not updated ants. for (int i = this.OwnAnts.Count - 1; i >= 0; i--) { if (this.OwnAnts[i].IsUpdated) { this.OwnAnts[i].IsUpdated = false; } else { this.OwnAnts.Remove(this.OwnAnts[i]); } } } |
while (me.Alive) {
me.KickAss();
}
while (me.Alive) {
me.KickAss();
}
"Any sufficiently advanced technology is indistinguishable from magic."
[ Voor 101% gewijzigd door Bolukan op 02-12-2011 10:49 ]
Bolukan schreef op donderdag 01 december 2011 @ 23:10:
Selecteren van een strategie, wat is dat voor functie?
(Ik meen het serieus, op basis waarvan verander je van strategie?)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| public abstract class Strategy { protected Strategy(Truusje bot){ /* .. */ } public Truusje Bot { get; set; } protected int[,] Scores { get; set; } public virtual void Initialize(){ /* .. */ } public virtual void OnUpdateInit() { } public virtual AntsFood OnUpdateFood(AntsFood food) { return food; } public virtual AntsWater OnUpdateWater(AntsWater water) { return water; } public virtual AntsHill OnUpdateOwnHill(AntsHill hill) { return hill; } public virtual AntsHill OnUpdateEnemyHill(AntsHill hill) { return hill; } public virtual AntsAnt OnUpdateOwnAnt(AntsAnt ant) { return ant; } public virtual AntsAnt OnUpdateEnemyAnt(AntsAnt ant) { return ant; } public virtual void OnUpdateAfter() { } public virtual void OnTurnInit() { } public virtual void OnTurnAfterStrategy(AntsLoc oldLoc, AntsLoc newLoc, DirectionType dir, TruusjeCanidateMove move) { } public virtual void OnTurnAfter(AntsLoc oldLoc, AntsLoc newLoc, DirectionType dir, TruusjeCanidateMove move) { } public virtual void OnTurnAfter() { } /// <summary>Returns true if the strategy can give a move, otherwise false.</summary> public abstract bool CanMove(AntsAnt ant, AntsLoc loc, DirectionType dir); /// <summary>Gets a move.</summary> public abstract TruusjeCanidateMove GetMove(AntsAnt ant, AntsLoc loc, DirectionType dir); } |
[ Voor 2% gewijzigd door Corniel op 02-12-2011 09:23 . Reden: Toevoeging over laatste update ]
while (me.Alive) {
me.KickAss();
}
1
2
3
4
5
6
7
8
9
10
11
| #include <stdio.h> int main() { int c; #ifdef DEBUG freopen("c:/tmp/test.txt","r",stdin); #endif while ( (c = getchar()) != EOF ) printf("%c", c) ; return 0; } |
[ Voor 39% gewijzigd door Vaan Banaan op 06-12-2011 01:21 ]
500 "The server made a boo boo"
Hoewel ik er nog niet zo heel blij mee ben, dit is wat ik doe: momenteel kan ik bruteforce tot iets van 8 mieren totaal (friends+foes). Alles met meer mieren deel ik op in max. 8 mieren of 2v1 onderdelen. Het implementeren van een vooraf uitgedachte 2v1 tactiek werkte voor mij echt heel goed (zonder de bruteforce er nog bij). Verder gewoon zorgen dat je niet te veel/vroeg/onnodig 1v1 afruilt en zeker nooit 2v1 verliest.Bolukan schreef op maandag 28 november 2011 @ 23:12:
Zijn er ook ideeen hoe je een (gecoordineerde) fight moet aansturen. Is dat een kwestie van alle combinaties van zetten brute-forcen? En hoe beslis je dan? Iemand ideeen (hoeft niet geimplementeerd/proven) hoe je dat zou aanpakken. Welke onderdelen optimaliseer je? Wat zijn de tricky zaken?
Ik ben vooral benieuwd of er meerdere oplossingen mogelijk zijn, bijvoorbeeld a la diffusion smell, of met partiele optimalisatie (niet gecoordineerde afweging tussen ants met toch goed gedrag).
[ Voor 21% gewijzigd door boreus op 04-12-2011 21:06 ]
[ Voor 17% gewijzigd door Bolukan op 06-12-2011 14:03 ]
Ja ik zag ook dat a1k0n (rank: top 10) ineens zijn vecht tactiek heeft gedeeld op het forum, omg! Hij legt zo op het eerste gezicht wel redelijk precies uit hoe het geimplementeerd kan worden en verwijst hij verder voor de volledigheid naar de namen van de distributies. Ik ben met je eens dat de brute-force methode maar beperkt nuttig is.Bolukan schreef op dinsdag 06 december 2011 @ 14:02:
Ik ben heel gecharmeerd van Random sampling als vervanger van een brute-force methode.
Want of je nou 6, 8 of 9 mieren tegelijkertijd kan combineren, er zit gewoon een plafond aan.
Dirichlet distribution lijkt ingewikkeld, die beleving komt met name door de ingewikkelde wikipedia pagina, maar valt volgens mij wel mee in de praktijk.
Die van mij nietOld code doesn't rust, it gets better, as bugs are fixed.
500 "The server made a boo boo"
Ja, ik. Nog niet uitvoerig, omdat ik bij de refactoring naar versie 16 iets heel fundamenteels gemold bleek te hebben. Het heeft me een week gekost om de bug te vinden (gisteren nacht).boreus schreef op donderdag 08 december 2011 @ 11:20:
Heeft er al iemand tests gedraaid tegen mijn bots?
[ Voor 0% gewijzigd door Corniel op 08-12-2011 12:52 . Reden: typo ]
while (me.Alive) {
me.KickAss();
}
Eve char: Warock <TEST>
while (me.Alive) {
me.KickAss();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| public class GameState { public void BreakWhen(int turn, bool condition) { if (Turn == turn && condition) { if (System.Diagnostics.Debugger.IsAttached) { System.Diagnostics.Debugger.Break(); } } } .. } //gebruik: GameState.BreakWhen(401, ant.Source == new Location(9, 65)); |
Eve char: Warock <TEST>
1
2
3
4
5
6
7
8
9
| public AntsLoc GetTile(int dr, int dc, AntsSettings settings) { var r = (this.Row + dr) % settings.Rows; var c = (this.Col + dc) % settings.Cols; if (r < 0) { r += settings.Rows; } if (c < 0) { r += settings.Cols; } var loc = new AntsLoc(r, c); return loc; } |
[ Voor 6% gewijzigd door Corniel op 10-12-2011 20:32 ]
while (me.Alive) {
me.KickAss();
}
Een letterlijke vorm van 'het hoekje omgaan"Corniel schreef op zaterdag 10 december 2011 @ 20:32:
Het erge is dat dit soort fouten te weinig voorkomen om direct op te vallen, maar wel heel naar gedrag veroorzaken.
Hmm...Bolukan schreef op zaterdag 10 december 2011 @ 21:37:
Een letterlijke vorm van 'het hoekje omgaan"
while (me.Alive) {
me.KickAss();
}
while (me.Alive) {
me.KickAss();
}
Aww ja ik heb zelf ook heel lang een .jar gehad die de ass kickte van alle versies waar ik wel source code van had. Heel pijnlijk was dat. Sindsdien heb ik alles maar in een SVN gezet.Corniel schreef op maandag 12 december 2011 @ 11:38:
Hmm, Note to self: sla duidelijk betere versies op voor je gaat kloten en tweaken met nieuwe inzichten...![]()
![]()
Nog geen tijd gehad om een SVN op te zetten, en met de resterende tijd...boreus schreef op maandag 12 december 2011 @ 12:48:
Aww ja ik heb zelf ook heel lang een .jar gehad die de ass kickte van alle versies waar ik wel source code van had. Heel pijnlijk was dat. Sindsdien heb ik alles maar in een SVN gezet.
while (me.Alive) {
me.KickAss();
}
Visual Studio neemt aan dat je TFS of VSS gebruikt... Maar goed, gewoon ff kloten en dan zijn die 1,5 punten zo weer terug gevonden...boreus schreef op maandag 12 december 2011 @ 13:31:
Ik had na mijn eigen ellende in Eclipse ook wel een handige "local history" optie gevonden. Daarmee kan je ook heel veel history laten bewaren en op een handige manier terugkijken naar oudere versies. Wellicht heeft jouw IDE ook wel iets dergelijks? 't Is nu wel iets gedempte putten en verdronken kalveren helaas...
while (me.Alive) {
me.KickAss();
}
while (me.Alive) {
me.KickAss();
}
Het mogelijke voordeel zit hem denk ik meer in het vroegtijdig detecteren van enemy hills, dan het spotten van voedsel. Ik ga het wellicht zelf ook proberen, maar als het geen voordeel oplevert schakel ik het gewoon direct weer uit.boreus schreef op dinsdag 13 december 2011 @ 10:53:
De thread \[1] over symmetry detection heeft ook wel links naar hele gave filmpjes. Er staat ook in dat de mensen die het aan de gang dachten te krijgen er toch niet zo veel voordeel uit leken te halen.
Ik ook, top-3 van Nederland zou wel heel gaaf zijn. Daarvoor moet ik nog een klein stapje maken (en zijn niet.Ben benieuwd waar de nieuwe versie van Corniel eindigt.
Me too. Op Fluxid was Xanthis zijn eerste plek tijdlijk tijd, maar staat ie nu 2,2 punten los. Dat zal hier waarschijnlijk ook wel ongeveer gaan gebeuren.Daarnaast ben ik ook heel erg beniewd waar versie 2 van xathis gaat eindigen!!
[ Voor 3% gewijzigd door Corniel op 13-12-2011 11:56 ]
while (me.Alive) {
me.KickAss();
}
Er zijn er wel een aantal online. Ik speel daar wel een regelmatig tegen mijn eigen bots (draai 3/4 versies tegelijk), maar het maakt het voor mij makkelijker om in te schatten of een aanpassing ook daadwerkelijk een verbetering is.boreus schreef op dinsdag 13 december 2011 @ 14:05:
Rankings op Fluxid heb ik me nooit zo mee bezig gehouden. Of is het nu zo dat veel van de bots nog regelmatig online zijn?
Als ik v1.18 stabiel is kwa rating. Dat is wel bijna het geval denk ik. Ik wil ook nog wat andere zaken proberen, maar ik denk niet dat ik nog een keer tussentijds ga submitten. Sjaakie wilde ook nog een tussentijdse update doen, maar die liep te mopperen (lees niet alle veranderingen waren verbeteringen)(wanneer) ga je je nieuwste versie op aichallenge.org uploaden?
Vraag me af welk dele van deze lijst dat vak volgt.Ik heb gevonden dat ze op de Universiteit Utrecht deze challenge in een vak hebben verwerkt, grappig!
http://www.cs.uu.nl/docs/vakken/b2ki/werkcollege.htm
while (me.Alive) {
me.KickAss();
}
[ Voor 100% gewijzigd door boreus op 13-12-2011 16:26 ]
Nice..boreus schreef op dinsdag 13 december 2011 @ 15:07:
Nu probeer ik iets waarbij ik de combat moves van de tegenstander probeer te voorspellen door het simpele model op het AI Challenge forum \[1] te gebruiken. Weet nog niet zo goed of het werkt (..)
1
2
3
4
5
6
7
8
9
| public static class Distance { public const int Zero = int.MaxValue; } public static int[,] UpdateMinDistance(this int[,] map, AntsLoc loc, int maxdistance, MapType[,] types, int startvalue = Distance.Zero) { // ... } |
while (me.Alive) {
me.KickAss();
}
1
2
3
4
| int [,] map; map.UpdateMinDistance(loc, max, types); //ipv Util.UpdateMinDistance(map, loc, max, type); |
Klopt ik ken in ieder geval één nuttige uitzondering. Soms is het nuttig om extension method op een zelf gedefinieerde interface te hebben, omdat los van hoe deze geïmplementeerd wordt de implementatie van die ene methode altijd het zelfde is (en je geen gedeelde base class wilt/kan hebben).Sjaaky schreef op woensdag 14 december 2011 @ 11:28:
En het is ook alleen (zijn vast wel uitzondering) handig als je de source van dat type niet kunt aanpassen.
[ Voor 1% gewijzigd door Corniel op 14-12-2011 11:37 . Reden: style ding ]
while (me.Alive) {
me.KickAss();
}
Ik ken het gevoel. Ben nu met mn nieuwe combat bezig. Locale tests zijn positief, op Fluxid is het verre van een verbetering. Nog flink tweaken.boreus schreef op donderdag 15 december 2011 @ 20:23:
Bah de resultaten van mijn nieuwste versie vallen tot nu toe tegen (..)
while (me.Alive) {
me.KickAss();
}
Fluxid is wel gelijk een zware test imo!Corniel schreef op donderdag 15 december 2011 @ 20:37:
Ik ken het gevoel. Ben nu met mn nieuwe combat bezig. Locale tests zijn positief, op Fluxid is het verre van een verbetering. Nog flink tweaken.
Maar ook een goede. Ik heb van verschillende eerdere versies een betrouwbare rating. Dus ik kan zo goed testen of mijn selecte groep testruns idd representatief is, en of het een verbetering betreft.
while (me.Alive) {
me.KickAss();
}
Versie 7 en 8 staan er nu ook bij.
while (me.Alive) {
me.KickAss();
}
Ik herken wat je zegt. Ik doe niets aan het in de picture houden van de kaart. Bij de meeste mappen wordt je vrij vroeg terug gedwongen/-drongen door je tegenstanders en verspreiden mijn mieren zich automatisch prima, en loop je zo geen voedsel mis. Als er geen tegenstanders zijn, ren ik hard weg. Soms te hard, en dat kost soms voedsel, en soms je hill. Maar op het leeuwendeel van de kaarten gaat dit vrij goed. (gelukkig)boreus schreef op vrijdag 16 december 2011 @ 10:33:
Ik zal eens kijken of ik nuttige dingen over Truusje kan zeggen binnenkort. Zo na 10 potjes op maze_04p_01 gedaan te hebben lijkt het er op dat food gathering niet zo'n ontzettende prioriteit is (..)
while (me.Alive) {
me.KickAss();
}
Dat kan, maar lijkt me niet heel waarschijnlijk (understatement). Main tip zou toch zijn om tijdlogging toe te voegen op verschillende plekken, zodat je per turn een overzicht krijgt van waar de tijd inzit.dotcode schreef op vrijdag 16 december 2011 @ 11:31:
Het meest last heb ik van timeouts (..)
Hij is in C# gemaakt, zou de GC voor de timeouts kunnen zorgen?
while (me.Alive) {
me.KickAss();
}
Dotcode: wanneer krijg je je timeouts (veel mieren?)? Test je thuis ook met een turntime van 500?Corniel schreef op vrijdag 16 december 2011 @ 11:47:
[...]
Dat kan, maar lijkt me niet heel waarschijnlijk (understatement). Main tip zou toch zijn om tijdlogging toe te voegen op verschillende plekken, zodat je per turn een overzicht krijgt van waar de tijd inzit.
[ Voor 71% gewijzigd door boreus op 16-12-2011 13:10 ]
@Dotcode: Nog een tip, probeer het thuis ook eens 100 ms. Hoewel je dan wellicht geen goed resultaat meer krijgt is het wel fijn als alles netjes wordt afgehandeld. Ook ik heb zo m'n time management gefixt.boreus schreef op vrijdag 16 december 2011 @ 13:05:
Hmm op Fluxid doet v14 het wel veel beter dan v8, maar op aichallenge.org duurt met maar lang totdat er een mooie ranking uit komt.
Dotcode: wanneer krijg je je timeouts (veel mieren?)? Test je thuis ook met een turntime van 500?
while (me.Alive) {
me.KickAss();
}
http://ants.fluxid.pl/player/gogogoCorniel schreef op vrijdag 16 december 2011 @ 13:38:
[...]
@Boreus: ik ken het gevoel. Btw, je v8 heb ik gespot, wat is je v14? Die heeft een andere naam toch?
[ Voor 13% gewijzigd door boreus op 16-12-2011 14:20 ]
while (me.Alive) {
me.KickAss();
}
500 "The server made a boo boo"
Dat heb je goed begrepen.Vaan Banaan schreef op vrijdag 16 december 2011 @ 23:49:
Even voor de zekerheid: Ik heb nog tot maandagochtend 6 uur?
Uiteraard! Ambitie is nooit verkeerd.Eindelijk ben ik dan echt begonnen (..)
Maar goed ik heb nog 2 dagen, dus dat gaat helemaal goed komen.
while (me.Alive) {
me.KickAss();
}
[ Voor 3% gewijzigd door dotcode op 17-12-2011 11:34 ]
Tot dan kan je aan je bot werken als ik me niet vergis en beginnen de finalsdotcode schreef op zaterdag 17 december 2011 @ 11:31:
BTW wat is er maandag morgen 6 uur?
Eve char: Warock <TEST>
In mijn code staat in bijna iedere for- of while-loop aan de bovenkant een if-no-time-left-then-return. Volgens de profiler kost me dat in de richting van 10% van de totale CPU tijd. Er is een berekening die ik die ivm de all-pairs shortest paths die gewoon over meerdere turns verspreid kan worden. Alles is beter dan een time-out krijgen in een game imo.dotcode schreef op zaterdag 17 december 2011 @ 11:31:
Ik heb nu een beetje doorgetest voor de timings, maar na veel turns (400-800) krijg ik opeens een gat in de timing van +- 300ms, als het gebeurt in 1 van de eerste stappen die ik uitvoer is dat geen probeem, dan worden de andere geskipt. Maar als het aan het eind gebeurt ben ik de pineut. Het is steeds op een andere plaats. Ik denk toch dat het iets met memory te maken heeft... Dus daar ga ik eens naar kijken. Daarna even op attack focussen zodat ik geen miertjes verlies die toch niet konden winnen. En het hele veld zichtbaar maken.
BTW wat is er maandag morgen 6 uur?
Bij mij ook. Heb nog overwogen om een tijdschatting te maken op basis van vorige ronden, maar het risico dat je dat niet goed schat is groot, en verder kost het ontwikkelen van zo'n mechanisme enorm veel tijd. En die tijd heb ik niet.boreus schreef op zaterdag 17 december 2011 @ 13:25:
[...]
In mijn code staat in bijna iedere for- of while-loop aan de bovenkant een if-no-time-left-then-return
Hier ook. Voor het berekenen van kortste paden naar vijandelijke heuvels word elke beurt een deelgebied rond elke mier geupdate. Dit geeft geen perfect kortste pad (omwegen kunnen even blijven bestaan), maar is wel heel tijd effectief. Al was het maar omdat sommige omwegen zorgen dat je van meerdere kanten bij een hill uitkomt.Er is een berekening die ik die ivm de all-pairs shortest paths die gewoon over meerdere turns verspreid kan worden (..)
Tanx. Gelukkig heb ik nog iets achter de hand. Ik heb m'n combat mechanisme opnieuw geschreven, en op Fluxid is het verschil meer dan 2,0 punt. Dus hopelijk is dat mijn ticket tot de top 100 tijdens de finale.Gefeliciteerd Corniel met je top 100!Ik ben ook blij zelf weer in de top 100 te staan (..)
[ Voor 0% gewijzigd door Corniel op 17-12-2011 15:33 . Reden: lay-out foutje... ]
while (me.Alive) {
me.KickAss();
}
[ Voor 27% gewijzigd door dotcode op 17-12-2011 14:36 ]
while (me.Alive) {
me.KickAss();
}
500 "The server made a boo boo"
Apple iPhone 16e LG OLED evo G5 Google Pixel 10 Samsung Galaxy S25 Star Wars: Outlaws Nintendo Switch 2 Apple AirPods Pro (2e generatie) Sony PlayStation 5 Pro
Tweakers is onderdeel van
DPG Media B.V.
Alle rechten voorbehouden - Auteursrecht © 1998 - 2025
•
Hosting door TrueFullstaq