Notice: Undefined property: JDocumentHTML::$base in /var/www/http/faf/libraries/joomla/document/document.php on line 677
Les positions possibles

Les positions possibles

Introduction



Le problème à résoudre est le suivant : trouver le nombre de positions différentes à Diplomatie après le Printemps 1901.

Impossibilité d'une approche naïve



On devine aisément que le nombre en question est vertigineux. En effet, il y a sur la table exactement 22 unités (6 pays en possèdent 3 et 1 en possède 4). Si elles peuvent se rendre à 5 endroits (environ) chacune, on pourra atteindre l'ordre de grandeur de 5^22 = (arrondi par défaut) 2.38 x 10^15 [[Un calcul manuel plus précis par une tierce personne donne (arrondi par défaut) 6.09 x 10^15]]. Il n'est donc pas question d'utiliser cette approche directe consistant à produire cette liste, la place occupée sur disque déborderait de celle de tout micro-ordinateur du commerce.

Pas question non plus d'énumérer les ordres possibles, appliquer un arbitre électronique, obtenir ainsi une position que l'on insère dans une liste dont on élimine soigneusement les doublons. Un arbitre électronique tout à fait honnête réalisant 1000 arbitrages à la seconde consommerait un temps tel qu'il faudrait passer la consigne aux générations futures de recueillir le résultat.

Etape 1 : par pays



Comme tout problème combinatoire, il faut le décomposer, on va donc commencer par lister les positions de départ par pays. On peut déjà constater que tout jeu d'ordre peut être écrit de manière « canonique ». Que signifie cela ? Que l'on peut classer les ordres en deux catégories :
- les ordres de mouvements couronnés de succès à l'issue de la résolution,
- les autres.

Si on change tous ces derniers (les ordres qui n'ont pas été arbitrés par un mouvement) par un ordre de tenir sur place, et si on laisse les autres, on obtient alors exactement le même résultat.

Quelles sont les possibilités pour une unité donnée ? Rester sur place, se rendre sur une zone accessible. On parlera de zone pour distinguer les trois zones suivantes : STPCS, STPCN, STP. Ces trois zones restent rattachées à une seule région, STP. Dans la grande majorité des cas, la région attachée garde le même nom que la zone.

On récupère une liste de voisinages par flotte et une liste de voisinages par armée (tout programme d'arbitrage de Diplomatie en possède nécessairement une)

Voici un extrait du fichier déclarant les voisinages :

(ARMEEVOISIN MON GRE)

(ARMEEVOISIN MON SER)

(ARMEEVOISIN MON TRI)

(ARMEEVOISIN ANK CAU)

(ARMEEVOISIN ANK CON)

(ARMEEVOISIN ANK SMY)

(ARMEEVOISIN APU NAP)

On utilise ces voisinages pour obtenir, pour chaque unité, toutes ses nouvelles positions possibles (sous forme de zone), et donc, pour un triplet (quadruplé) d'unités, en combinant toutes les positions des unités du pays sous forme « brute ». Bien entendu, une flotte utilise les « FLOTTEVOISIN » et une armée les « ARMEEVOISIN ».

Il faut cependant purger cette liste en ne conservant que les cas où les trois (quatre) unités occupent des régions distinctes, ce qui est assez facile. Notre distinction entre zone et région est là opportune, car elle permet de refuser le résultat de F STPCS T, A MOS - STP qui conduit à deux unités sur la région STP. Un autre cas de figure est moins immédiat, mais doit aussi être purgé de la liste. On définit que des mouvements sont en opposition s'ils sont effectués par deux unités (voisines) dont chacune cherche à prendre la place de l'autre, ou plus précisément à venir dans la région qu'occupe l'autre. Un exemple simple est A ROM - VEN, A VEN - ROM. Il faut donc encore écarter de notre liste les combinaisons comportant des mouvements en opposition.

Le résultat est-il alors le bon ? Non, car nous pouvons ainsi produire des doublons. Voici deux séquences d'ordres canoniques produisant des situations doublons, c'est à dire identiques : A VEN - ROM, A ROM - TOS et A ROM T, A VEN - TOS. Il n'est en effet pas inscrit sur les unités le nom de leur emplacement d'origine.
Cette dernière purge nous permettra d'obtenir un résultat correct, confirmé par d'autres sources du zine VOPALIEC [[Vopaliec, zine papier français consacré à Diplomatie et d'autres jeux, disponible auprès de [Jean Pierre Maulion->mailto:Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. ] ]].

Voici le nombre de déploiements possibles par pays :

|Russie|425|
|Allemagne|160|
|Italie|98|
|Autriche|97|
|France|93|
|Angleterre|88|
|Turquie|40|

On remarque au passage que ces données confirment une vague opinion admise que la Turquie est un pays simple, et l'Allemagne un pays compliqué. La Russie, forte de ses 4 unités, peut donc se déployer de plus de manières, mais son cas n'est pas comparable.

Etape 2 : par groupe de pays



Fort de notre liste de déploiements par pays, reste à poursuivre en cherchant à regrouper plusieurs pays. Dans l'absolu, si ces 7 pays n'interagissaient pas, la solution serait simplement le produit des ces 7 valeurs, à savoir environ 425 x 160 x 98 x 97 x 93 x 88 x 40 = (arrondi par défaut) 2.11 x 1014. Bien entendu certaines incompatibilités sont évidentes, entre deux pays suffisamment voisins, comme l'Angleterre et la France, le déploiement MAN, EDI, YOR de cette première ne peut cohabiter avec le déploiement MAN, PAR, TOU de cette dernière.

On pourrait (et on l'a fait) calculer le nombre d'incompatibilités pour chacun des (7 x 6) / 2 = 21 paires de pays, multiplier chaque résultat par le produit des déploiements possibles pour les 5 autres pays. En retranchant ensuite la somme de toutes ces incompatibilités du produit de tous les déploiements possibles, on obtiendrait un résultat assez voisin de la solution, mais tout de même erroné, parce que l'on aurait retranché au moins deux fois (donc une de trop) un 7-uplet de déploiements présentant des incompatibilités sur deux paires de pays d'intersections non vides. On appellera par la suite cette méthode la « mauvaise méthode ».

Après avoir bien observé la carte de Diplomatie, on va regrouper nos pays de la manière suivante :



Pour calculer le nombre de déploiements possibles pour deux pays, on produit tous les couples possibles, puis on réalise les mêmes purges que si toutes les unités étaient du même pays, dont on fera l'économie d'une répétition. La purge écartant le cas où des unités de même type ont interverti leurs positions n'est cependant pas à réaliser, en effet, d'une part elles ne sont pas de même nationalité donc distinctes, d'autre part cet état de fait est impossible (seules les armées de VEN et TRI pourraient être échangées, ce qui est impossible car cela nécessiterait des mouvements en opposition) [[Noter d'ailleurs au passage que les seuls conflits d'opposition possibles sur toute la carte sont entre VEN et TRI, et notre purge des oppositions avait donc soigneusement écarté ((Italie : VEN - TRI, ROM T, NAP T), (Autriche : TRI - VEN, VIE T, BUD T)).]].

On trouve ainsi :
- 7700 déploiements pour Angleterre et France;
- 7138 déploiements pour Italie et Autriche ;
- 13 271 déploiements pour Russie et Turquie.

Reste à composer Italie, Autriche avec Allemagne, opération délicate puisque le produit des possibles est de 7 138 x 160 = 1 142 080. Purger ce million d'éléments est possible, mais il faut quelque peu optimiser le traitement, on économise donc déjà la vérification des conflits d'oppositions qui ne peuvent pas se produire entre des unités allemandes d'une part, italienne ou autrichiennes d'autre part.

Pour aller encore plus vite (car la lourdeur du calcul l'exige), on se limite à vérifier entre les éléments suivants :
- (Italie, 3ème unité) et (Allemagne, 3ème unité)
- (Autriche, 2ème unité) et (Allemagne, 3ème unité)

En effet, on a repéré les possibilités de conflits dans le tableau suivant :

|Pays|1ère unité|2ème unité|3ème unité|
|Italie|NAP|ROM|VEN => ALP|
|Autriche|TRI|VIE => ALP, BOH|BUD|
|Allemagne|KIE|BER|MUN => ALP, BOH, SIL|

De ces 1 142 080 éléments, seuls 1 023 641 restent après la purge.

On conserve donc soigneusement dans trois fichiers les déploiements possibles pour ces trois sous-ensembles de pays, et on va maintenant chercher le nombre de solutions de notre problème.

Etape 3 : partitionnement des sous-ensembles



Cette dernière étape sera un peu plus laborieuse. Rappelons d'abord la définition du partitionnement d'un ensemble : c'est lui trouver des sous ensembles vérifiant les trois propriétés suivantes :
- Aucun n'est vide,
- leur réunion est l'ensemble de départ,
- ils sont disjoints deux à deux.

Etudions d'abord les déploiements de Angleterre, France. C'est en BOU et PIE qu'ils interfèrent avec le reste de l'Europe et de manière indépendante.

Notre partition aura donc 4 éléments :

|Repère|BOU|PIE|Nombre|
|A1|Oui|Oui|418|
|A2|Oui|Non|2244|
|A3|Non|Oui|1408|
|A4|Non|Non|3630|

Etudions ensuite les déploiements de Russie, Turquie. C'est en GAL, PRU et SIL qu'ils interfèrent avec le reste de l'Europe, et de manière dépendante cette fois. C'est l'unité en VAR au départ qui cause ce conflit, les occupations sont donc incompatibles deux à deux.

Notre partition aura donc 4 éléments :

|Repère|VAR ?|Nombre|
|B1|GAL|2634|
|B2|PRU|2634|
|B3|SIL|2634|
|B4|Æ|5369|

Etudions enfin les déploiements de Allemagne, Autriche, Italie. C'est en PIE, BOU, GAL, PRU et SIL qu'ils interfèrent avec le reste de l'Europe, et de manière presque indépendante. Nous expliquerons ce « presque » ultérieurement

Notre partition aura donc 32 éléments :

|Repère|PIE|BOU|GAL|SIL|PRU|Nombre|
|C1|Oui|Oui|Oui|Oui|Oui|80|
|C2|Oui|Oui|Oui|Oui|Non|3192|
|C3|Oui|Oui|Oui|Non|Oui|3192|
|C4|Oui|Oui|Oui|Non|Non|7980|
|C5|Oui|Oui|Non|Oui|Oui|0|
|C6|Oui|Oui|Non|Oui|Non|8250|
|C7|Oui|Oui|Non|Non|Oui|8250|
|C8|Oui|Oui|Non|Non|Non|20625|
|C9|Oui|Non|Oui|Oui|Oui|3192|
|C10|Oui|Non|Oui|Oui|Non|17140|
|C11|Oui|Non|Oui|Non|Oui|17140|
|C12|Oui|Non|Oui|Non|Non|29550|
|C13|Oui|Non|Non|Oui|Oui|8250|
|C14|Oui|Non|Non|Oui|Non|42262|
|C15|Oui|Non|Non|Non|Oui|42262|
|C16|Oui|Non|Non|Non|Non|71280|
|C17|Non|Oui|Oui|Oui|Oui|0|
|C18|Non|Oui|Oui|Oui|Non|9228|
|C19|Non|Oui|Oui|Non|Oui|9228|
|C20|Non|Oui|Oui|Non|Non|23070|
|C21|Non|Oui|Non|Oui|Oui|0|
|C22|Non|Oui|Non|Oui|Non|22158|
|C23|Non|Oui|Non|Non|Oui|22158|
|C24|Non|Oui|Non|Non|Non|55395|
|C25|Non|Non|Oui|Oui|Oui|9228|
|C26|Non|Non|Oui|Oui|Non|47108|
|C27|Non|Non|Oui|Non|Oui|47108|
|C28|Non|Non|Oui|Non|Non|79320|
|C29|Non|Non|Non|Oui|Oui|22158|
|C30|Non|Non|Non|Oui|Non|108276|
|C31|Non|Non|Non|Non|Oui|108276|
|C32|Non|Non|Non|Non|Non|178365|

Des cas impossibles (nombre = 0) sont restés dans notre partitionnement. Le premier rencontré, par exemple, correspond à une unité en PIE, BOU, SIL et PRU, et pas d'unité en GAL. C'est BER et MUN qui peuvent occuper PRU, SIL et BOU, et occuper les trois à la fois pour ces deux unités est impossible. La présence de ces cas impossibles résulte du petit manque d'indépendance des combinaisons. Nous pouvons les laisser car ils ne gênent pas la suite des calculs, bien qu'un « bon » partitionnement ne tolère pas d'ensembles vides.

On en profite pour vérifier au passage que la somme des nombres d'éléments pour chaque partitionnement fournit bien le nombre d'éléments total de l'ensemble partitionné.

Etape 4 : décompte exhaustif



Il faut maintenant combiner toutes ces possibilités. On peut se trouver dans 4 x 4 x 32 = 512 cas différents, certains sont plausibles (s'il n'y a aucun conflit), les autres ne le sont pas. Pour chaque triplet différent, le produit des trois nombres donne une valeur, et ce sont ces valeurs qu'il faut ajouter pour obtenir notre résultat.
Voici un exemple de combinaison possible et un exemple de combinaison impossible :
- A4, B6, C32 est possible, aucun conflit.
- A2, B3, C8 est impossible, car il y a un conflit sur BOU.

On liste donc les 512 cas de figure différents, et on ne sélectionne que ceux pour lesquels il n'y a pas conflit.

Concrètement, l'absence de conflit signifie que :
- BOU n'est pas occupé à la fois dans France, Angleterre et Allemagne, Italie, Autriche.
- PIE n'est pas occupé à la fois dans France, Angleterre et Allemagne, Italie, Autriche.
- SI VAR est allée en GAL dans Russie, Turquie, GAL n'est pas occupé dans Allemagne, Italie, Autriche
- SI VAR est allée en SIL dans Russie, Turquie, SIL n'est pas occupé dans Allemagne, Italie, Autriche
- Si VAR est allée en PRU dans Russie, Turquie, PRU n'est pas occupé dans Allemagne, Italie, Autriche

On obtient donc une liste de 180 triplets, il faut donc réaliser les 180 produits, puis la somme des 180 résultats.

Le résultat obtenu est donc : 74 980 036 938 664.

(ou, en français, environ soixante-quinze mille milliards, en notation scientifique (arrondi par défaut) 7.49 x 10^13)

Récapitulation et comparaison des estimations successives (arrondis par défaut) :

|Résultat par la« mauvaise méthode »|7.47 x 10^13|
|Résultat|7.49 x 10^13|
|Estimation à partir des déploiements par pays|2.11 x 10^14|
|Estimation grossière à partir des ordres|2.38 x 10^15|

Détails techniques



Les énumérations ont été réalisées grâce à plusieurs petits systèmes experts dont le moteur était une réalisation personnelle [[Réalisation antérieure à la résolution de ce problème.]] de l'auteur (développée sous LINUX en Langage C). Ce moteur de système expert rustique avec variable utilise un sous-ensemble de la syntaxe OPS5. Il permet d'écrire typiquement des règles de la forme [[Noter le « ? » précédant les variables.]] :

Exemple d'inférence:

|Base de règles|Base de faits initiale|Fait résultant de l'inférence|
|Si (pere ?x ?y)
(pere ?y ?z)
alors (grand_pere ?x ?z)|(pere Jeremie Michel)
(pere Michel Paul)|(grand_pere Jeremie Paul)|

L'algorithme RETE [[Conçu par C. Forgy en 1982.]] y est implémenté de manière standard, il permet d'optimiser fortement les calculs aux prix d'une très forte occupation de la mémoire. L'utilisation du prédicat « DIFF » a servi par exemple à détecter les triplets de zones d'arrivé des unités d'un pays pour lesquels les 3 régions correspondantes sont bel et bien distinctes.

A chaque problème correspond une base de règle et une base de faits spécifique, l'inférence produisant les résultats escomptés. Programmer la résolution d'un problème avec un système expert est pratique, convivial et rapide.

Lorsque qu'il a fallu juste compter le nombre de chaque élément des partitions, ce sont les appels systèmes UNIX « grep » (recherche de chaîne de caractère dans un fichier, avec l'option « -v » pour une recherche inversée) et « wc » (compte du nombre de lignes, mots et caractères) qui ont été mis à contribution.

Voici un exemple de recherche dans l'ensemble des déploiements Allemagne, Italie, Autriche correspondant au cas C20 [[Pour la compréhension des lecteurs non familiers d'UNIX, le signe « | » permet de rediriger la sortie d'un processus dans l'entrée d'un autre, et la commande « cat » liste le contenu d'un fichier.]] :

cat italautall.txt | grep -v PIE | grep BOU | grep GAL | grep -v SIL | grep -v PRU | wc

Lorsqu'il a fallu réaliser 180 produits puis une somme de 180 termes, c'est EXCEL qui s'est chargé de l'opération, et encore de manière très conviviale. Un copier/coller dans un fichier texte sur PC du résultat de l'inférence, puis une importation de ce fichier texte dans un classeur EXCEL, une cellule (au sens EXCEL) de calcul de produit (dupliquée ensuite 179 fois), et une cellule réalisant la somme des 180 produits, et le tour est joué.

Conclusion



Le problème de trouver le nombre total de positions possibles en est un autre, plus mathématique, qui pourra faire l'objet d'une étude ultérieure. La méthodologie mise en place pourrait résoudre les casse-tête liés aux positions de Diplomatie publiés de ci delà (reconstitution d'une partie à partir d'informations incomplètes.) Enfin les listes de positions possibles par pays produites pourraient aussi servir à re-visiter la théorie des ouvertures.

Je serai ravi de toute confirmation de ce résultat par une autre personne pour le valider de manière définitive ...

Jérémie LeFrançois











Additional information