Correction de la série d'exercices no4

Exercice 4-1 : Tiling problem

Le nombre de combinaisons à tester est : D(NxN)
Chaque essai prend NxN secondes.
Le temps nécessaire est (NxN) x {D(NxN)} secondes

Exercice 4-2 : Cost of finding solution - voyageur de commerce

Cet exercice est une introduction à la complexité des problèmes.

Il existe (N-1)! possibilités de connecter les N villes. Attention, comme le problème est symmétrique (Le trajet de la ville A à la ville B est identique en longueur au trajet de la ville B à la ville A), on ne peut retenir que la moitié des possibilités. Au final, il y a donc (N-1)! / 2 différents chemins entre les N villes.

Voici un algorithme qui permet de répondre au problème :

% The cities (nodes) are numbered N={1,2,...,n}.
% w(i,j) is the length of the path (edge) between cities i and j.
% w is the total length of a given path between k cities.
% S is a variable that includes 
%       as a first argument the number k of cities in the path  
%       as a second argument a partial path (ordered list of k integers in square brackets), 
%       as the last argument  the total length of this partial path.

% The initial path to try is the incomplete path with only 1 city [1].
% New cities will be added. 
% Once all n cities are touched, the path  will be compared to an initial best S 
which is [1,2,...n] with total length w(1,2)+w(2,3)+...+w(n-1,n).
% The algorithm is a recursive function. It will make (n-1)! calls to itself to search all possible paths.
		
w = w(1,2) + w(2,3) + w(3,4) + ... + w(n-1,n) + w(n,1)      
Best_S_so_far = (  n, [ 1, 2, 3, ... , n-1, n ], w )        
S = ( 1, [ 1 ], 0 )                                         
Search( S, Best_S_so_far )                                  
print Best_S_so_far
		
% Length initial best S
% Construct initial best S
% Initial path to try
% Search all paths iteratively for better S
% Print result
		
procedure Search( S, Best_S_so_far )

let ( k, [ i1, i2, ... , ik ], w ) = S
let ( n, [ i1B, i2B, ... , inB ], wB ) = Best_S_so_far 
if k = n then                                            
   new_w = w + w(ik,i1)                                 
   if new_w < wB then                                   
	Best_S_so_far = ( k, [ i1, i2, ... , ik ], new_w )
   end if
else
   for all j not in [ i1, i2, ... , ik ]   
        new_w = w + w(ik,j)
	New_S = ( k+1, [ i1, i2, ... , ik, j ], new_w )
	Search( New_S, Best_S_so_far )
   end for
endif
return
end
		
	      
	      
	      
	      
% we have a full path
% make the cycle complete
% If the new solution is better than the 
% previous, keep it, otherwise continue


% Incomplete path: 
% add a branch...

% and call search again
% ...for all cities not in current path
		
Cet algorithme n'est pas très efficace. Il fait (N-1)! appels recursifs à la procédure "Search". En pratique, il ne fonctionne plus dès N=15 (1012 chemins à vérifier). L'algorithme considère toutes les permutations de [1,2,...n] villes. Il fait donc deux fois trop de travail pour notre problème symmétrique (w(i,j)=w(j,i) dans l'algorithme, p. ex [1,2,...,n] est équivalent à [n,n-1,...,2,1]). On pourrait donc améliorer cet algorithme, mais le temps gagné ne serait que d'un facteur deux, gain de temps insuffisant pour notre problème.
Il existe des des algorithmes beaucoup plus efficaces qui fonctionnent jusqu'à N=15000.

Exercice 4-3 : Turing machine

Etat présent

Symbole présent

Ecriture

Déplacement

Nouvel état

1

0

b

r

1

1

1

b

r

1

1

b

b

r

2

2

*

*

H

2

Exercice 4-4 : Machine à états finis - parity checker

Pour que la machine fonctionne correctement, elle doit être dans l'état '1' lorsqu'elle lit le premier caractère.

Exercice 4-5 : Machine à états finis - parenthesis checker (vu au cours)


Il est impossible de généraliser cette machine pour un nombre arbitraire de paranthèses. En effet, pour vérifier un nombre connu n de jeux de parenthèses il faut n+2 états. Pour un nombre arbitraire inconnu de parenthèses il faut donc un nombre arbitraire inconnu d'états, ce qui est impossible avec une machine à états finis.