Advertisement
Golgoute

Début commentaires TIPE

Jun 6th, 2013
2,776
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. let M=3 and N=4;; (*On modifie ici les dimensions qu'on donne à l'échiquier, M est la longueur horizontale*)
  2.  
  3. (*On commence par créer les matrices et objets qui nous serviront plus tard*)
  4. type POSITION = {mutable x: int; mutable y: int};;
  5. let parcours = make_matrix M N 0;;
  6. let poids = make_matrix M N 0;;
  7.  
  8. (*On initialise les matrices "parcours" et "poids" qu'utilisent les programmes finaux*)
  9. let initialiserParcours mat =
  10.  for i=0 to M-1 do
  11.   for j=0 to N-1 do
  12.    mat.(i).(j) <- 0
  13.   done
  14.  done;;
  15.  
  16. let initialiserPoids mat =
  17.  let nb_accessibles = ref 0 and deltaX = [|2;1;-1;-2;-2;-1;1;2|] and deltaY = [|1;2;2;1;-1;-2;-2;-1|] in
  18.   for i=0 to M-1 do
  19.    for j=0 to N-1 do
  20.     nb_accessibles := 0;
  21.     for k=0 to 7 do
  22.      if (i+deltaX.(k) >= 0 && i+deltaX.(k) < M) && (j+deltaY.(k) >= 0 && j+deltaY.(k) < N ) then
  23.       nb_accessibles := !nb_accessibles + 1
  24.      done;
  25.     mat.(i).(j) <- !nb_accessibles;
  26.    done;
  27.  done;;
  28.  
  29. (*Premier programme destiner à afficher de façon lisible les matrices qui donneront les parcours du cavalier*)
  30. let afficher mat =
  31. let n=vect_length mat and m=vect_length mat.(0) in
  32.  print_newline();
  33.  for i=0 to N-1 do
  34.   for j=0 to M-1 do
  35.    if (mat.(j).(i))>99 then begin print_int mat.(j).(i); print_string "|"; end
  36.    else if (mat.(j).(i))>9 then begin print_string " "; print_int mat.(j).(i); print_string "|"; end
  37.    else begin print_string "  "; print_int mat.(j).(i); print_string "|"; end
  38.   done;
  39.   print_newline();
  40.  done
  41. ;;
  42.  
  43. (*1er programme pour l'application de l'heuristique de Warnsdorff: il met à jour la matrice poids à chaque déplacement du cavalier*)
  44. let miseAJourPoids p =
  45.  let deltaX = [|2;1;-1;-2;-2;-1;1;2|] and deltaY = [|1;2;2;1;-1;-2;-2;-1|] (*modélisent tous les déplacements du cavalier*) and pCur=ref { x=0; y=0 } in
  46.   for i = 0 to 7 do
  47.    begin
  48.    (!pCur).x <- p.x + deltaX.(i);
  49.    (!pCur).y <- p.y + deltaY.(i);
  50.     if ((!pCur).x >= 0 && (!pCur).x < M) && ((!pCur).y >= 0 && (!pCur).y < N ) (*on vérifie si le déplacement est possible sans sortir de l'échiquier*) then
  51.      poids.((!pCur).x).((!pCur).y) <- poids.((!pCur).x).((!pCur).y) - 1;
  52.    end
  53.   done
  54. ;;
  55.  
  56. (*Programme coeur pour l'heuristique: il détermine la prochaine case sur laquelle devra se déplacer le cavalier*)
  57. let Warnsdorff p =
  58.  let deltaX = [|2;1;-1;-2;-2;-1;1;2|] and deltaY = [|1;2;2;1;-1;-2;-2;-1|] (*modélisent tous les déplacements du cavalier*)
  59.  and pMin = ref { x=0; y=0 } and poidsMin = ref 9 and iMin = ref 0 in
  60.   miseAJourPoids p;
  61.   for i = 0 to 7 do (*cad pour chaque déplacement*)
  62.    begin
  63.    (!pMin).x <- p.x + deltaX.(i);
  64.    (!pMin).y <- p.y + deltaY.(i);
  65.    if (*plusieurs vérifications:*) ((!pMin).x >= 0 && (!pMin).x < M) && ((!pMin).y >= 0 && (!pMin).y < N ) (*si la case est dans l'échiquier*)
  66.     && (parcours.((!pMin).x).((!pMin).y) = 0) (*si la case n'a pas encore été atteinte par le cavalier*)
  67.     && (poids.((!pMin).x).((!pMin).y) < !poidsMin) (*on compare le poids des cases*) then
  68.     begin
  69.      poidsMin := poids.((!pMin).x).((!pMin).y);
  70.      iMin := i;
  71.     end
  72.    end
  73.   done;
  74.   if (!poidsMin) = 9 then failwith "Pas de parcours possible"; (*dans le cas où le cavalier est arriver dans une impasse*)
  75.   {x=p.x + deltaX.(!iMin); y=p.y + deltaY.(!iMin)};;
  76.  
  77. (*Programme coeur qui synchronise les différentes briques de programmation:*)
  78. let parcourir x y =
  79.  let p = ref { x=x; y=y } and i = ref 2 in
  80.  begin
  81.  while (!i<=M*N) do
  82.   p:=Warnsdorff(!p);
  83.    if ((!p).x >= 0) then begin
  84.     parcours.((!p).x).((!p).y) <- !i;
  85.     i:=!i+1;
  86.     end
  87.    else i:=M*N+1;
  88.   done;
  89.   if ((!p).x >= 0) then
  90.    afficher parcours
  91.   else failwith "Pas de solution trouvee"
  92. end;;
  93.  
  94. (*Programme final avec choix de la case de départ:*)
  95. let principale x y =
  96.  initialiserParcours parcours; initialiserPoids poids;
  97.  parcours.(x).(y) <- 1; parcourir x y
  98. ;;
  99.  
  100. for i= 0 to M-1 do for j=0 to N-1 do principale i j done; done;;
  101.  
  102. let M = 6 and N = 6;;
  103.  
  104. (*Programme qui copie une matrice dans une autre:*)
  105. let copie mat1 mat2 =
  106. let n=vect_length mat1 and m=vect_length mat1.(0) in
  107.  for i=0 to n-1 do
  108.   for j=0 to m-1 do
  109.    mat2.(i).(j) <- mat1.(i).(j);
  110.   done;
  111.  done;
  112. ;;
  113.  
  114. let rec parcourir_backtracking x y mat n =
  115.  let deltaX = [|2;1;-1;-2;-2;-1;1;2|] and deltaY = [|1;2;2;1;-1;-2;-2;-1|] and pos = ref {x=0;y=0} and i = ref 0 and s = ref [] and parcours = ref (make_matrix M N 0) in
  116.  while (!i < 8) do
  117.    (!pos).x <- x + deltaX.(!i);
  118.    (!pos).y <- y + deltaY.(!i);
  119.    if ((!pos).x >= 0 && (!pos).x < M) && ((!pos).y >= 0 && (!pos).y < N )  then
  120.     begin
  121.      if (mat.((!pos).x).((!pos).y) = 0) then
  122.      begin
  123.       copie mat (!parcours);
  124.       (!parcours).(x).(y) <- n;
  125.       (!parcours).((!pos).x).((!pos).y) <- n+1;
  126.       s := ( parcourir_backtracking ((!pos).x) ((!pos).y) (!parcours) (n+1) )@(!s);
  127.      end
  128.      else if (mat.((!pos).x).((!pos).y) = 1) && n>=(M*N) then
  129.        s := mat::(!s);
  130.     end;
  131.     if (!s)<>[] then i:=9;
  132.    i:=!i+1;
  133.  done;
  134.  !s
  135. ;;
  136.  
  137.  
  138. let principale_backtracking x y =
  139.  afficher ( hd (parcourir_backtracking x y (make_matrix M N 0) 1 ) )
  140. ;;
  141.  
  142. principale_backtracking 1 1;;
  143.  
  144. let rec afficherliste = function
  145. |[]-> failwith "Pas de solution trouvee"
  146. |a::q->begin
  147.     afficher a;
  148.     afficherliste q;
  149. end
  150. ;;
  151.  
  152. principale_backtracking 0 0;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement