Logistieke Robots/les 7
Les 7 - Algoritmen met elkaar vergelijken
De eerste vraag die we natuurlijk willen onderzoeken is: werkt dit echt? Zorgt dit algoritme echt voor een verbetering ten opzichte van niet met elkaar communiceren? Voordat we hier echt uitspraken over kunnen doen, moeten we eerst veel experimenteren. Let daarbij ook op het feit dat het simuleren met robots ontzettend lastig is. Er kan, zoals je misschien wel gezien hebt, van alles verkeerd gaan. Robot kunnen vast blijven zitten tussen de kasten, elkaar steeds in de radar hebben en daardoor niet verder kunnen etc. De simulaties die in deze les gedaan zijn kunnen dan ook erg verschillen van jouw resultaten. Dit is helemaal niet erg. Er is ook geen beste oplossing en het is ontzettend lastig om de juiste waarden te vinden die ervoor zorgen dat de robots snel van elkaar leren. Maar dit maakt het ook weer erg leuk!
We gaan op de volgende manier ons algoritme testen: We gaan eerst experimenten doen met waarden van de robots niet veranderen. Wanneer we hier een aantal runs van gedaan hebben, hebben we een idee van de prestatie van het algoritme zonder leren. Vervolgens laten we de waarden wel veranderen met ons evolutionair algoritme. We kunnen nu de uitkomsten van beide manieren met elkaar vergelijken.
We moeten dan alles onder “# update values” in commentaar zetten door voor iedere regels een # te zetten. Laat de robots totaal 50 boxen vullen en zet de robots aan het werk. In het terminal venster zie je de orders geprint worden en je ziet ook een array die steeds groter wordt naarmate de robots langer bezig zijn. Dit is het central[“algorithm”] array en geeft per minuut het aantal botsingen weer. Doe 5 keer een run. Het kan gebeuren dat de robots vast lopen. Stop deze run dan en probeer het opnieuw. Wanneer dit vaak gebeurd, open Blender dan opnieuw. Hieronder staat de ruwe data van 5 complete runs:
Run 1: Prestatie: [28.0, 4.0, 2.0, 18.0, 0.0, 4.0, 4.0, 6.0, 0.0, 6.0, 32.0] [[0.0, 1.1033122539520264, 1.4639674425125122, Robot_6], [0.0, 1.2986571788787842, 0.5416139364242554, Robot_10], [0.0, 0.651454746723175, 1.3667792081832886, Robot_11], [3.0, 1.9125906229019165, 1.1833915710449219, Robot_9], [8.0, 0.0756225660443306, 1.3220340013504028, Robot_7], [21.0, 1.4247708320617676, 1.0523004531860352, Robot_8]] Total walked distance: 13691 659.673114329765
Run 2: [2.0, 29.0, 9.0, 13.0, 55.0, 9.0, 18.0, 0.0, 8.0, 22.0, 12.0] [[0.0, 0.11781859397888184, 0.6557546257972717, Robot_9], [0.0, 1.0547598600387573, 0.571683406829834, Robot_11], [1.0, 1.167196273803711, 1.976454496383667, Robot_6], [1.0, 1.3991421461105347, 1.4800572395324707, Robot_8], [5.0, 1.9634203910827637, 1.1145190000534058, Robot_7], [5.0, 1.4843071699142456, 0.8718631267547607, Robot_10]] Total walked distance: 13488 660.432861328125
Run 3: [105.0, 8.0, 27.0, 8.0, 24.0, 34.0, 41.0, 4.0, 0.0, 0.0, 26.0] [[0.0, 0.6206476092338562, 1.2706804275512695, Robot_6], [0.0, 1.888157606124878, 0.8151676058769226, Robot_7], [0.0, 1.1586012840270996, 1.4619909524917603, Robot_8], [3.0, 1.3452816009521484, 1.9687161445617676, Robot_11], [8.0, 0.7305728793144226, 0.9222739934921265, Robot_10], [15.0, 0.5778017044067383, 1.1174777746200562, Robot_9]] Total walked distance: 14184 660.0662841796875
Run 4: [14.0, 18.0, 29.0, 4.0, 12.0, 31.0, 6.0, 8.0, 33.0, 0.0, 6.0] [[0.0, 0.5198497176170349, 1.950926661491394, Robot_6], [0.0, 0.5083528757095337, 1.4684268236160278, Robot_9], [0.0, 0.339052677154541, 1.2538245916366577, Robot_11], [1.0, 1.4567952156066895, 1.5516620874404907, Robot_7], [11.0, 1.5452338457107544, 0.8980489373207092, Robot_10], [21.0, 0.24807365238666534, 0.017792876809835434, Robot_8]] Total walked distance: 13029 559.6408081054688
Run 5: [6.0, 16.0, 4.0, 4.0, 54.0, 14.0, 24.0, 15.0, 10.0, 43.0] [[0.0, 1.8651994466781616, 0.8983461260795593, Robot_6], [0.0, 0.7337772846221924, 1.389615535736084, Robot_8], [0.0, 0.24811603128910065, 1.3182649612426758, Robot_9], [0.0, 1.664925456047058, 0.2161814123392105, Robot_11], [2.0, 0.9058579206466675, 1.5737985372543335, Robot_7], [41.0, 1.09906005859375, 1.6222947835922241, Robot_10]] Total walked distance: 13590 600.0642700195312
We willen deze waarden presenteren in een grafiek. Open Excel en typ de waarden over:
Het kan zijn dat niet alle cellen gevuld zijn omdat het inpakken de ene keer sneller ging dan de andere keer. Selecteer de waarden in kolom 2-7 en voeg een grafiek toe:
De volgende grafiek ontstaat nu:
Pas op dit moment kunnen we iets zeggen over de prestatie van het algoritme. We zien erg veel variatie in het aantal botsingen per minuut en tussen de runs. Verschil tussen de runs kan komen door de verschillende (willekeurige) startwaarden. Wel kunnen we vaststellen dat geen een run een klein aantal botsingen heeft voor iedere minuut.
We gaan nu experimenten doen waarbij de robots van elkaar leren. We hopen hierbij te zien dat het aantal botsingen een dalende lijn is bij iedere run. We zeggen hier met nadruk “hopen” omdat je niet zeker weet of dit het geval is. Doe weer een aantal runs.
Run 1: [69.0, 0.0, 4.0, 2.0, 47.0, 0.0, 50.0, 2.0, 0.0, 6.0, 2.0] [[0.0, 2.146437644958496, 1.5113431215286255, Robot_6], [0.0, 1.5602511167526245, 1.0936894416809082, Robot_7], [0.0, 1.9991168975830078, 1.5253989696502686, Robot_8], [0.0, 1.5248929262161255, 0.983869194984436, Robot_9], [0.0, 1.957208514213562, 1.5127331018447876, Robot_10], [0.0, 1.8197909593582153, 1.096867561340332, Robot_11]] Total walked distance: 13318 720.0682983398438
Run 2: [37.0, 17.0, 8.0, 4.0, 0.0, 0.0, 0.0, 13.0, 31.0, 4.0] [[0.0, 2.028287887573242, 0.7059972286224365, Robot_6], [0.0, 2.0065548419952393, 1.0062334537506104, Robot_8], [0.0, 2.313992977142334, 0.997683584690094, Robot_9], [0.0, 2.0005781650543213, 0.9316716194152832, Robot_10], [2.0, 2.1137619018554688, 0.9539632797241211, Robot_7], [2.0, 2.295074224472046, 1.1398147344589233, Robot_11]] Total walked distance: 12566 600.0642700195312
Run 3: [13.0, 12.0, 6.0, 30.0, 2.0, 2.0, 30.0, 17.0] [[0.0, 0.4430656433105469, 0.5342904329299927, Robot_10], [0.0, 0.5598312020301819, 0.3072521984577179, Robot_11], [1.0, 0.3825035095214844, 0.6534862518310547, Robot_9], [4.0, 0.4900607466697693, 0.3672640025615692, Robot_7], [5.0, 0.6171832084655762, 0.5994473695755005, Robot_8], [7.0, 0.32172659039497375, 0.5386554598808289, Robot_6]] Total walked distance: 12057 480.06024169921875
Run 4: [13.0, 0.0, 7.0, 0.0, 0.0, 0.0, 6.0, 6.0, 2.0, 0.0] [[0.0, 1.5696516036987305, 0.019686052575707436, Robot_6], [0.0, 1.553520679473877, 0.2368871420621872, Robot_7], [0.0, 1.6649249792099, 0.3868585228919983, Robot_8], [0.0, 1.4215301275253296, 0.05945594608783722, Robot_9], [0.0, 1.315022349357605, 0.0, Robot_10], [0.0, 1.4969103336334229, 0.0028564489912241697, Robot_11]] Total walked distance: 12796 600.0642700195312
Run 5: [6.0, 0.0, 4.0, 20.0, 0.0, 0.0, 0.0, 64.0, 13.0] [[0.0, 1.2154109477996826, 1.8105230331420898, Robot_6], [0.0, 1.3451547622680664, 1.8669763803482056, Robot_7], [0.0, 1.3241212368011475, 1.782742977142334, Robot_9], [0.0, 1.600753664970398, 1.936579942703247, Robot_11], [2.0, 1.7318297624588013, 2.0279102325439453, Robot_8], [3.0, 1.4447206258773804, 1.689884901046753, Robot_10]] Total walked distance: 15149 720.0682983398438
Wanneer we van deze resultaten een grafiek maken krijgen we het volgende:
We zien duidelijk dat het aantal botsingen in de eerste paar minuten afnemen. Dit kan zijn omdat de slechte strategieën snel vervangen worden door de betere. Hierna zien we jammer genoeg weer een stijging. Iedere run zal anders zijn en jouw grafiek zal vast verschillen van degene die hierboven staat. In de grafiek hierboven kun je een interessant gegeven halen. We zien namelijk dat Run 4 in iedere minuut een klein aantal botsingen heeft. Het is dan interessant om te kijken naar de waarden van de strategieën in Run 4 en deze al beginwaarden te nemen voor een nieuw experiment. Zo kunnen we de robots voorzien van eerder zelf geleerde kennis!
Belangrijk om te leren van deze les is dat werken met robots in de echte wereld veel moeilijkheden met zich meebrengt. Voor ons is het zo vanzelfsprekend om niet tegen andere mensen aan te botsen maar voor robots is dit helemaal niet het geval. Hoe ga je hiermee om?
Plusopdracht
Je kan op dit moment ontzettend veel gaan onderzoeken. Je kan zelf waarden meegeven aan de robots waarvan jij denkt dat het de juiste zijn. Je kan robots verschillende waarden geven zodat ze niet op precies hetzelfde moment weer verder gaan met de bestelling en elkaar weer tegen komen, je kan de variatie die opgeteld wordt bij de nieuwe strategie veranderen. Kortom: je kan van alles proberen om het aantal botsingen naar beneden te krijgen. Je kan zelfs de hele strategie wijzigen, misschien wil je wel dat wanneer de robots elkaar tegen komren op de radar, de een gaat versnellen om de andere robot net voor te zijn? Of wil je dat ze met elkaar communiceren om een plan te maken wie welke kant op stapt?