Exercices 11

, par Pierre

  1. from math import atan2, pi, cos, sin
  2. from time import sleep
  3. from random import gauss
  4. from robosim import *
  5. init()
  6.  
  7. horizon = 50
  8. alpha = 0.1
  9. beta = 0.01
  10.  
  11.  
  12. def todeg(angle):
  13. return (360.0 * angle) / (2 * pi)
  14.  
  15. def torad(angle):
  16. return angle / 360.0 * (2 * pi)
  17.  
  18. def cosdeg(angle):
  19. return cos(torad(angle))
  20.  
  21. def sindeg(angle):
  22. return sin(torad(angle))
  23.  
  24. def get_prox():
  25. a = orientation()
  26. L = [a + x for x in [40,20,0,-20,-40]]
  27. tel = telemetre_coords_list(*position(), angle_list = L, show_rays=False)
  28. res = [min(horizon, x) for x in tel]
  29.  
  30. return res
  31.  
  32. def cap(x, y):
  33. x0, y0 = position()
  34. angle = todeg(atan2(y - y0, x - x0))
  35. return angle
  36.  
  37. def aller_a(x, y):
  38. prox = get_prox()
  39. directions = [40, 20, 0, -20, -40]
  40. angle = 0
  41. for i in range(5):
  42. angle += prox[i] * directions[i]
  43. angle = angle * beta
  44. angle = (1 - alpha) * angle + alpha * (cap(x,y) - orientation())
  45. if angle > 0:
  46. td(angle)
  47. else:
  48. tg(-angle)
  49. av(5)
  50.  
  51. def reset():
  52. set_position(100,100)
  53. setheading(0)
  54.  
  55. def distance(a, b):
  56. (x0, y0) = a
  57. (x, y) = b
  58. return sqrt((x - x0)**2 + (y - y0)**2)
  59.  
  60. def test_evitement():
  61. reset()
  62. game.fps = 200
  63. for i in range(200):
  64. if distance(position(), (460, 460)) < 10:
  65. break
  66. aller_a(460, 460)
  67.  
  68. def f(x, y):
  69. setheading(cap(x, y))
  70. for i in range(200):
  71. aller_a(x, y)
  72. d = distance((x, y), position())
  73. if d < 10:
  74. break
  75. return i + d
  76.  
  77. def g(L):
  78. global alpha
  79. global beta
  80. reset()
  81. alpha = L[0] / 5.0
  82. beta = L[1] / 50.0
  83. return f(460, 460)
  84.  
  85.  
  86. def optim(f, N, niter):
  87. T0 = N * [0.5]
  88. perf = f(T0)
  89. for i in range(niter):
  90. T1 = [abs(x + gauss(0., 1.0)) for x in T0]
  91. perf1 = f(T1)
  92. if perf1 < perf:
  93. perf = perf1
  94. T0 = T1
  95. print T0
  96. return T0
  97.  
  98.  
  99. def test_optim():
  100. game.fps = 0
  101. print optim(g, 2, 100)
  102.  
  103. def cap_doux():
  104. reset()
  105. game.fps = 10
  106. angle = 0
  107. x, y = 460, 460
  108. alpha = 0.05
  109. for i in range(100):
  110. angle = alpha * cap(x, y) + (1 - alpha) * angle
  111. setheading(angle)
  112. av(5)
  113.  
  114. cap_doux()
  115. test_evitement()
  116. test_optim()

Télécharger

Documents joints

Revenu et logement, Je livre ici quelques éléments de comparaison concernant mon niveau de vie, pour couper court à quelques idées reçues, et un condensé de nombreuses (...)
Revenu et travail d’un enseignant-chercheur, Cet article complète l'article Revenu et logement, en détaillant un peu le budget de mon ménage, mon parcours d'enseignant-chercheur en terme de (...)
Cybersyn (el systemo synco), Au café, mardi 5 avril 2011, j'ai bien vu que, mis à part Antoine Allombert, personne ne connaissait l'histoire de l'extraordinaire projet chilien (...) [jpg, jpg, png]