One-sided crossing minimization problem (Projet Algo des graphes L3 MIAGE 2024-2025)

En quelques mots:

Le but de ce projet est de participer à la track heuristic du challenge PACE pour le problème de graphe One-sided crossing minimization (OCM) en proposant un ou plusieurs algorithmes pour le résoudre.

Dates

One-sided crossing minimization

Nous considérons dans ce projet des graphes non-orientés bipartis dont les sommets sont répartis en deux couches horizontales A et B. La couche A est fixée et le but est de trouver la permutation des sommets de la seconde couche B de manière est minimiser le nombre de croisements d’arêtes.

Ce problème est une brique de base de problèmes plus généraux de dessin de graphes hierarchiques dans le plan.

Exemple d’une instance : les sommets de A sont fixés. La première permutation des sommets de B induit 33 croisements d’arêtes, la seconde seulement 17.

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 à ordonner les sommets de la seconde couche (B) de manière aléatoire. Evidement, cette heuristique ne permet pas de trouver le nombre de croisements optimum.

Le but de ce projet est de proposer et implémenter un (ou plusieurs) algorithme heuristique non trivial (originaux et efficaces) 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. On souhaite toutefois avoir la solution la plus petite possible (ce qui donnera un classement). En plus de la plateforme optil.io (voir plus loin), je lancerai de temps en temps un script testant vos projets dont la sortie se trouvera ici.

Note : l’arête ab croise l’arête uv si a < u et b > v ou si u < a et v > b.

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 LLMs devront être mentionnées. Un détecteur de plagiat de code sera utilisé.

La note finale prendra en compte largement votre score dans le challenge.

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