36
MAGIC KNIGHT TOUR Carrés d’Euler Yann DENEF - http://ydenef.free.fr/

MAGIC KNIGHT TOUR Carrés d’Euler

Embed Size (px)

DESCRIPTION

MAGIC KNIGHT TOUR Carrés d’Euler. Yann DENEF - http://ydenef.free.fr/. Placer les nombres de 1 à 64 dans un carré 8x8. Première contrainte : 2 nombres consécutifs sont séparés par un bond d’un cavalier du jeu d’échec i.e. une case alignée + une case sur le coté - PowerPoint PPT Presentation

Citation preview

MAGIC KNIGHT TOUR Carrés d’Euler

Yann DENEF - http://ydenef.free.fr/

Placer les nombres de 1 à 64 dans un carré 8x8

Pas de contraintes : 64! possibilités Nombre de solutions = 1,26 10+89

Estimation du nombre d’atomes dans l’univers = 10+80

1 6

2

5

3

4 Deuxième contrainte : trouver des chemins du cavalier particuliers

Chemins fermés : arrivée à un bon du départ Nombre de Chemins fermés = 1,3267364410532 10+13

Chemins magiques : la somme des nombres (numéro de bond) de chaque ligne et de chaque colonne vaut 260 i.e. 1/8*(1+2+…+63+64). Pas de solutions avec les diagonalesNombre de Chemins magiques = 140 dont 77 ouverts et 63 fermés (31 sur 63 distincts)

Chaque ¼ de l’échiquier est un carré magique (8 chemins) Diagonales valant 260 Chemins avec des points de passage imposés Chemins sans croisement (plus long chemin sans croisement = 35 bonds)

Première contrainte : 2 nombres consécutifs sont séparés par un bond d’un cavalier du jeu d’échec i.e. une case alignée + une case sur le cotéEstimation du nombre de chemins = 1,22 10+15.

Algorithme de recherche Principe de l’algorithme

le cavalier avance. Quand il est bloqué, il recule et prend une autre direction

Chaque case de l’échiquier est un objet possédant un ensemble de propriétés sa position sur l’échiquier, sa ligne, sa colonne sa couleur sur l’échiquier (noir ou blanc) ses voisins, ses voisins libres son état (libre ou occupé) sa position dans le chemin (1er bond, 2eme bond …) quand la case est occupée la case précédente dans le cas ou la case est occupée …

Un ensemble de méthodes demande d’autorisation d’avance sur la case demande d’un autre voisin de la case avance sur la case recule sur la case précédente affichage/effacement du numéro de bond ….

Des propriétés communes à toutes les cases fin du parcours connue valeur de la somme des lignes et des colonnes …

Algorithme L’algorithme de recherche repose sur 4 méthodes

IsFree() : retourne vrai si la case est une bonne candidate pour le chemin et faux dans le cas contraire. IsFree construit la liste des « bons voisins ». La notion de bon candidat dépend de l’objectif de la recherche : chemin simple, carrés magiques, chemins sans croisements, points de passage imposés … IsFree2() : semblable a IsFree mais n’est pas appelé en sortie de FirstStep(). La case appelée ne peut donc pas être un voisin de la fin du chemin FirstStep() : la case a préalablement accepté le bond. Elle passe de l’état libre à l’état occupée. Cette méthode retourne la première case candidate dans la liste des voisins NextStep() : demande à la case courante (case sur laquelle est le cavalier) un autre voisin, le voisin précédent ne convenant pas. Tous les chemins à partir du précédent voisin ont été essayés. Retourne toujours une case quitte à reculer (récursivité de la méthode entre cases)

L’algorithme travaille avec un coup d’avance IsFree() et IsFree2() analysent les caractéristiques des voisins, pas les caractéristiques courantes. Ces méthodes détectent les impasses et construisent la liste des voisins libres de la case sur laquelle on projette d’aller

FirstStep

IsFree

IsFree2

NNextStep

F= F2

F2

F

NS

F + F2

F2 Récursivité F + F2

Case de départ

Solution

Fin du parcours

Le même algorithme est utilisé pour rechercher différentes solutions chemins simples du cavalier sur l’échiquier chemins fermés, chemins imposés carrés magiques chemins dans un cube 4x4x4 chemins sans croisement ….

Seules, les méthodes IsFree, IsFree2, NextStep et FirstStep sont adaptées Polymorphisme de l’objet « case de l’échiquier » dont ces 4 méthodes

déterminent, en fonction de l’objectif, les conditions d’avance du cavalier

Algorithme Polymorphique

6 Cibles de recherche – 9 classes CcaseNB pour les recherches simples sans contraintes numériques

Intègre les points de passage et les chemins fermés grâce aux « blackListes »

CcaseNB_MAGIC pour les recherches de carrés magiques CcaseNB_CUBE pour les recherches de cubes magiques dans des cubes

4x4x4 CcaseNB_NoCross pour les chemins sans croisement CcaseA1,A8,H1,H8 pour les carrés semi magiques CcaseNB_DIAGONAL pour les cases des 2 diagonales (diagonales magiques)

Détections précoces des cas impossibles

Trous : aucun voisin Fins multiples : un seul voisin

case courante case suivante voisins de la case suivante

Analyse à un coup d’avance

Détecter au cours de l’avancée du cavalier ces 2 situations. Il faut compter les voisins des voisins !Une case qui n’ a qu’un voisin libre est la fin du parcours … et il n’y a qu’une seule fin

…Voire 2 ou 3 coups d’avance

64

28

X X

X X

XXX

Bond 28 sur case 41 écarté Bond 28 sur case 41 autorisé

64

Influence de la position du voisin … du voisin … du voisinCavalier sur la case 59. La case 30 (bond 8) est à 3 sauts de 59

28

X X

X X

X

L’ordre des voisins a une influence sur l’aspect général du parcours (tri dynamique à chaque bond)

Angle droit Angle obtus Angle aigu

LignesQuatre zones Deux zones

Aimanté par le bordAimanté par la 1er ligne

Points de passages imposés

Aléatoire

Chemin fermé Présentation du parcours

L’ordre des voisins a une influence sur l’aspect général du parcours (tri initial en début de parcours)

Sélection des points de passage Possibilité de choisir N points de passages (N<63)

Étape 1 choix de la case de départ par un clic gauche sur la case Étape 2 choix des points de passage par un clic droit: menu déroulant proposant la liste des valeurs de bonds possibles

(pairs ou impairs en fonction de la case de départ)

« Canalisation » du trajet, en case et en index, pour respecter les choix de passage

Empêcher un bond d’index choisi sur une autre case que celle sélectionnée Empêcher un bond sur une case choisie qui ne correspond pas à son index Détecter par avance les impossibilités de choix (cases trop éloignées …)

11

29

32

15

37

Graphe des traces d’entrée dans FirstStep

CARRES MAGIQUES

-------------------------|62|07|60|19|34|09|22|47|-------------------------|59|18|63|08|21|46|35|10|-------------------------|06|61|20|57|12|33|48|23|-------------------------|17|58|05|64|45|24|11|36|-------------------------|04|43|56|13|32|37|26|49|-------------------------|55|16|01|44|25|52|29|38|-------------------------|42|03|14|53|40|31|50|27|-------------------------|15|54|41|02|51|28|39|30|-------------------------

Critères de réduction de l’arbre de recherche

1. Détection des impasses dans le trajet du cavalier, basée sur le nombre de voisins restant de chacune des cases

2. Détection des lignes ou colonnes trop grandes (somme des index ne pouvant pas être plus petite que 260)

3. Détection des lignes ou des colonnes trop petites (somme des index ne pouvant pas être plus grande que 260)

Carrés Magiques

Plus ces détections sont précoces, plus la réduction de l’arbre de

recherche est importante

Création d’une « BlackListe » identifiant les cases où la fin n’est pas autorisée

La fin planifiée est déduite des bonds précédents et peut être identifiée sur une case, sur une ligne ou sur une colonne

A chaque instant il n’existe que 0 ou 1 case de fin planifiée

Fin topologique : cette case n’a plus qu’une seule case voisine. Quand on atteint cette case, on ne peut plus revenir en arrière. C’est la fin du parcours ; son index vaut donc 64

Fin arithmétique : cette case doit avoir un index de 64 pour que la somme des index de la ligne ou de la colonne qui la contient soit égale à 260. C’est donc la fin du parcours

La« BlackListe» relie les fonctions de détection de fin topologique et de fin arithmétique

Détection de la fin du parcoursLa détection de la fin de parcours est fondamentale et a une implication sur les 3 critères de réduction de l’arbre de recherche

Fonctions de détection de l’algorithmeToutes ces fonctions sont appelées

dans IsFree ou IsFree2

Si la fin de parcours n’est pas sur la ligne ou la colonne, la contrainte est plus importante

Les cases déjà choisies comme départ (et leurs symétries) sont exclues des fins possibles

Une case en blackListe ne peut pas être la fin du parcours

Si la fin de parcours est sur la ligne ou la colonne, la contrainte est plus importante

Si la fin topologique est connue, les critères de détection d’impasse sont plus sévères

Si la fin arithmétique est connue, les critères de détection d’impasse sont plus sévères

La liste des fins possibles est mise à jour

Détection de la fin de parcoursCritère topologique : détection de la finCritère arithmétique : fin imposée sur une caseCritère arithmétique : fin imposée dans une colonneFin connue : réduction de l’arbre de recherche

Détection d’impasseCritère topologique : détection impasse (trois fins)Critère topologique : détection d’impasseCorrélation entre critères arithmétiques et topologiques

Détection d’une ligne trop grandePosition de la fin non connuePosition de la fin connue

Détection d’une ligne trop petite

Mise en œuvre

Exemples de traitement

Position courante = 13(*)

Index prévu = 31

2 voisins « à 1 voisin » (cases 7 et 30)

2 autres voisins à plus de 1 voisin (19 et 23)

Détection de fin de parcours (1)

Critère topologique

Les deux voisins « à un voisin » peuvent être la fin du parcours. Le cavalier avance sur une case; l’autre case est identifiée comme la fin du parcours. Les deux autres voisins sont écartés

31

X X

32

(*) Les case sont numérotées de 0 à 63, ligne par ligne de gauche à droite et du bas vers le haut

fin

32

back

Position courante = 20 Index prévu = 27 colonne = 5 Somme des index sur la colonne = 78 (51+27) Valeur limite permettant de déduire la fin de parcours =

80 Case déduite pour la fin de parcours = 12 (seule case

pouvant accueillir un index pair)

Détection de la fin de parcours (2)

Critère arithmétique

Le bond avec l’index 27 permet de déduire la case de fin de parcours. Le cavalier avance; la case 12 est identifiée comme fin arithmétique.

Somme maximale des index dans les trous de la colonne 5

Fin de parcours pas connue : 182 (64 + 61 + 57) Valeur minimum admissible : 78 (260 -182) => OK

Fin de parcours connue ailleurs que sur la colonne : 180 (63 + 60 + 57) Valeur minimum admissible : 80 (260 – 180)

64

27

57

6163

60

back

Position courante = 27 Index prévu = 23

Analyse de la colonne 4 Somme des index sur la colonne 4 = 79 (23+56) Fin sur la colonne : valeur maximale pouvant être ajoutée 181 =

64+61+56 (ou 64+60+57) Fin hors colonne : valeur maximale possible admissible 179 =

63+60+56. La somme de la colonne doit être supérieure à 81 (260-179)

Détection de fin de parcours (3)

Fin localisée sur une colonne

Le bond avec l’index 23 permet de déduire la colonne dans laquelle se trouve case de fin de parcours. Le cavalier avance; la fin est mémorisée dans la colonne 4.

23

61

56

64

63

60

back

Position courante = 46 Index prévu = 24 Fin préalablement détectée = 8

1 voisin « à 1 voisin » (case 63)

4 autres voisins à plus de 1 voisin

Réduction de l’arbre de recherche

Critère topologique

Les quatre voisins « à plusieurs voisins » sont écartés. Le cavalier avance sur la case 63, seule case permettant d’éviter de définir deux fins distinctes du parcours

24

X

64

back

X

X

X

25

Position courante = 42 Index prévu = 28 Fin préalablement détectée = 1

2 voisins « à 1 voisin » (cases 32 et 36 )

4 autres voisins à plus de 1 voisin

Détection des fins multiples

Critère topologique

Le cavalier recule pour éviter une position impliquant plusieurs fins de parcours

back

28

64

X X

X X

XXX

Position courante = 53 Index prévu = 30

2 voisins « à 1 voisin » (cases 38 et 63)

Détection d’une impasse

Critère topologique

Aucun des voisins ne convient (même couleur que le départ donc fin de parcours impossible, cases « Blacklistées »). Le cavalier recule

3032

64

X

X

back

X

Position courante = 20 Index prévu = 27

Analyse de la colonne 5 Somme des index sur la colonne = 78 (51+27) Case déduite pour la fin de parcours = 12 (la somme des Index est

inférieure à 80)

2 voisins « à 1 voisin » (cases 3 et 5)

Corrélation entre fins de parcours

3 fins distinctes, 1 arithmétique et 2 topologiques

Il y a trois fins distinctes. Le cavalier recule

27

64

back

X

X X

Position courante = 59 Index prévu = 33

Analyse de la ligne 1 Distance entre ligne et case courante = 7 Somme des index sur la ligne 1 = 53 Valeur minimale pouvant être ajoutée 209 = 37+40+42+44+46 Valeur maximale admissible 51 (260-209)

Détection d’une ligne trop grande (1)

Prise en compte de la distance entre lignes et case courante

La somme des index de la première ligne est trop grande (53 pour une valeur maximale autorisée de 51). Le cavalier recule.

33

42 37 4046 44

back

X

Position courante = 39 Index prévu = 30 Fin topologique = 58

Analyse de la ligne 8 Distance entre ligne et case courante = 3 Somme des index sur la ligne = 118 (64+54) Valeur minimale pouvant être ajoutée 144 = 33+35+37+39 Valeur maximale admissible = 116 (260 – 144)

Détection d’une ligne trop grande (2)

Fin topologique fixée

La somme des index sur la ligne 8 est trop grande (118). La connaissance de la position de fin de parcours est exploitée. Le cavalier recule.

30

64 353339 37

back

X

Position courante = 13 Index prévu = 33 Fin topologique = 24

Analyse de la ligne 2 Somme des index sur la ligne = 75 (42+33) Valeur maximale pouvant être ajoutée 181 = 63+60+58 Valeur minimale admissible 79 (260-181)

Détection d’une ligne trop petite

Fin topologique fixée sur une ligne différente

La somme des index sur la ligne 2 est trop petite (75 au lieu de 79). Le cavalier recule

33

64

636058

back

X

Les valeurs minimales et maximales admissibles sur les lignes ou sur les colonnes sont calculées une fois pour toute à l’initialisation

Elles dépendent pour les valeurs min et max De la topologie d’occupation de la ligne/colonne

De la couleur de la case de départ De la connaissance ou non de la fin de parcours Elles dépendent pour les valeurs max De la distance de la case courante à la ligne/colonne testée De l’index courant

Test des valeurs maximales (tableau à 3 entrées – 8x64x255 éléments) – test sur les 8 lignes et 8 colonnesMagicRowVal[row] > Sigma8_NG_Row[dist[row]][IndexP1][MagicRow[row]]

Test des valeurs minimales (double indirection) – test ligne/colonne couranteMagicRowVal[row] < (**MBlocageRow)[MagicRow[row]]

Règles arithmétiques

1019 481116 59

6 pointeurs sur les tableaux•3 pour les lignes •3 pour les colonnes

4 tableaux de référence (256 entrées)•2 quand la fin n’est pas connue•2 quand la fin est connue

Fin de parcours et valeurs minimales Les valeurs minimales admissibles sur une colonne dépendent de la topologie de

remplissage de la colonne et de de la connaissance de la fin de parcours

Max 64

Max 63

Max 64

Max 63

Certaines cases de l’échiquier ne peuvent pas être la fin de parcours : elles sont « blacklistées » Par construction : les couleurs des cases de départ et d’arrivée sont différentes (blanche et noire) Par configuration :

On peut souhaiter imposer la case de fin de parcours, donc exclure de la liste de fin toutes les autres cases On peut souhaiter exclure certaines cases de la liste des fins possibles (optimisation de la recherche en exploitant les résultats des recherches précédentes à

partir d’une autre case de départ)

INIT Blzero (Blackliste initiale) est un tableau de 64 éléments représentant les 64 cases Blzero depend de la case départ : 32 candidats seulement pour la fin de parcours Blzero est mis à jour en éliminant les départs des runs précédents et leurs symétries Blzero est exploité pour l’identification de la « case fin de parcours » plutôt que de la « barre fin de parcours »

La « BlackListe  » varie au cours de la progression du cavalier en fonction des propriétés déduites de la fin de parcours planifiée

Colonne ou case ?

L’index 23 sur la case 27 impose la fin sur la colonne 42 cases candidates

Si la case 3 est Blacklistée, la fin est sur la case 51

BL

Objectif 1 : évaluer simplement les impacts des options de l’algorithme sur le temps de recherche

Objectif 2 : développer un programme performant exploitant les nouveaux processeurs multi-cœurs

Mise en œuvre de l’algorithmique2 objectifs donc 2 programmes … avec le même cœur

Offrir une interface graphique intuitive dans une technologie Composant (ActiveX)

Permettre le paramétrage du type de recherche, des options de l’algorithme …

Enregistrer et présenter les données caractérisant les performances de l’algorithme

Code source : 35 000 LoC

Configuration : algorithme et résultats

Choix de la recherche

Interdit certaines fins de parcoursChaque case choisie génère par symétrie 4 ou 8 cases blacklistées

Influence dynamiquement l’aspect du parcours

Réglage des paramètres de l’algorithme

Influence statiquement (au lancement du programme) l’aspect du parcours

Illustration de ce qu’il ne faut pas faire !

Résultats stockés dans c:\tmp\MAGICAL3 lorsque le répertoire existe

ActiveX Kmagic in action

Time

Index

Time

Index

Time

Events

class KCtrl : public COleControlCLSID : {00865686-E835-11D3-94A2-D550217BD144}

DoPropExchangeOnDraw…OnClickOnReset PowerPoint

Conteneur ActiveX

Kmagic : 5 entrées dans la Registry sous HKEY_CLASSES_ROOT Typelib information Class information Primary Dispatch interface Event interface Property Page

*.exd cache in tmp directorySupport of Library MSForms : C:\Windows\SysWOW64\FM20.DLL (VBA control)

Event uuid

Methods

Properties

Dispatch uuid

RecordCurrent

Aigu

Obtus

Droit

L2

L3

Launch

case départ

profondeur

Magic

Diagonal Magic

Semi Magic

CloseTour

Toogle Display

No Cross

Cube

Exemple de gain en utilisant les BlackListesDépart case 18

Les 4 coinsen BlackListe

Temps : 35039 sec.

BlackListe vide Temps : 50124 sec.

24 cases en BlackListe

Temps : 28880 sec.

1. Suppression de l’interface graphique Résultats affichés dans une fenêtre DOS et stockés dans des fichiers Algorithme extrait du contexte ActiveX

2. Simplification des appels de méthode Plus de méthodes virtuelles : IsFree(),IsFree2(),NextStep(),FirstStep() Fonctions en « inline » dans la boucle de recherche

3. Programmation multi-threads Indépendance des variables entre threads Configuration du nombre de cœurs (Support jusqu’ à 12 cœurs) Exploitation des multi-cœurs laissé à l’OS (pas d’utilisation de librairies

spécifiques MT … hormis CreateThread())

Deuxième programme pour un objectif de performance

Gain performance : 20%

Gain performance : 65%4 thread en // sur i3 M370

Résultats - Intel(R) Core(TM) i3 CPU M 370 @ 2.40GHz

Départ case 18

Recherche exhaustive de carrés magiques : 14 solutions

ActiveX

Kmagic : 50124 sec

Kmagic : 35039 sec (BL 0)

Kmagic : 28880 sec (BL 0,1,9,11)

Objectif performance

Ascii 1 thread (BL 0) : 28012 sec

Ascii 4 threads (BL 0) : 8714 sec

Résultats Carrés Magiques

Les 140 solutions sont trouvées en 3,9 jours

Le « temps apparent » moyen de la boucle est inférieur à 80 nano secondes

Intel(R) Core(TM) i3 CPU 2330 @ 2.20GHz4 threads parallèles

Certaines solutions sont trouvées 2 fois (fin de parcours symétrique par rapport au début de parcours)