MAGIC KNIGHT TOUR Carrés d’Euler
-
Upload
xanthus-mullen -
Category
Documents
-
view
60 -
download
0
description
Transcript of MAGIC KNIGHT TOUR Carrés d’Euler
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)