Het algemene idee is om simulated annealing toe te passen. Dit doen we vervolgens een aantal keren met random beginpositie en we nemen vervolgens de beste score. Intern hebben we van elke kaart maar 1 kopie en worden de kaarten dus gekopieerd als we er meerdere hebben. Het huis wordt opgesplitst in 2 kaarten. Voor het bepalen van de beginpositie houden we bij welke kaarten we al gelegd hebben. Vervolgens plaatsen we eerst het huis. Vervolgens gaan we alle posities langs en nemen een random kaartnummer. Als die kaart nog vrij is plaatsen we die en anders kiezen we weer random. Als er geen kaarten over zijn stoppen we en laten we de overige posities leeg. Het is inderdaad een nadeel dat de komende vakjes niet de beste hoeven te zijn om leeg te laten en de simulated annealing daar niets meer aan veranderd. De mutatie die we voor de simulated annealing gebruiken is het swappen van twee kaarten. De enige constraints die hierop staan zijn dat ze beide geen onderdeel van het huis zijn en dat minstens 1 van de kaarten een positie op het veld heeft. Vervolgens gaan we door tot er al een bepaalde tijd geen betere score is gevonden en dan stoppen we. Dit hele proces gebeurt in batches van 4 beginposities waarop we tegelijk simulated annealing toepassen. Als er uit alle 4 dezelfde score komt is het dermate waarschijnlijk dat dit het maximum is dat we helemaal stoppen. Anders gaan we gewoon door tot we gekilled worden. Dit levert echter nog niet zo een hele goede score/tijd op, zeker bij de grote velden. We hebben het effect van naast elkaar liggende kaarten geprecalculeerd. Dit doen we al op richting en met het effect van de inputs van de een en de outputs van de ander en omgekeerd gecombineerd. Vervolgens hoeven we bij het swappen van de twee kaarten maar de <= 16 buren te bekijken van de kaarten die we net geswapt hebben. Dit kan met de geprecalculeerde waarden heel snel. Ook hebben we het veld aan elke kant 1 groter gemaakt en die velden leeg gelaten. Daardoor hoeft er niet gekeken te worden of we op de rand zitten bij het bepalen van de score. Dit alles geeft het algoritme een redelijke snelheid op mijn computer. Wegens het precalculeren heeft het algoritme een geheugengebruik proportioneel aan het aantal kaarten in het kwadraat. Bij ongeveer evenveel kaarten als posities kost dit dus ongeveer 8*r^2*c^2 bytes geheugen met r en c respectievelijk het aantal rijen en kolommen. In mijn oplossing zijn overigens een hoop constanten opgenomen die ik gekozen heb zonder goede onderbouwing, maar het in de praktijk wel aardig doen.