* fichier : ordo_2.dgibi ************************************************************************ * TEST DE L OPERATEUR ORDO 'COUT' * POUR LE CALCUL DE LA PERMUTATION OPTIMISANT UN COUT * BP, 2016-06-24 * mot-cles : mathematiques, permutation, arrangement ************************************************************************ ************************************************************************ * petite procedure utile pour le calcul a la main ************************************************************************ debp coutperm lili*'LISTENTI' jperm*'LISTENTI'; Scout = 0; k = ((&bi - 1) * n) + j; fin bi; finp Scout; ************************************************************************ * donnees ************************************************************************ * ml1 = lect * 6 3 7 1 8 * 5 2 4 4 7 * 2 5 3 9 4 * 6 3 4 5 4 * 2 2 6 5 8 ; list ml1; ************************************************************************ * on verifie a la main sur toutes les permutations ************************************************************************ n = enti proche (n2**0.5); si (nfacto < 1000) ; Tperm = table; * combinaison initiale cout1 = coutperm ml1 perm1; Tperm . 1 = (perm1 + 0); Tcout = Tcout et cout1; list perm1; * boucle sur les combinaisons possibles repe bcomb (nfacto - 1); icomb = &bcomb + 1; * i=n-1 i = n - 1; * 10 if(a(i).lt.a(i+1)) go to 20 * i=i-1 * if(i.eq.0) go to 20 * go to 10 repe b10; i = i - 1; si (i ega 0); quit b10; finsi; fin b10; * 20 j=i+1 * k=n j = i + 1; k = n; * 30 t=a(j) * a(j)=a(k) * a(k)=t * j=j+1 * k=k-1 * if(j.lt.k) go to 30 * j=i * if(j.ne.0) go to 40 * nextp=.false. * return repe b30; * swap REMPLACER perm1 k t; j = j + 1; k = k - 1; si (j < k); iter b30; finsi; j = i; si (j neg 0); quit b30; finsi; si (j ega 0); quit bcomb; finsi; fin b30; * 40 j=j+1 * if(a(j).lt.a(i)) go to 40 * t=a(i) * a(i)=a(j) * a(j)=t * nextp=.true. * end repe b40; j = j + 1; * swap REMPLACER perm1 j t; quit b40; fin b40; cout1 = coutperm ml1 perm1; Tperm . icomb = (perm1 + 0); Tcout = Tcout et cout1; list perm1; fin bcomb; finsi; ************************************************************************ * calcul via ORDO 'COUT' LISTENTI ************************************************************************ * calcul de la permutation et du cout associe *------> methode Hongroise : temp 'SGAC' 'IMPR'; temp ; list p_ordo; *------> methode ou lon calcule tout : temp 'SGAC' 'IMPR'; temp ; list p_ordo2; ************************************************************************ * calcul via ORDO 'COUT' LISTREEL ************************************************************************ *------> methode Hongroise : * opti surv 2121211; temp 'SGAC' 'IMPR'; temp ; list c_ordX; toto = p_ordX + 1; list toto; list p_ordX; *------> methode ou lon calcule tout : temp 'SGAC' 'IMPR'; temp ; list p_ordX2; ************************************************************************ * test de non regression ************************************************************************ si (nfacto < 1000) ; errcout = abs (cout2 - c_ordo); sinon; errcout = abs (c_ordo2 - c_ordo); finsi; SI ((errcout > 0) OU (errperm > 0)) ; SINO ; FINSI ; FIN ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales