Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.51 KB | None | 0 0
  1. #(b, nm1,nc1,bp,nm2,nc2)
  2. import random
  3. import math
  4. import time
  5. import copy
  6.  
  7. """
  8. b-boat capacity (de ce e p acolo nimeni nu stie )
  9. nm1+nm2 = nm
  10. nc1+nc2 = nc
  11. bp - boat position
  12. asta e tot . voiallla :))
  13. """
  14.  
  15. class State:
  16. def __init__(self,b,nm1,nc1,bp,nm2,nc2):
  17. self.b=b
  18. self.nm1=nm1
  19. self.nc1=nc1
  20. self.bp=bp
  21. self.nm2=nm2
  22. self.nc2=nc2
  23.  
  24. def initialize(nm,nc,b):
  25. return State(b,nm,nc,1,0,0)
  26.  
  27. def isFinal(state):
  28. if state.nm1==0 and state.nc1==0 and state.bp == 2 :
  29. return True
  30. return False
  31.  
  32. def transition(state,nm,nc):
  33. return State (state.b,state.nm1+nm,state.nc1+nc,3-state.bp,state.nm2-nm,state.nc2-nc)
  34.  
  35. def validation(state,mm,cm):
  36. tempState = transition(state,mm,cm)
  37. if tempState.nm1>0 and tempState.nm1<tempState.nc1 :
  38. return False
  39. elif tempState.nm2>0 and tempState.nm2<tempState.nc2 :
  40. return False
  41. elif abs(mm+cm) > tempState.b :
  42. return False
  43. elif mm+cm > 0 and mm >= 0 and cm >= 0 and tempState.bp == 2 :
  44. return False
  45. elif mm + cm < 0 and mm <= 0 and cm <= 0 and tempState.bp == 1:
  46. return False
  47. elif tempState.nm1<0 or tempState.nm2<0 or tempState.nc1<0 or tempState.nc2<0:
  48. return False
  49. return True;
  50.  
  51. """
  52. s = initialize(10,10,5)
  53.  
  54. if(validation(s,-2,-3)):
  55. s=transition(s,-2,-3)
  56. print(s.b,s.nm1,s.nc1,s.bp,s.nm2,s.nc2)
  57. else :
  58. print("not valid dude")
  59. """
  60.  
  61. def randomeStrategy(s):
  62. stari = []
  63. counter = 0
  64. while isFinal(s) == False :
  65. nm = s.nm1+s.nm2
  66. nc = s.nc1+s.nc2
  67. if s.bp == 1:
  68. mm=random.randint(-nm,0)
  69. cm=random.randint(-nc,0)
  70. else :
  71. mm = random.randint(0, nm)
  72. cm = random.randint(0, nc)
  73.  
  74. if validation(s,mm,cm) and (transition(s,mm,cm) in stari) == False :
  75. counter=counter + 1
  76. s=transition(s,mm,cm)
  77. stari.append(s)
  78. #print(s.b,s.nm1,s.nc1,s.bp,s.nm2,s.nc2
  79. #(math.ceil((s.nm1+s.nm2 +s.nc1+s.nc2)/s.b))*2
  80.  
  81. if counter == 100:
  82. counter = 0
  83. stari.clear()
  84. s=initialize(s.nm1+s.nm2,s.nc1+s.nc2,s.b)
  85. #for s in stari :
  86. # print(s.b, s.nm1, s.nc1, s.bp, s.nm2, s.nc2)
  87. #print("Acest algoritm a ajuns la solutie in ",len(stari)," pasi ",end="")
  88. #if len(stari)==(math.ceil((s.nm1+s.nm2 +s.nc1+s.nc2)/s.b))*2-1:
  89. # print("(solutie optima)")
  90. #else:
  91. # print("(solutie neoptima , se putea in ",(math.ceil((s.nm1+s.nm2 +s.nc1+s.nc2)/s.b))*2-1, " pasi")
  92. return len(stari)
  93. # pentru valorile 4,4,2 . pasii parcursi minim sunt (nm+nc/b )* 2 - 1 care este ((4+4)/2)*2 -1 = 7
  94. # daca counterul este 6 atunci algoritmul ruleaza la infinit deoarece nu exista 6 pasi care sa se termine in starea finala
  95. #s=initialize(4,4,2)
  96. #randomeStrategy(s)
  97.  
  98.  
  99. def backtracking(state,list_state):
  100. for mm in range(-state.b,state.b):
  101. for cm in range(-state.b,state.b):
  102. if validation(state,mm,cm):
  103. new_state=transition(state,mm,cm)
  104. if isFinal(new_state):
  105. list_state.append(new_state)
  106. #for s in list_state:
  107. # print(s.b, s.nm1, s.nc1, s.bp, s.nm2, s.nc2)
  108. return len(list_state)
  109. elif (new_state in list_state) == False:
  110. list_state.append(new_state)
  111. if backtracking(new_state,list_state):
  112. return len(list_state)
  113. else :
  114. del list_state[-1]
  115. #s=initialize(4,4,2)
  116. #backtracking(s,[])
  117. def validStates(state):
  118. stari = []
  119. if state.bp == 1 :
  120. for mm in range(-state.b, 1):
  121. for cm in range(-state.b, 1):
  122. if validation(state, mm, cm):
  123. stari.append(transition(state,mm,cm))
  124. else:
  125. for mm in range(0,state.b+1):
  126. for cm in range(0, state.b+1):
  127. if validation(state, mm, cm):
  128. stari.append(transition(state,mm,cm))
  129.  
  130. return stari
  131.  
  132. def heuristic(stare,initialState):
  133. return ((initialState.nc1+initialState.nm2)-(stare.nc2+stare.nm2))
  134.  
  135. """
  136. print(heuristic(validStates(initialize(4,4,2))[2],initialize(4,4,2)))
  137. x = validStates(initialize(4,4,2))[2]
  138. print(x.nc1,x.nm1)
  139. """
  140. def aStaaaar(stareInitiala):
  141. incState = copy.copy(stareInitiala)
  142. d = 999999
  143. #afisez starea initiala
  144. #print(stareInitiala.nc1,stareInitiala.nm1)
  145. pas=0
  146. #fac while nu am ajuns la starea fi
  147. while isFinal(incState) == False:
  148. toateStarile = validStates(incState)
  149. for stare in toateStarile :
  150. #cand barca se intoarce atunci nu o sa existe o valoare heuristica care sa fie mai mica sau egala decat d
  151. # pentru cazul in care barca se poate intoarce singura totul este ok .
  152.  
  153. if heuristic(stare,stareInitiala) <= d:
  154. d=heuristic(stare,stareInitiala)
  155. pas +=1
  156. incState = copy.copy(stare)
  157. #print(incState.nc1, incState.nm1,incState.nc2,incState.nm2)
  158. return pas
  159. #aStaaaar(initialize(3,3,5))
  160. #8,2,5 toate valorile cu 5
  161.  
  162.  
  163. def statistici():
  164. start = time.time()
  165. sumaRandome = 0
  166. counterRandome = 0
  167. for e in range(2,10):
  168. for j in range (2,10):
  169. for k in range (5,10):
  170. if e >=j:
  171. sumaRandome+=randomeStrategy(initialize(e,j,k))
  172. counterRandome+=1
  173. print("Random are o medie de " , sumaRandome/counterRandome," pasi pe executie - durata medie executie ",(time.time()-start)/counterRandome)
  174. start = time.time()
  175. sumaBacktracking = 0
  176. counterBacktracking = 0
  177. for e in range(2, 10):
  178. for j in range(2, 10):
  179. for k in range(5, 10):
  180. if e >= j:
  181. sumaBacktracking += backtracking(initialize(e, j, k),[])
  182. counterBacktracking += 1
  183. print("Backtracking are o medie de ", sumaBacktracking / counterBacktracking, " pasi pe executie - durata medie executie ",(time.time()-start)/counterBacktracking)
  184.  
  185. sumaStar= 0
  186. counterStar = 0
  187. for e in range(2, 10):
  188. for j in range(2, 10):
  189. for k in range(5, 10):
  190. if e >= j:
  191. sumaStar += aStaaaar(initialize(e, j, k))
  192. counterStar += 1
  193. print("a* are o medie de ", sumaStar / counterStar, " pasi pe executie - durata medie executie ",(time.time()-start)/counterStar)
  194. statistici()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement