Télécharger ordo_2.dgibi

Retour à la liste

Numérotation des lignes :

  1. * fichier : ordo_2.dgibi
  2.  
  3. ************************************************************************
  4. * TEST DE L OPERATEUR ORDO 'COUT'
  5. * POUR LE CALCUL DE LA PERMUTATION OPTIMISANT UN COUT
  6. * BP, 2016-06-24
  7. * mot-cles : mathematiques, permutation, arrangement
  8. ************************************************************************
  9.  
  10.  
  11.  
  12. ************************************************************************
  13. * petite procedure utile pour le calcul a la main
  14. ************************************************************************
  15. debp coutperm lili*'LISTENTI' jperm*'LISTENTI';
  16. Scout = 0;
  17. repe bi (dime jperm);
  18. j = extr jperm &bi;
  19. k = ((&bi - 1) * n) + j;
  20. Scout = Scout + (ABS (extr lili k));
  21. fin bi;
  22. finp Scout;
  23.  
  24.  
  25. ************************************************************************
  26. * donnees
  27. ************************************************************************
  28.  
  29. * ml1 = lect
  30. * 6 3 7 1 8
  31. * 5 2 4 4 7
  32. * 2 5 3 9 4
  33. * 6 3 4 5 4
  34. * 2 2 6 5 8 ;
  35. ml1 = brui 'BLAN' 'POIS' 1000 (10**2);
  36. list ml1;
  37.  
  38.  
  39.  
  40. ************************************************************************
  41. * on verifie a la main sur toutes les permutations
  42. ************************************************************************
  43.  
  44. n2 = dime ml1;
  45. n = enti proche (n2**0.5);
  46.  
  47. nfacto = factorie n;
  48. mess 'n!=' nfacto;
  49.  
  50.  
  51. si (nfacto < 1000) ;
  52.  
  53.  
  54. Tperm = table;
  55. Tcout = lect;
  56. * combinaison initiale
  57. perm1 = lect 1 pas 1 n;
  58. cout1 = coutperm ml1 perm1;
  59. Tperm . 1 = (perm1 + 0);
  60. Tcout = Tcout et cout1;
  61. mess '----- Combinaison 1 de cout = ' cout1 '-----';
  62. list perm1;
  63. mess '--------------------------------------------------' ;
  64.  
  65. * boucle sur les combinaisons possibles
  66. repe bcomb (nfacto - 1);
  67. icomb = &bcomb + 1;
  68.  
  69. * i=n-1
  70. i = n - 1;
  71.  
  72. * 10 if(a(i).lt.a(i+1)) go to 20
  73. * i=i-1
  74. * if(i.eq.0) go to 20
  75. * go to 10
  76. repe b10;
  77. si ((extr perm1 i) < (extr perm1 (i+1))); quit b10; finsi;
  78. i = i - 1;
  79. si (i ega 0); quit b10; finsi;
  80. fin b10;
  81.  
  82. * 20 j=i+1
  83. * k=n
  84. j = i + 1;
  85. k = n;
  86.  
  87. * 30 t=a(j)
  88. * a(j)=a(k)
  89. * a(k)=t
  90. * j=j+1
  91. * k=k-1
  92. * if(j.lt.k) go to 30
  93. * j=i
  94. * if(j.ne.0) go to 40
  95. * nextp=.false.
  96. * return
  97. repe b30;
  98. * swap
  99. t = extr perm1 j;
  100. REMPLACER perm1 j (extr perm1 k);
  101. REMPLACER perm1 k t;
  102. j = j + 1;
  103. k = k - 1;
  104. si (j < k); iter b30; finsi;
  105. j = i;
  106. si (j neg 0); quit b30; finsi;
  107. si (j ega 0); quit bcomb; finsi;
  108. fin b30;
  109.  
  110. * 40 j=j+1
  111. * if(a(j).lt.a(i)) go to 40
  112. * t=a(i)
  113. * a(i)=a(j)
  114. * a(j)=t
  115. * nextp=.true.
  116. * end
  117. repe b40;
  118. j = j + 1;
  119. si ((extr perm1 j) < (extr perm1 i)); iter b40; finsi;
  120. * swap
  121. t = extr perm1 i;
  122. REMPLACER perm1 i (extr perm1 j);
  123. REMPLACER perm1 j t;
  124. quit b40;
  125. fin b40;
  126.  
  127. cout1 = coutperm ml1 perm1;
  128. Tperm . icomb = (perm1 + 0);
  129. Tcout = Tcout et cout1;
  130. mess '----- Combinaison 'icomb' de cout = ' cout1 '-----';
  131. list perm1;
  132. mess '--------------------------------------------------' ;
  133.  
  134.  
  135. fin bcomb;
  136.  
  137. jlist = lect 1 pas 1 nfacto;
  138. Tcout2 jlist2 = ordo Tcout jlist;
  139. jmin = extr jlist2 1;
  140. cout2 = extr Tcout2 1;
  141. mess '----- Combinaison ' jmin ' de cout mini = ' cout2 '-----';
  142. list Tperm . jmin;
  143.  
  144. finsi;
  145.  
  146. ************************************************************************
  147. * calcul via ORDO 'COUT' LISTENTI
  148. ************************************************************************
  149.  
  150. * calcul de la permutation et du cout associe
  151.  
  152. *------> methode Hongroise :
  153. jperm = lect 1 pas 1 n;
  154. c_ordo p_ordo = ORDO 'COUT' 'HONG' ml1 jperm;
  155. temp 'SGAC' 'IMPR';
  156. mess '>>>>> Cout mini =' c_ordo '<<<<<';
  157. list p_ordo;
  158.  
  159. *------> methode ou lon calcule tout :
  160. c_ordo2 p_ordo2 = ORDO 'COUT' ml1 jperm;
  161. temp 'SGAC' 'IMPR';
  162. mess '>>>>> Cout mini =' c_ordo2 '<<<<<';
  163. list p_ordo2;
  164.  
  165. ************************************************************************
  166. * calcul via ORDO 'COUT' LISTREEL
  167. ************************************************************************
  168.  
  169. *------> methode Hongroise :
  170. Xperm = lect 1 pas 1 n; list Xperm;
  171. XML1 = FLOT ml1; list XML1;
  172. * opti surv 2121211;
  173. c_ordX p_ordX = ORDO 'COUT' 'HONG' Xml1 Xperm;
  174. temp 'SGAC' 'IMPR';
  175. mess '>>>>> Cout mini =' c_ordX '<<<<<';
  176. list c_ordX;
  177. toto = p_ordX + 1;
  178. list toto;
  179. list p_ordX;
  180.  
  181. *------> methode ou lon calcule tout :
  182. c_ordX2 p_ordX2 = ORDO 'COUT' Xml1 Xperm;
  183. temp 'SGAC' 'IMPR';
  184. mess '>>>>> Cout mini =' c_ordX2 '<<<<<';
  185. list p_ordX2;
  186.  
  187.  
  188.  
  189. ************************************************************************
  190. * test de non regression
  191. ************************************************************************
  192.  
  193. si (nfacto < 1000) ;
  194. errcout = abs (cout2 - c_ordo);
  195. errperm = maxi (Tperm . jmin - p_ordo) 'ABS';
  196. sinon;
  197. errcout = abs (c_ordo2 - c_ordo);
  198. errperm = maxi (p_ordo2 - p_ordo) 'ABS';
  199. finsi;
  200.  
  201. SI ((errcout > 0) OU (errperm > 0)) ;
  202. ERRE 5 ;
  203. SINO ;
  204. ERRE 0 ;
  205. FINSI ;
  206.  
  207. FIN ;
  208.  
  209.  
  210.  
  211.  
  212.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales