Pour effectuer le produit de 4 matrices réelles de taille respective 10x20, 20x50, 50x1 et 1x100, il est possible de commencer par n'importe lequel des 3 produits, étant donnée l'associativité du produit matriciel. Rappelons également que le produit d'une matrice pxq par une matrice qxr donne une matrice pxr. Si le produit d'une matrice pxq par une matrice qxr demande p.q.r opérations scalaires, il est possible de calculer le coût de chaque possibilité.
|
|
|
|
|
| (10x20, 20x50): 10000 | (10x50, 50x1): 500 | (10x1, 1x100): 1000 |
|
| (50x1, 1x100): 5000 | (10x50, 50x100): 50000 |
|
|
| (20x50, 50x1): 1000 | (10x20, 20x1): 200 | (10x1, 1x100): 1000 |
|
| (20x1, 1x100): 2000 | (10x20, 20x100): 20000 |
|
|
| (50x1, 1x100): 5000 | (10x20, 20x50): 10000 | (10x50, 50x100): 50000 |
|
| (20x50, 50x100): 100000 | (10x20, 20x100): 20000 |
|
Remarque complémentaire:
Dans le cas général, si l'on a à faire le produit de matrices pxq, qxr et rxs, il faudra commencer par le premier si pqr+prs < qrs+pqs, c'est à dire si 1/p + 1/r > 1/q + 1/s. L'heuristique gloutonne n'est donc pas équivalente à celle consistant à effectuer d'abord le produit qui "élimine" la plus grande dimension de matrice. Un contre exemple simple est le produit 6x15, 15x20 et 20x10.
Une machine de Turing réalisant
une soustraction peut être construite en suivant les conventions
que nous avons utilisées dans le cours. Il est nécessaire
ici de prévoir un symbole non terminal afin de détecter
la fin de la soustraction:
On peut alors essayer cette machine sur la chaine ...BBaaaaaBaaaBBB..., la lecture commençant par la droite. Merci à Cécile Janvier, qui m'a signalé une erreur dans la première version du corrigé.
Dans l'état q4, si c'est B, c'est qu'il n'y a plus de "a" entre les "1" et les "B" separateurs. Donc c'est le moment de terminer le calcul. Sinon, il y a encore un tour a faire.
Soient un ensemble de villes et D la
table des distances entre ces villes. Ce problème est,
comme nous allons le voir, assez semblable au problème
du produit de matrices. Mais nous utilisons cette fois ci une
heuristique dite "locale" qui consiste à améliorer
une solution initiale en la modifiant.
Cette heuristique donne en général des solutions assez bonne à ce problème, connu sous le nom de problème du voyageur de commerce.
Les algorithmes récursifs quefaisje(n)
et etmoidonc(n) représentent des fonctions
prenant un nombre entier comme argument et renvoyant un autre
nombre entier.
fonction quefaisje(n) si n < 0 ^0 sinon si n pair ^quefaisje(n/2) sinon ^1 + quefaisje((n-1)/2) |
fonction etmoidonc(n) si n < 0 ^0 sinon selon (n modulo 4) 0: ^etmoidonc(n/4) 1: ^1 + etmoidonc((n-1)/4) 2: ^1 + etmoidonc((n-2)/4) 3: ^2 + etmoidonc((n-3)/4) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Question subsidiaire facultative:
La valeur renvoyée par ces fonctions pour n = p.q+r, si q est une puissance de 2 et r<q, est égale à f(p)+f(r). On en déduit alors que ces fonctions calculent le nombre de 1 dans la représentation de n en base 2.
retour à l'énoncé.