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]