Twinwidth (Projet Programmation L3 MIAGE 2023-2024)

En quelques mots:

Le but de ce projet est de participer à la track heuristic du challenge PACE pour le problème de graphe Twinwidth en proposant un algorithme pour le résoudre.

Dates

Twinwidth

Dans un graphe non-orienté, plusieurs “mesures” peuvent être définies. Ce projet propose de travailler autour de la “Twinwidth”. Voir cet article de vulgarisation ou celui-ci ou encore wikipedia.

Pour calculer la Twinwidth, on va effectuer une séquence de contractions de paires de sommets jusqu’à arriver à un seul sommet. Durant les contractions, on va se souvenir des “erreurs” effectuer. Pour cela, on va utiliser un tri-graphe, c’est à dire un graphe pouvant avoir des arêtes classiques et des arêtes rouges.

Dans l’exemple, on commence par contracter les sommets e et f. Ceci a pour effet de créer un “nouveau” sommet ef. L’arête avec c reste noire car il y avait une arête entre c et chacun des sommets contracté. Ce n’est pas le cas pour a et d : on se souvient de cette erreur en liant a et d avec ef à l’aide d’une arête rouge. Note : dans le cadre du projet, le sommet ef n’est pas créé : c’est le sommet e qui reste dans le graphe et le sommet f est supprimé (voir ici, l’opération n’est donc pas symétrique). On continue ensuite en contractant a et d et ainsi de suite.

La twinwidth d’un graphe est le degré rouge d’un sommet au cours de la séquence de contractions (dans l’exemple, c’est 2). Le nom twin vient de la notion de jumeaux (twin) dans un graphe : deux sommets sont jumeaux s’ils ont le même voisinage : contracter ces 2 sommets ne crée aucune arête rouge.

On se propose de résoudre ce problème dans ce projet, dans le cadre d’un challenge international.

Ce problème est dit difficile à résoudre optimalement (NP-complet). Nous verrons donc des heuristiques, donnant une solution sans garantie d’optimalité. Une manière (bête) pour faire cela de manière non optimale consiste à contracter aléatoirement des paires de sommets jusqu’à n’avoir plus qu’un seul sommet. Evidement, cette heuristique ne permet pas de trouver la twinwidth optimum.

Le but de ce projet est de proposer et implémenter un (ou plusieurs) algorithme heuristique non trivial proposant une solution réalisable pour ce problème. C’est à dire qu’il n’est pas demandé d’avoir une solution forcement optimale, mais une solution valide : votre algorithme doit forcement produire une séquence de contractions valides. On souhaite toutefois avoir la solution la plus petite possible (ce qui donnera un classement). En plus de la plateforme optil.io, je lancerai de temps en temps un script testant vos projets dont la sortie se trouvera ici.

Ce qui est attendu

Obligatoirement

Une exécution typique de votre programme pourra être:

cat file1.gr | python3 programme.py > solution

ou encore

python3 programme.py < file1.gr > solution

Pour tester le principe du signal, par exemple (envoie un signal SIGTERM après 10 secondes):

timeout 10s python3 programme.py < file1.gr > solution

Optionnellement

Rendu

L’utilisation du GIT de github classroom est imposée. S’inscrire ici. Tous vos dépôts seront automatiquement clonés au moment de la deadline et la note se basera sur cet état. Il ne servira donc à rien de continuer à modifier votre code après la deadline.

Le projet est à faire seul.

Utilisez le canal Teams pour toute question relative au projet.

Il est attendu sur le Git :

Vous avez le droit de discuter entre vous et de lire des articles, mais vous devez préciser ce qui n’est pas de vous. Les idées ou le code provenant de ChatGPT (ou similaire) devront être mentionnées. Un détecteur de plagiat de code sera utilisé.

La note finale prendra en compte votre classement dans le challenge.

Je sais que ce n’est pas un projet facile mais je crois en vous, bon courage!