Advertisement
Guest User

Untitled

a guest
Oct 31st, 2014
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.55 KB | None | 0 0
  1. from random import randint, gauss, seed, uniform, random
  2. from math import exp
  3. from time import sleep
  4. import numpy as np
  5.  
  6. M = 10
  7. N = 10
  8. E = 3
  9.  
  10. #Initializerer de to viktigste listene. En for aa passe paa om man kan plassere paa posisjonen, og en for aa holde om egg er plassert der. Samme stoerrelse.
  11. canPlaceLookUp = []
  12. hasEgg = []
  13.  
  14. for y in range(0,M):
  15.     canPlaceLookUp.append([])
  16.     hasEgg.append([])
  17.     for x in range(0,N):
  18.         canPlaceLookUp[y].append(True)
  19.         hasEgg[y].append(False)
  20.  
  21. #1-dimensjonal liste med egg plassert.
  22. placedEggs = []
  23. #Energi og nedkjoeling.
  24. energy = 1.0
  25. cooling_rate = 0.0002
  26. #Retninger til count_eggs
  27. directions = [(-1,0),(-1,-1),(0,-1),(1,-1),(1,0),(1,1),(0,1),(-1,1)]
  28.  
  29. #Needs a bit of a clean up, but will stay a bit cluttered as long as it works.
  30. def can_place(x, y):
  31.     global hasEgg, canPlaceLookUp, E
  32.  
  33.     if not canPlaceLookUp[y][x]:
  34.         return False
  35.  
  36.     #Check vertical and horizontal
  37.     if egg_counter(hasEgg, 0,y,(1,0),0)>=E:
  38.         canPlaceLookUp[y][x] = False
  39.         return False
  40.     if egg_counter(hasEgg,x,0,(0,1),0)>=E:
  41.         canPlaceLookUp[y][x] = False
  42.         return False
  43.     #Check diagonals
  44.     if (egg_counter(hasEgg,x,y,(-1,-1),0)+egg_counter(hasEgg,x+1,y+1,(1,1),0))>=E:
  45.         canPlaceLookUp[y][x] = False
  46.         return False
  47.     if (egg_counter(hasEgg,x,y,(1,-1),0)+egg_counter(hasEgg,x-1,y+1,(-1,1),0))>=E:
  48.         canPlaceLookUp[y][x] = False
  49.         return False
  50.     return True
  51.  
  52. #Teller alle eggene i en retning fra posisjon og returnerer antall egg. Rekursivt flytter seg i en retning. Enten vertikalt, horisontalt eller diagonalt, basert paa dv.
  53. def egg_counter(array, startx, starty, dv, current_count):
  54.     if startx == len(array[0]) or starty == len(array) or startx < 0 or starty < 0:
  55.         return current_count
  56.     if array[starty][startx]:
  57.         current_count+=1
  58.     return egg_counter(array, startx+dv[0], starty+dv[1], dv, current_count)
  59.  
  60. #Teller eggene i alle retninger fra en posisjon. Bruker egg_counter for tellingen. Her er ett lavt antall egg en god ting for å spre løsningen bedre utover brettet.
  61. def count_eggs(pos):
  62.     global hasEgg, directions
  63.     counter = 0
  64.     for dv in directions:
  65.         counter += egg_counter(hasEgg, pos[0], pos[1], dv,counter)
  66.     return counter
  67.  
  68. #Henter ut "naboer" av posisjonen. Henter ut ved en submatrise av samme stoerrelse som hovedmatrisen, men midstilt i punktet
  69. def generate_neighbors(x,y):
  70.     global M, N
  71.     result = []
  72.     n = max(M,N)
  73.     for a in xrange(0,n):
  74.         for b in range(0,n):
  75.             xi = max(0,min((x+a-n/2),N-1))
  76.             yi = max(0,min((y+b-n/2),M-1))
  77.             if can_place(xi,yi):
  78.                 result.append((xi,yi))
  79.     return result
  80.  
  81. #Hovedfunksjonen for aa finne egg og returnere det. Baserer seg paa funksjonen i skriptet gitt fra oevingsforelesningen
  82. def step(lastPlaced, placedEggs, temperature):
  83.     neighbors = generate_neighbors(lastPlaced[0], lastPlaced[1]) #Henter ut mulige "naboer" av egget som ble sist lagt til.
  84.     num_neighbors = len(neighbors) #Antall "naboer"
  85.     if num_neighbors == 0: #Hvis det ikke er noen naboer returnerer den None saa den kan starte funksjonen paa nytt og finne et annet egg.
  86.         return None
  87.     n_fitness = map(count_eggs, neighbors) #Mapper antall egg rundt naboposisjonen
  88.     max_fitness = min(zip(n_fitness, neighbors)) #Finner den posisjonen som har flest egg rundt seg. (burde kanskje endre denne til min)
  89.  
  90.     q = (max_fitness[0] - count_eggs(lastPlaced))/count_eggs(lastPlaced)
  91.     p = min(1,exp(-q/temperature))
  92.  
  93.     if random() > p:
  94.         return max_fitness[1]
  95.     else:
  96.         return neighbors[randint(0,num_neighbors-1)]
  97.  
  98. #Seed for aa kontrollere tilfeldigheten.
  99. seed()
  100. #Lager det foerste egget og plasserer det i "esken"
  101. firstx = randint(0,N-1)
  102. firsty = randint(0,M-1)
  103. placedEggs.append((firstx, firsty))
  104. hasEgg[firsty][firstx] = True
  105. canPlaceLookUp[firsty][firstx] = False
  106.  
  107. #Hovedloopen
  108. while 1:
  109.     #Henter ut egg basert paa det egget som ble sist laget.
  110.     egg = step(placedEggs[len(placedEggs)-1],placedEggs, energy)
  111.     if egg:
  112.         #Plasserer egg
  113.         placedEggs.append(egg)
  114.         hasEgg[egg[1]][egg[0]] = True
  115.         canPlaceLookUp[egg[1]][egg[0]] = False
  116.     #Reduserer energien/temperaturen
  117.     if energy-cooling_rate > 0:
  118.         energy -= cooling_rate
  119.     else:
  120.         #Skriver div info til en outputfil og bryter loopen for aa stoppe skriptet. Strengt tatt ikke viktig for algoritmen
  121.         f = open("output.txt", "w")
  122.         f.write("Seed: 5 \n\n")
  123.         for eggs in hasEgg:
  124.             print eggs
  125.             for egg in eggs:
  126.                 f.write(str(egg)[0:1] + "\t")
  127.             f.write("\n")
  128.         f.write("\nAntall egg: " + str(len(placedEggs)) + "\n\n")
  129.         print len(placedEggs)
  130.         for egg in placedEggs:
  131.             f.write("x: " + str(egg[0]) + ", y:" + str(egg[1]) + "\n")
  132.         f.close()
  133.         print placedEggs
  134.  
  135.         break
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement