Algoritmes aanvalsplanner

DeletedUser49031

Guest
Hallo iedereen,

Ik ben al een tijdje bezig met het maken van een eigen aanvalsplanner.
Het programma werkt zoals ik dat wil, echter moet ik nog een algoritme gaan toevoegen die de aanvalsdorpen nuttig verdeelt over de doelen.
Zelf heb ik nog geen idee wat voor algoritmes ik zou kunnen gebruiken. Zijn er mensen die een of meerdere algoritmes kennen hiervoor?

Nu kun je je natuurlijk afvragen: 'wanneer worden aanvalsdorpen "nuttig" verdeeld over doeldorpen?'
Hier ben ik zelf ook nog niet over uit.
Een optie is bijvoorbeeld de totale looptijd/afstand te minimaliseren.
Of zodanig verdeeld dat alle aanvallen op één tijdstip verstuurd kunnen worden.

Veel ruimte voor jullie invulling, alle toevoegingen en ideeën over algoritmes zijn welkom :)

Bij voorbaat dank!
 
Reactiescore
1.367
Wat ik het fijnste vind aan planners is dat dat aankomsten zo veel mogelijk bij elkaar liggen terwijl je de aanvallen in een uur vanaf het gebruik van de planner gebruikt

Algoritmes ken ik niet :)
 

Deleted User - 24028

Guest
Wat ik het fijnste vind aan planners is dat dat aankomsten zo veel mogelijk bij elkaar liggen terwijl je de aanvallen in een uur vanaf het gebruik van de planner gebruikt

Algoritmes ken ik niet :)

Hetgene je beschrijft is min of meer een algoritme. Wat jij wilt verder uitgewerkt:
1. eerste sortering op dit moment sturen (rekening houden met nachtbonus)
2. 2de sortering op afstand, frontdorp stuurt ver van front, achterlanddorp op front -> aankomsttijd tussen eerste en laatste aanval zo laag mogelijk

Dat lijkt met het belangrijkste voor een gewone planner :)
 

DeletedUser49031

Guest
Hetgene je beschrijft is min of meer een algoritme. Wat jij wilt verder uitgewerkt:
1. eerste sortering op dit moment sturen (rekening houden met nachtbonus)
2. 2de sortering op afstand, frontdorp stuurt ver van front, achterlanddorp op front -> aankomsttijd tussen eerste en laatste aanval zo laag mogelijk

Dat lijkt met het belangrijkste voor een gewone planner :)

Punt 2 is inderdaad iets waarvoor ik een algoritme zoek.
Ik zou zelf wel iets in elkaar kunnen knutselen dat bijvoorbeeld álle mogelijkheden worden bekeken en de beste wordt uitgevoerd. Maar dit zorgt voor veel te lange rekentijden. Ik ben dus echt op zoek naar een efficiënt algoritme.
Een benadering / heuristiek is ook welkom! :)
 

Deleted User - 24028

Guest
Ik gebruik/gebruikte in mijn aanvalsplanner volgend algoritme:
1. een gemiddeld dorp berekenen uit de opgegeven eigen dorpen
2. vanuit dit gemiddelde dorp de afstand berekenen naar elk doeldorp en deze sorteren
NOTE: hieruit kan je dus halen wel aan te vallen dorp het verste weg ligt, of dichtste bij -> verste dorp eerst aanvallen
3. Hier start je een loop die door de in stap 2 gemaakte reeks gaat
4. deze loop berekent voor elk target (dus eerst verst weg liggend) de afstand
5. je sorteert de uitkomst van deze loop op de afstand (kortste afstand eerst = snelste aanval)
6. dan laat je de tool de x aantal snelste aanvallen inplannen, en de gebruikte dorpen verwijderen voor volgende berekeningen

3 tot 6 herhaalt zich dus constant tot je aan het einde van de loop zit, of tot de aanvallen op zijn

Ik hoop dat je er wat aan hebt en ben benieuwd naar het resultaat/je plannen :)
Voor meer info mag je me eventueel aanspreken via Skype.
 

DeletedUser69459

Guest
Als deffer vind ik het altijd vervelend als er 1 aanval een 5tal uur( of meer) eerder aankomt als de andere. Dit is dan wel meer gericht op de nieuwere werelden en met looptijden van max 24uur.
 

Deleted User - 24028

Guest
Als deffer vind ik het altijd vervelend als er 1 aanval een 5tal uur( of meer) eerder aankomt als de andere. Dit is dan wel meer gericht op de nieuwere werelden en met looptijden van max 24uur.

Nou uit ervaring bleek nogtans dat je van dit algoritme op w21 ook veel last had hihihihihihihi
 

DeletedUser49031

Guest
Ik gebruik/gebruikte in mijn aanvalsplanner volgend algoritme:
1. een gemiddeld dorp berekenen uit de opgegeven eigen dorpen
2. vanuit dit gemiddelde dorp de afstand berekenen naar elk doeldorp en deze sorteren
NOTE: hieruit kan je dus halen wel aan te vallen dorp het verste weg ligt, of dichtste bij -> verste dorp eerst aanvallen
3. Hier start je een loop die door de in stap 2 gemaakte reeks gaat
4. deze loop berekent voor elk target (dus eerst verst weg liggend) de afstand
5. je sorteert de uitkomst van deze loop op de afstand (kortste afstand eerst = snelste aanval)
6. dan laat je de tool de x aantal snelste aanvallen inplannen, en de gebruikte dorpen verwijderen voor volgende berekeningen

3 tot 6 herhaalt zich dus constant tot je aan het einde van de loop zit, of tot de aanvallen op zijn

Ik hoop dat je er wat aan hebt en ben benieuwd naar het resultaat/je plannen :)
Voor meer info mag je me eventueel aanspreken via Skype.

Thanks voor je hulp!
Ik zal dit proberen toe te passen en misschien nog iets aanpassen.
Zodra het gelukt is (of als ik vastloop xD) neem ik nog wel even contact met je op via skype.
Wie weet dat we dan nog wat meer ideeën kunnen uitwisselen :)
 

Deleted User - 24028

Guest
Graag gedaan :)
Ik hoop zeker dat je er wat aan aanpast of zelfs nog een betere vind, dat maakt het alleen maar interessanter voor mij.

Ik hoop idd dat je mij nog aanspreekt, ben wel benieuwd naar wat je van plan bent ;)
 

DeletedUser

Guest
Als je snel wilt berekenen raadt ik je een A* algoritme aan, deze berekent de snelste mogelijkheid en dit algoritme is razendsnel.
Als je strategisch wilt wezen in je algoritme raad ik je aan om zo simpel mogelijk alles te houden, hoe complexer je het maakt hoe langzamer je algoritme wordt.

Ikzelf ben aan het kijken naar een hybrid A* algoritme waarmee ik ongeveer doe wat warre zegt alleen dan dat alle aanvallen zo dicht mogelijk bij elkaar aankomen maar wel achter elkaar verstuurd worden.

Het leuke (en moeilijke) aan algoritmes is dat je het zo complex kunt maken als je zelf wilt. Let altijd wel op je performance want die speelt een grote factor :)
 

DeletedUser49031

Guest
Ook al zijn we intussen ruim 2 jaar verder, ik wil toch even het volgende delen hier (voor de geïnteresseerde):
Om bij het verdelen van de aanvalsdorpen over de doelen de totale looptijd te minimaliseren, vindt het Hongaars algoritme de beste oplossing. Enkele interessante bronnen daarvoor zijn wikipedia en HungarianAlgorithm.com.
Wat ik het fijnste vind aan planners is dat dat aankomsten zo veel mogelijk bij elkaar liggen terwijl je de aanvallen in een uur vanaf het gebruik van de planner gebruikt

Algoritmes ken ik niet :)
Om zowel de verzend- als aankomsttijden dicht bij elkaar te krijgen, moeten alle afstanden tussen aanvalsdorp en doeldorp zo dicht mogelijk bij elkaar komen te liggen. Een manier om dat te doen is om het verschil tussen de maximale afstand en de minimale afstand te minimaliseren. Een algoritme daarvoor is het balanced assignment algoritme dat hier in dit boek op pagina 196 beschreven staat. Als beginpunt van dit algoritme gebruiken ze nog een algoritme dat het bottleneck assignment algoritme genoemd wordt. Dat algoritme wordt hier duidelijk beschreven.

Voornamelijk het balanced assignment algoritme is redelijk pittig om te begrijpen en implementeren, maar het leuke is wel dat deze algoritmes (zeker het Hongaars algoritme) binnen (zeer) acceptabele rekentijden de optimale oplossing/verdeling vinden. Dat wil zeggen dat er geen betere verdeling mogelijk is tussen aanvalsdorpen en doelen.

Misschien een wat ingewikkeld/wiskundig verhaal, maar ik wil het een eventuele geïnteresseerde niet onthouden :)
 
Laatst bewerkt door een moderator:

DeletedUser56689

Guest
@Merlock. Als ik het goed begrijp gebruik je dus dat Balanced Assignment algoritme om het verschil tussen de minimale en de maximale loopafstanden zo klein mogelijk te krijgen (i.e. de variatie binnen de verzendttijden minimaliseren). Klopt dit?

Ik zie daarnaast niet in wat het nut is van het hongaarse algoritme in deze context. Het minimaliseert de totale looptijd, wat natuurlijk handig is voor een blitz, maar verder nauwelijks invloed heeft als je enkele honderden aanvallen moeten versturen (met een time complexity van O(n^3) (!). Is dit haalbaar met huidige computers en een duizendtal dorpen/targets/aanvallen?).

Aan de andere kant, als ik het paper lees dat je linkt, lijkt de aanpak als volgt:
1.) Genereer een feasible solution met het Hungarian Algorithm
2.) Genereer een betere solution d.m.v. het Bottleneck Assignment Algorithm (zie paper)
3.) Genereer een optimale solution met het Balanced Assignment Algorithm?

Ik mis blijkbaar een iets hoger niveau overzicht. Zou je kort kunnen aangeven welk algoritme je waarvoor gebruikt?
 

DeletedUser49031

Guest
@.Sadye leuk om te zien dat je hier ook interesse voor hebt :)

Correct. Met het balanced assignment algoritme minimaliseer je het verschil tussen de maximale en minimale loopafstand. Hierdoor zal de variatie vaak ook kleiner worden.
Er zijn wel voorbeelden te bedenken waarbij de standaarddeviatie groter wordt, terwijl het verschil tussen maximale en minimale loopafstand kleiner wordt:
x1 = {1, 30, 60, 100}; x1standaarddeviatie = 42,35; verschil x1max en x1min = 100 - 1 = 99
x2 = {1, 2, 3, 99}; x2standaarddeviatie = 48,51; verschil x2max en x2min = 99 - 1 = 98
In dit geval is de spreiding groter bij een kleiner verschil tussen maximale en minimale loopafstand, echter zal in de praktijk verreweg het vaakst ook de spreiding mee afnemen.
Dat maakt dus het balanced assignment algoritme een mooi methode om het verschil in loopafstanden te verkleinen.

Het Hongaars algoritme is een mooie oplossing als je wilt dat alle je troepen totaal gezien zo kort mogelijk onderweg zijn en dus ook zo snel mogelijk weer terug zijn. Het kan uiteraard zo zijn dat een aantal van je troepen ontzettend lang onderweg zijn (noem ik even uitschieters), maar totaal gezien is het de snelste toewijzing (assignment). Nuttig als je zo snel mogelijk weer opnieuw wilt gaan aanvallen.

Het bottleneck assignment algoritme vindt juist de toewijzing tussen aanvalsdorpen en doelen waarbij de maximale loopafstand zo klein mogelijk is.
Dan zullen dus de uitschieters waar ik het net over had, zo klein mogelijk zijn. Echter kan daardoor de totale looptijd wel toenemen.
Het bottleneck assignment algoritme maakt gebruik van het Hongaars algoritme om een optimale toewijzing te vinden.

De uitkomst van het bottleneck assignment algoritme is uitgangspunt voor het balanced assignment algoritme. De toewijzing waarbij de grootste loopafstand zo klein mogelijk gemaakt is, zal namelijk de eerst mogelijke toewijzing zijn waarbij het verschil tussen maximale en minimale loopafstand geminimaliseerd is. Vervolgens wordt op efficiënte wijze gezocht naar andere toewijzingen waarbij dat verschil kleiner is (wat ik nu bedoel wordt dus in dit boek beschreven op pagina 196).

Kort samengevat:
  1. Het Hongaars algoritme is ideaal om de totale loopafstand te minimaliseren (handig om, over het algemeen, je troepen zo snel mogelijk aan te laten komen en weer thuis te hebben wanneer ze de aanval overleven);
  2. Het bottleneck assignment algoritme minimaliseert de grootste loopafstand (handig om eventuele uitschieters in loopafstanden zo klein mogelijk te houden). Dit algoritme maakt gebruik van het Hongaars algoritme;
  3. Het balanced assignment algoritme is handig om het verschil in looptijden zo klein mogelijk te maken (handig om je aanvallen zo gelijktijdig mogelijk te laten aankomen als je ze op 1 moment verstuurt).
Alle 3 de algoritmes kunnen dus nuttig zijn om toe te passen.
Nummer 2 en 3 maken gebruik van de eerdere algoritmes (zoals je dat zelf ook al had samengevat).

Om ten slotte nog even terug te komen op je vraag naar de benodigde rekentijd:
Op mijn laptop (Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz, 2601 MHz, 2 core('s), 4 logische processor(s) en 8GB RAM) duurt het Hongaars algoritme op een 1000x1000 matrix die waardes bevat van 1 tot 500, ongeveer 0,12 seconden.
Een matrix van 5000x5000 met waardes van 1 tot 500 duurt ongeveer 2,16 seconden.
Ik gebruik daarbij wel zeer efficiënte code (niet zelf geschreven, R code die hier op pagina 58+59 gedocumenteerd is. Het gaat om de functie 'solve_LSAP', LSAP staat voor Lineair Sum Assignment Problem wat dus door het Hongaars algoritme wordt opgelost).
Dit lijken mij nog zeer acceptabele tijden. Echter zouden de andere algoritmes al snel een veelvoud langer duren.
Een mogelijke oplossing om rekentijden dan toch nog acceptabel te houden is het afronden op tien-, twintig of vijftigtallen etc (afhankelijk van de waardes die de matrix bevat).

Ik hoop dat het hier wat duidelijker van is geworden :)
 

Deleted User - 24028

Guest
Interessant allemaal :)

Ik ken zelf niet zo veel van al die algoritmes, maar veel van de uitleg die gegeven wordt komt wel overeen met de zaken waar ik rekening mee gehouden heb in mijn aanvalstools :p Ik ben altijd gewoon begonnen met het idee "wat heb ik", "wat wil ik" en "wat is de snelste acceptabele manier om dat te bereiken". Je planning kan namelijk altijd beter, en als die niet beter kan dan kan die weer sneller, beiden optimaal hebben kan gewoon niet. Je moet ergens de gulden middenweg vinden, maw op een bepaald moment zeggen "weegt deze 10 minuten dat men langste aanval loopt echt op tegen het plannen dat 5 minuten langer duurt" en keuzes maken.

Zoals ook al aangehaald hier is er geen 100% goede berekening voor elke aanval, het hangt allemaal af van de situatie, van wat je wilt bereiken, van hoe ver de wereld gevorderd is etc etc

Daar bovenop zijn er meer zaken om af te wegen dan puur de snelste manier te vinden voor goed te plannen. Zo moet je bijvoorbeeld afwegen of mensen wel willen grijpen naar een computer programma omdat deze sneller kan plannen dan een online planner. Het brengt voordelen met zich mee, maar ook nadelen. Ikzelf zou bv liever een beter bereikbare tool hebben die dan iets trager (of minder goed) plant...

Allemaal een kwestie van prioriteiten die vaak verschillen per persoon. Voor iedereen goed doen is moeilijk, het dichtst in de buurt kom je in mijn ogen door zo goed als alle opties in planning aan te bieden apart zodat mensen kunnen kiezen wat ze op dat moment nodig hebben. Onder de opties vallen onderandere de puntjes in de post hier boven, maar er zijn meer aanvalsmethodes waar weer een andere planner voor nodig is.
 

DeletedUser49031

Guest
Het is soms inderdaad een uitdaging om de rekentijden binnen de perken te houden.
Maar bij bijvoorbeeld het Hongaars algoritme blijft dat absoluut binnen de perken, op mijn laptop is het algoritme zelfs erg snel. En aangezien het algoritme dan ook nog een optimale oplossing geeft (waarbij de totale looptijd minimaal is), vind ik het een prachtig stukje wiskunde.

Dat is inderdaad persoonlijke smaak, ikzelf zou het liefst een accurate (en snelle) planner hebben en het ervoor over hebben om die als los programma te installeren.

Ik ben eigenlijk wel heel benieuwd naar de andere aanvalsmethodes waar je het over hebt. Misschien dat daar nog bij zitten die de moeite waard zijn om uit te werken? :)
 

Deleted User - 24028

Guest
Heb het daar over de zeer ruime zin, bv planningen ideaal voor timen op de seconde, plannen van meerdere soorten aanvallen door / achter elkaar, ...

Idealistisch gezien zou je een perfect userscript moeten maken waarmee je al het voorbereidend werk kan doen (eigen dorpen ophalen, filters, target dorpen, ...) en waar je alles kan ingeven dat je voor de planning nodig hebt en keuzes kan maken (hoe je de planning wilt, output, aankomsttijden - of net geen-, aantal aanvallen per dorp, ...) waarna dan de planning wordt gemaakt op een server in de best geschikte taal (ik weet zelf niet welke dat is, maar ik gok dat python ofzo daar meest geschikt voor zou zijn) en die wordt teruggestuurd naar het userscript waarna die alles klaar zet voor versturen.

Dat is volgens mij de manier waarop je de meest gebruikvriendelijke aanvalsplanner maakt die door de meeste mensen gebruikt zal worden. Eigenlijk zoals 1Command het doet, maar dan beter, sneller en vollediger. Maar hoe je het ook draait of keert, 1c wordt veel gebruikt omdat het eenvoudig is en snel te installeren.

Ik ben ooit begonnen aan wat ik hier boven formuleer, ik had deeltje 1 af ("Idealistisch gezien zou je een perfect userscript moeten maken waarmee je al het voorbereidend werk kan doen (eigen dorpen ophalen, filters, target dorpen, ...)") en zat aan 1600 regels code. Was dan wel af tot in de perfectie: styling, snelheid, orderlijkheid (al zeg ik het zelf). Dan heeft het even stil gelegen en toen ik het weer wou op pakken had ik al andere ideeën er over en waren er reeds bepaalde regel wijzigingen geweest. De manier waarop ik werkte was nog steeds niet helemaal de beste, ben er dan ooit nog eens opnieuw aan begonnen (knippen en plakken van de oude code en verbeteren) maar door tijdsgebrek en andere prioriteiten, je kent dat wel... Daarbij, ik ken geen python of dergelijke dus mijn planning zouden toch in PHP of zelfs javascript zijn geweest, beiden niet de beste talen daarvoor, laat staan snelste. Als ik zie wat jij allemaal zegt over algoritmes zou ik mezelf daarin ook eerst nog moeten bij spijkeren om "de perfectie" te kunnen halen. Denk niet dat ik er nog snel aan ga beginnen :p
 

DeletedUser49031

Guest
@Merlock.Ik zie daarnaast niet in wat het nut is van het hongaarse algoritme in deze context. Het minimaliseert de totale looptijd, wat natuurlijk handig is voor een blitz, maar verder nauwelijks invloed heeft als je enkele honderden aanvallen moeten versturen

Ik heb net even een testje gedaan. Daarvoor heb ik de dorpen van twee spelers van w49 gebruikt. Op de kaart ziet dat er (in dit voorbeeld) als volgt uit: kaartje.

Ik heb eerst een aantal keer willekeurig de aanvalsdorpen (830) aan de doelen (825) toegewezen. Gemiddeld levert dit een loopafstand van ongeveer 137,2 op. Vervolgens heb ik het Hongaars algoritme gebruikt wat een gemiddelde loopafstand van ongeveer 134,0 oplevert.
Dit lijkt een klein verschil, maar op die wereld loopt elke aanval dan gemiddeld ongeveer 78 minuten sneller. Als een clear vervolgens de aanval overleeft en terug moet lopen, is dat nog een keer die tijd.
Met het Hongaars algoritme zou elke clear dan gemiddeld ongeveer 156 minuten (ruim 2,5 uur) eerder terug zijn.

Persoonlijk vind ik dat best wel wat winst. Het is mij in ieder geval die seconde langer wachten op het Hongaars algoritme wel waard.
 

DeletedUser56689

Guest
Correct. Met het balanced assignment algoritme minimaliseer je het verschil tussen de maximale en minimale loopafstand. Hierdoor zal de variatie vaak ook kleiner worden.
Er zijn wel voorbeelden te bedenken waarbij de standaarddeviatie groter wordt, terwijl het verschil tussen maximale en minimale loopafstand kleiner wordt:
x1 = {1, 30, 60, 100}; x1standaarddeviatie = 42,35; verschil x1max en x1min = 100 - 1 = 99
x2 = {1, 2, 3, 99}; x2standaarddeviatie = 48,51; verschil x2max en x2min = 99 - 1 = 98
In dit geval is de spreiding groter bij een kleiner verschil tussen maximale en minimale loopafstand, echter zal in de praktijk verreweg het vaakst ook de spreiding mee afnemen.
Dat maakt dus het balanced assignment algoritme een mooi methode om het verschil in loopafstanden te verkleinen.

Ik bedoelde variatie in de gebruikelijke zin van het woord: dus dat alle aanvallen ongeveer op hetzelfde moment verzonden kunnen worden (en de variatie in de verzendtijden dus minimaal is).

Ik snap nu trouwens inderdaad het idee: je wilt meerdere algoritmes hebben die je afhankelijk van de situatie aanroept. Dat sommige elkaar als startpunt gebruiken, is meer een toevalligheid.
 
Bovenaan