Virtuele Markten Trading Agent Competition A smart trading agent Erik Kant (0122246) en Marten Kampman (0240478), 9 november 2007 Naar aanleiding van de Trading Agent Competition voor het vak Virtuele Markten volgt hier het verslag van de agents kantman en kampkant. Dit verslag zal uit vier delen bestaan. Als eerste een beschrijving van de strategie van onze eigen agent, gesplitst op vluchten, hotels en entertainment. Hierna gaan we de strategie van de andere agents bekijken. In de paragraaf hierna woorden de resultaten gegeven. Als laatste wordt er een analyse gegeven van de uitgevoerde strategie vergeleken met die van de andere agents en bekeken waarom onze agent goed of slecht heeft gepresteerd. Strategie Hier volgt een beschrijving van de strategie die door onze agenten is gebruikt. Bij de eerste mislukte competitie gebruikten we twee verschillende agenten, waarbij een agent een eerdere versie was van de oorspronkelijke agent. Bij de tweede competitie gebruikten we twee dezelfde agenten. Vluchten De dagen waarop wij vluchten kopen zijn de dagen waarop de klanten voorkeur voor hebben. Als die allocatie op een dag groter is dan twee dan kopen wij daar voor elke extra allocatie een ticket voor. Dit vullen we aan tot maximaal zes vluchten totaal (in en out) die we de eerste minuut kopen. In de laatste minuut kopen we nog vluchten als we die nodig hebben. We hebben immers nog maar vluchten voor maximaal zes pakketten, en acht klanten. Hotels Een klant wordt een goed hotel toebedeeld als die een utility heeft van meer dan 30 per nacht, anders krijgt deze klant een goedkoop hotel. Dit wordt door middel van een dubbele switch gedaan: Eerst wordt bepaald in welk hotel hij komt volgens bovenstaande methode, waarna we proberen hem daarin te stoppen. Mocht dit niet lukken doordat een veiling gesloten is en we niet genoeg kamers hebben, dan wordt er alsnog naar het andere hotel gekeken of het daar wel mogelijk is. Kan deze klant in geen enkel hotel, als bijvoorbeeld de veiling is gesloten, dan wordt er verder niks meer voor deze klant geregeld. Ook geen vlucht en entertainment. Het bieden op een hotel gebeurd initieel met 100. Mocht dit niet toereikend zijn dan wordt dit verhoogd met het verschil tussen het laatste bod en de vraagprijs, zodoende dat dit minimaal 25% is. Hier zit geen maximum op. We hebben redelijk wat tijd besteed om te proberen voor elke klant een maximum utility te vinden voor een hotel bieding. Aangezien deze biedingen 16e prijs vickrey auctions zijn volstaat het om eenmalig deze prijs te bieden. Doordat we de vluchten al op bovenstaande manier kochten, is het eigenlijk niet mogelijk om dit te doen. De utility per nacht is hierdoor
moeilijk uit te rekenen. Ook het sluiten van biedingen met de mogelijkheid geen kamer te krijgen is een belemmering voor deze methode. Entertainment Als de utiliteit hoger is dan 90 dan wordt er entertainment geregeld voor de client. De drie entertainment types worden gerangschikt op hoogte van utiliteit. Als een klant maar een dag blijft wil je hem natuurlijk de entertainment geven waar hij het meest voor over heeft. Als er entertainment gekocht dient te worden dan zal dit beginnen bij 50 en loopt op tot maximaal 90. Verkopen van entertainment loopt af van 150 tot minimaal 10. Als er geen overnachting verkregen is voor de client dan zal er ook geen entertainment gekocht/toebedeeld worden. Punten waar we nog aan gedacht hebben maar die niet meer gelukt zijn, zijn tickets verhandelen, het kopen en verkopen van tickets waar al vrij vroeg de bied en vraagprijs dicht bij elkaar liggen. Tickets verkopen indien dit meer oplevert dan zelf gebruiken en rekening houden met een kleinere utiliteit dan 90 die nog wel winst geeft. Andere agenten Smith en bond Deze agenten hebben een zelfde soort strategie gekozen als de onze. Smith en Bond verschillen in de manier waarop ze voor hotels bieden. Het overige is bij beide hetzelfde. Vluchten Vluchten worden direct bij de start van het spel gekocht. Dit geldt voor alle vluchten, zowel heen als terug. Mocht uiteindelijk blijken dat voor een klant geen pakket gemaakt kan worden, dan wordt een extra terugvlucht gekocht voor deze klant, zodat hij toch op vakantie kan. Hotels Smith biedt op dure hotels als de utility per nacht hoger is dan 35. Hij biedt initieel 120. Als er meer wordt geboden biedt hij: huidige vraagprijs + (huidige vraagprijs vorige vraagprijs) + 15 Hij hanteert hierbij geen maximum. Bond gebruikt een zelfde soort formule, alleen zij de getallen iets anders. Initieel biedt hij op goedkope hotels 250, vooer dure 100. De formules (eerst die voor het dure hotel, dan die voor het goedkope): huidige vraagprijs + (huidige vraagprijs vorige vraagprijs) + 20 huidige vraagprijs + (huidige vraagprijs vorige vraagprijs) + 100 Entertainment Hier worden de standaard formules gebruikt. Voor het kopen begin je op nul een ga je langzaam aan steeds sneller hoger bieden (exponentieel). Het verkopen wordt voor 120 gedaan.
Kokhoorn & hoornkok Deze agenten berekenen brute force alle mogelijke combinaties die nog mogelijk zijn, en kiezen hieruit het beste pakket. Om dit te doen hebben ze een profit berekend. De profit bestond uit de formule: profit = (Som over klanten(utility kosten)) spill Dus per klant reken je de profit per mogelijk paket uit: Wat wil de klant betalen en zal dit ons kosten? Deze profits per klant tel je bij elkaar op. Alles wat je niet benut en wel hebt gekocht moet je hier nog vanaf trekken om de totale profit te berekenen. Hieruit komt een hoogste waarde, en dit zijn de beste pakketten die je kunt samenstellen. Bij het gebruik van deze formule loop je tegen enkele problemen aan. Wat zijn de kosten van een hotelkamer waarvan de veiling nog niet gesloten is? Wat zijn de kosten van entertainment? Wanneer koop je vluchten? De kosten van een hotelkamer en entertainment waarvan de veiling nog niet is gesloten worden met waarden uit het verleden benaderd. Nadat de veiling voor een bepaalde hotelkamer is gesloten, of entertainment is gekocht, wordt gekeken wat de waarde is, en deze waarde wordt opgeslagen voor gebruik in een volgende game. Deze waarde wordt niet zomaar opgeslagen, maar de geleerde waarde wordt met deze nieuwe waarde aangepast op de volgende manier: nieuwe waarde = learn_factor * (huidige_prijs oude waarde) Waarbij de learn factor op 0.2 was gezet, en (waarschijnlijk) de eerste waarde gewoon werd opgeslagen. Het kopen van de vluchten gebeurt als eerste na twee minuten. Vanaf dit moment worden elke minuut de vluchten voor de twee goedkoopste dagen die nog nodig zijn gekocht. Voor hotels wordt anderhalve keer de verwachte prijs geboden. Blijkt dit te weinig, wan wordt dit steeds vermenigvuldigd met anderhalf. Initieel wordt ook 5.119 geboden op hotelkamers die de klanten nodig hebben als ze een perfect pakket zouden krijgen. Op entertainment wordt in de eerste vier minuten niet geboden, omdat dit te veel tijd zou kosten bij het uitrekenen. Vanaf de vierde minuut wordt op entertainment geboden afhankelijk van de utility die de klant hiervoor heeft. Begonnen met bieden wordt op de helft van de utility. Dit loopt naarmate de tijd vordert lineair op naar de gehele utility. Bij het verkopen wordt de omgekeerde strategie gebruikt. Afbouwen van 100% naar 50%, waarbij de initiële prijs wordt bepaald door het maximum te nemen van de geleerde prijs en de huidige prijs. SlimAgent (Feugelheim) Deze agent werkt op ongeveer dezelfde manier als de kokhoorn (of andersom). Een verschil is wel dat deze agent niet alle pakketten afloopt, maar random 1000 pakketten per klant pakt. Op deze manier wordt een groot genoeg deel van alle pakketten bekeken, en heb je geen problemen met tijdgebrek.
Vluchten voor de vluchten is onderzoek gedaan naar het prijsverloop. De start en eindprijzen zijn bekeken, en het verschil hiertussen is berekend over een samplesize van tien. Uit dit onderzoek bleek dat het gemiddelde verschil tussen de begin en de eindprijs niet erg groot was. Klein genoeg om te beslissen om de tickets pas in de laatste minuut te kopen op basis van het meest winstgevende pakket. Hotels Ook hier is onderzoek naar de prijs gedaan. Hieruit is gebleken de dat de goede hotels duurde zijn dan de slechtere. Ook is gebleken dat de prijs voor een hotel op dag een het laagst is, de prijs voor een hotel van dag vier iets hoger, en de prijs voor een hotel op dag 2 en 3 het hoogst en ongeveer gelijk aan elkaar. De allocatie van de hotels wordt bepaald door het hierboven aangegeven algoritme. Op niet gealloceerde hotels wordt 5.11 geboden als backup. Het bod op gealloceerd hotels wordt bepaals met behulp van het verschil tussen de vorige en de huidige vraagprijs. Dit wordt bij de huidige vraagprijs opgeteld en vermenigvuldigd met 1.m, waarbij m het aantal verstreken minuten is. Bij de laatst te sluiten hotelbieding wordt de prijs nog eens verhoogt met 150. op dit moment kan de concurrentie toch geen informatie meer halen uit je bod, en ben je bijna zeker van deze kamers. Entertainment Voor het verkopen van entertainment wordt begonnen met het vragen van 150. Deze prijs loopt lineair in de tijd af naar vijftien. Het kopen van entertainment gebeurt pas in de laatste minuut of wanneer de vraag en biedprijs dicht bij elkaar komen en dit ticket bruikbaar is. Dan wordt de vraagprijs geboden. Resultaten Hieronder de resultaten. De bovenste 25 games zijn de games waarvan geen history is opgeslagen. Van de onderste twaalf is wel een uitgebreide history bekend. Kanttekening bij de resultaten: Bij de eerste 25 spellen was er voor elk van onze tegenstanders een spel waarbij de agent vast liep. Bij de laatste serie moest Smith steeds opnieuw worden opgestart omdat deze volgende games niet herkende. Dit bleek pas nadat die een keer fout was gegaan.
Analyse Als eerste een analyse van de resultaten. Uit beide tests blijkt dat kokhoorn en Feugelheim aardig met elkaar kunnen concurreren. Ook lijkt dat Bond goed mee kan komen, maar het in deze twee tests uiteindelijk altijd aflegt tegen beide agents. Dit geldt zowel voor de individuele agenten als voor het gemiddelde van beide. Ook blijkt dat onze agenten het niet erg goed doen. Alhoewel een van onze agenten in de tweede serie enigszins mee kan komen. Dit wijst erop dat onze agent enig geluk nodig heeft om een goede score te halen. De andere agent die precies hetzelfde te werk gaat heeft immers een veel lagere score. Het is interessant om onze agent te vergelijken met Smith/Bond. Deze agents zijn ongeveer hetzelfde. De onze doet iets beter zijn best om goede entertainment te krijgen, terwijl Smith/Bond meer hun best doen om feasible packages te krijgen. Als wij een klant geen
perfect pakket aan kunnen bieden (perfect als in heen en terugreis op de gewenste dag), dan bieden wij hem helemaal niks aan, terwijl dit pas in de loop van de competitie hoeft te blijken, en dan al kosten zijn gemaakt. Uit de resultaten blijkt dat het erg belangrijk is om feasible pakketten te maken. Aangezien dit kleine verschil tussen onze agent en Smith/Bond een groot verschil in de einduitslag geeft. Dit is niet zo gek omdat ook uit de resultaten blijkt dat bijna elk feasible pakket een positieve utiliteit oplevert. Dus waar Smith/Bond nog het beste maakt uit ene klant, maken wij alleen kosten om hem uiteindelijk niet op vakantie te sturen. Een ander interessant feit is dat Smith/Bond aardig mee kan komen met de twee 'inteligentere' agenten. Dit zal komen doordat deze agenten slimme beslissingen nemen, en alle agenten afhankelijk zijn van de beslissingen van andere agenten. Als het ware lift Smith/Bond dus mee op het succes van de andere twee. Je kunt het ook op deze manier bekijken: Deze twee agents bieden op hotels totdat ze een beter alternatief hebben. Op deze manier voeren ze de prijs van hotels op tot een bepaalde maximale waarde. Als deze waarde bereikt is stappen ze over op een ander pakket. Smith/Bond blijft echter doorbieden op deze hotels, maar omdat de tegenstanders niet meer bieden hoeft hij zijn prijs niet meer te verhogen. Op deze manier betaald Smith/Bond dus net iets meer dan wat de andere twee er maximaal voor zouden betalen, en hebben de andere twee het net iets beter gedaan door een pakket te zoeken waarbij de winst net iets groter is. Het verschil is dus niet groot, maar altijd net in het voordeel van de twee 'intelligentere' agenten. Een derde leuke vergelijking zou zijn het vergelijken van de twee beste agenten. Waarom wint Feugelheim de uiteindelijke competitie. Het vergelijken van deze twee agents is echter moeilijk. Het is ook zo dat kokhoorn de eerste competitie had gewonnen. Om deze twee echt qua resultaat te vergelijken is de samplesize gewoon te klein. Ook 25 spellen zouden hiervoor niet genoeg zijn geweest. Het verschil is zo klein dat je eerder richting de honderden spellen moet gaan denken. Wat wel interessant is om op te merken aan het verschil in deze twee agents is de manier waarop ze entertainment tickets kopen. Hierbij zou Feugelheim net iets in het voordeel moeten zijn. Zij kapen de tickets vlak voor iemands neus weg, waardoor de concurrentie in principe meer moet gaan betalen dan wat zij ervoor betalen. Hierdoor zou het kleine verschil enigszins te verklaren zijn, maar zoals al gezegd is de sample hiervoor te klein. Conclusie Aangezien onze agent simpel is geïmplementeerd komt deze wel goed mee in de competitie, het scheelt niet veel met Smith/Bond. Het lukt alleen niet om op het niveau van de andere agents te komen. Voor een echte smart agent zouden alle factoren moeten worden meegerekend en de slimste trucjes worden uitgehaald. Desalniettemin wilde wij het simpel en smart houden, de agent maakt bijna geen verlies en na het implementeren voor het kopen van een terugvlucht voor een feasible package presteert onze agent kampkant gemiddeld 2530, wat niet heel slecht is.