<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wiki-lama</id>
	<title>Wiki du LAMA (UMR 5127) - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wiki-lama"/>
	<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Sp%C3%A9cial:Contributions/Wiki-lama"/>
	<updated>2026-04-10T22:18:25Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=16174</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=16174"/>
		<updated>2026-01-07T16:27:04Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Filage d&amp;#039;image et tracé de droites pour un rendu artistique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2024--2025: Pierre Hyvernat&lt;br /&gt;
* Responsable 2016--2024 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés (2025-2026) ==&lt;br /&gt;
&lt;br /&gt;
=== [[Classification de textes grâce à la compression]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; les IA modernes sont devenues très bonne pour *classifier* des textes : étant donné un texte (en français par exemple), il s&#039;agit de le relier à une catégorie dans un ensemble donné. Autan il est facile de distinguer une recette de cuisine d&#039;un pièce de théatre, la classification peut devenir plus complexe si l&#039;on souhaite distinguer des textes très courts, ou distinguer des niveaux de langage.&lt;br /&gt;
Les techniques habituelles reposent sur des réseaux de neurones profonds, mais des chercheurs ont récemment obtenu des résultats pouvant rivaliser avec ces techniques complexes et gourmandent en calcul en utilisant ... des algorithmes de compression !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre la problématique de classification de texte&lt;br /&gt;
* essayer de re-obtenir les résultats décrits dans l&#039;article en codant, en Python un petit programme de classification&lt;br /&gt;
* comparer les résultats obtenus avec différent algorithmes de compression&lt;br /&gt;
* [objectif secondaire] essayer de comparer les résultats obtenus avec des outils modernes plus classiques.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://arxiv.org/abs/2212.09410 Less is More: Parameter-Free Text Classification with Gzip]&lt;br /&gt;
&lt;br /&gt;
=== [[Filage d&#039;image et tracé de droites pour un rendu artistique]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Peut-être avez-vous déjà fait des créations artistiques en enfilant un long fil autour de clous placés sur une planche, en essayant de donner l&#039;illusion d&#039;une forme ou d&#039;une scène ? Nous allons nous intéresser au problème d&#039;approcher au mieux une image (en niveaux de gris) en passant un &amp;quot;fil&amp;quot; noir autour de &amp;quot;clous&amp;quot; disposés autour d&#039;une image blanche. Le fil noir partira d&#039;un clou et on devra décider à chaque étape le prochain clou où passer le fil et ainsi de suite. Au fur et à mesure, si on prend de bonnes décisions, on arrive à dessiner à peu près l&#039;image originale, avec un rendu artistique intéressant. Ce faisant, vous aurez appris à tracer des droites de pixels dans des images et codé un algorithme d&#039;optimisation glouton.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre le principe du filage d&#039;image et du tracé de droites discrètes&lt;br /&gt;
* Coder l&#039;algorithme pour des ensembles quelconques de clous (on commencera par disposer les clous sur les bords de l&#039;image). Il faudra comprendre comment on mesure une erreur de tracé pour une ligne donnée.&lt;br /&gt;
* Tester des variantes: 2 fils (1 blanc, 1 noir sur fond gris), rajouter des clous à l&#039;intérieur du cadre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Filage.png|400px]]&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2024-2025 ==&lt;br /&gt;
&lt;br /&gt;
* [[Polyominos, pavages et solveurs SAT]] par ÉTienne MALABRE (tuteur: Pierre Hyvernat)&lt;br /&gt;
* [[Algorithmes de couplages parfaits et de mariages stables]] par Eddy GUYON (tuteur: Valentin Gledel)&lt;br /&gt;
* [[Stéganographie &amp;quot;BPC&amp;quot;]] par Hania BOUDJAJ (tuteur: Pierre Hyvernat)&lt;br /&gt;
* [[&amp;quot;tableau des suffixes&amp;quot; et transformée de Burrows-Wheeler]] par Benjamin BOGDAN (tuteur: Sébastien Tavenas)&lt;br /&gt;
* [[Jeu de la vie]] par Alexis ANTOINE (tuteur:  Romain Negro)&lt;br /&gt;
* [[Modèle proie-prédateur sans équations]] par Lucas DELAMEZIERE (tuteur: Mouloud Kessar)&lt;br /&gt;
* [[Où placer une (ou plusieurs) antennes 5G dans un village ?]] par Nils BRIFFOD (tuteur: Dorin Bucur)&lt;br /&gt;
* [[Introduction à la complexité et sa formalisation]] par Mael ALBRECHT (tuteur: Tom Hirschowitz)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
* [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Calcul des valeurs de Grundy pour des jeux octaux]] par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* [[Modélisation de la ruine du joueur]] par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* [[Calibration de caméra et reconstruction 3D]] par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2024-2025 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Polyominos, pavages et solveurs SAT]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; les polyominos sont, comme les pièces de Tetris, des assemblages de petits carrés collés par leurs bords. Un ensemble de polyomino &#039;&#039;pavent&#039;&#039; une forment lorsqu&#039;on peut la remplir avec des ces polyominos, sans chevauchement et sans trou. Il existe des algorithmes spécifiques pour vérifier si on peut paver une forme, mais il est également possible de transformer la question en une grosse formule booléenne qui exprime que chaque case se retrouve bien recouverte, que chaque polyomino a bien la bonne forme, etc. On peut alors utiliser un &#039;&#039;solveur SAT&#039;&#039; qui cherche les solutions pour une telle formule.&lt;br /&gt;
&lt;br /&gt;
En écrivant des formules un peu plus complexes, on peut essayer de calculer le nombre de [https://en.wikipedia.org/wiki/Heesch%27s_problem Heesch&#039;s problem] d&#039;un polyomino. Il s&#039;agit du nombre d&#039;anneaux que l&#039;on peut mettre autour d&#039;un polyomino donné. Par exemple, la figure suivante montre un polyomino avec nombre de Heesh égal à 1 : le polyomino est entouré d&#039;un anneau (composé de copies de lui même), et on ne peut pas ajouter de second anneau supplémentaire (sans chevauchement et sans trou).&lt;br /&gt;
&lt;br /&gt;
[[File:heesch.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Le plus grand nombre de Heesh fini connu est ... 6 ! (Mais il n&#039;est pas atteint par un polyomino.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Comprendre l&#039;utilisation d&#039;un solveur SAT, par exemple en codant la résolution de sudoku.&lt;br /&gt;
# Coder (en Python ?) la génération de la formule associée à un problème de pavage, et la transformation d&#039;une solution booléenne en image finale.&lt;br /&gt;
# Coder (en Python ?) la génération de la formule associée à la question &amp;quot;le nombre de Heesh de ce polyomino est au moins égal à H&amp;quot;, et la transformation d&#039;une solution en image finale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tt&amp;gt;TODO: ref sur les solveur SAT&amp;lt;/tt&amp;gt;&lt;br /&gt;
# G. Kaplan, Heesch Numbers of Unmarked Polyforms : [https://isohedral.ca/heesch-numbers-of-unmarked-polyforms/ blog], [https://arxiv.org/pdf/2105.09438 article]&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes de couplages parfaits et de mariages stables]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un [https://fr.wikipedia.org/wiki/Th%C3%A9orie_des_graphes graphe] est un ensemble de sommets et un ensemble d’arêtes sur ces sommets. Un [https://fr.wikipedia.org/wiki/Couplage_(th%C3%A9orie_des_graphes) couplage] dans un graphe est un ensemble d&#039;arêtes C, tels que toute paire d&#039;arête de C n&#039;a aucun sommet en commun. Un couplage est dit parfait s&#039;il touche tous les sommets du graphe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Graph.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Matching1.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Matching2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un couplage dans ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un couplage parfait dans ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les algorithmes d&#039;[https://fr.wikipedia.org/wiki/Algorithme_d%27Edmonds_pour_les_couplages Edmonds] et de [https://fr.wikipedia.org/wiki/Algorithme_de_Hopcroft-Karp Hopcroft-Karp] sont des algorithmes de recherche de couplage dans des graphes. &lt;br /&gt;
&lt;br /&gt;
Si le graphe que dans lequel on cherche un couplage correspond à un graphe d&#039;affectation avec des préférences, on se retrouve dans le cas du [https://fr.wikipedia.org/wiki/Probl%C3%A8me_des_mariages_stables problème des mariages stables]. C&#039;est par exemple le cas de l&#039;affectation des places dans l&#039;enseignement supérieur où il faut affecter des étudiants dans les différents établissements de tels sorte à respecter les choix des étudiants et des établissements. L&#039;[https://fr.wikipedia.org/wiki/Algorithme_de_Gale_et_Shapley algorithme de Gale et Shapley] permet de résoudre efficacement ce problème.&lt;br /&gt;
&lt;br /&gt;
Dans ce sujet, il est proposé de ce pencher sur ces différents problèmes et d&#039;implémenter les algorithmes de résolutions présentés.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# comprendre le problème du mariage stable,&lt;br /&gt;
# implémenter les algorithmes de Gale-Shapley,&lt;br /&gt;
# implémenter les algorithmes de Hopcroft-Karp,&lt;br /&gt;
# comprendre la preuve de correction de l&#039;algorithme de Hopcroft-Karp,&lt;br /&gt;
# implémenter l&#039;algorithme d&#039;Edmonds.&lt;br /&gt;
# éventuellement implémenter d&#039;autres algorithmes liés aux couplages parfaits comme l&#039;algorithme hongrois ou l&#039;algorithme de Christofides.&lt;br /&gt;
&lt;br /&gt;
=== [[Stéganographie &amp;quot;BPC&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; la [https://fr.wikipedia.org/wiki/St%C3%A9ganographie stéganographie] consiste à dissimuler de l&#039;information dans un message d&#039;apparence anodine. On peut par exemple modifier légèrement les couleurs des pixels d&#039;une image, on l&#039;intensité des sons d&#039;une fichier sonore de manière imperceptible par un humain. Les destinataires peuvent alors récupérer cette information caché en appliquant la méthode inverse.&lt;br /&gt;
&lt;br /&gt;
La méthode la plus simple consiste à utiliser le bit de poids faible des couleurs RVB de chaque pixel d&#039;une image. La différence visuelle est tellement petite qu&#039;on ne peut pas la distinguer à l’œil nu. Par exemple, les deux couleurs suivantes sont différentes uniquement sur les bits de poids faible des composantes RVB.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:bleu1.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:bleu2.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;#237fd1&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;#227ed0&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour augmenter la quantité de données que l&#039;on peut dissimuler, on peut utiliser les 2 bits de poids faible, ou les 3 bits de poids faible, etc. Plus on utilise de bits, plus les distorsions dans l&#039;image deviennent visibles. Une manière plus intelligente est de ne remplacer des bits que dans les endroits &amp;quot;bruités&amp;quot; de l&#039;image. Les distorsions deviennent alors plus difficiles à distinguer. C&#039;est la stéganographie &amp;quot;complexité des plans de bits&amp;quot; (BPCS = &amp;quot;Bit Plane Complexity Steganography&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;exemple suivant, l&#039;intégralité des 9605 lignes / 37860 mots / 239347 octets (avant compression) de la pièce &amp;quot;Cyrano de Bergerac&amp;quot; est dissimulée dans l&#039;image de gauche.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:image-orig.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:LSBS.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:BPCS.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;image [https://pixabay.com/fr/photos/montagnes-lac-nature-paysage-hiver-8025144/ originale]&amp;lt;br&amp;gt;(320x240 pixels)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;stéganographie LSB&amp;lt;br&amp;gt;(avec les 3 bits de poids faible)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;stéganographie BPC &amp;lt;br&amp;gt;(paramètres &amp;lt;tt&amp;gt;0,10,20,30,999,999,999,999&amp;lt;/tt&amp;gt;)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Si vous regardez attentivement, les pixels du ciel ou de la surface de l&#039;eau sont nettement plus modifiés dans l&#039;image centrale que dans l&#039;image de droite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter (par exemple en Python) la stéganographie par bits de poids faible sur des images,&lt;br /&gt;
# comprendre et implémenter la stéganographie par plans de complexité,&lt;br /&gt;
# comparer les 2 approches sur des exemples&lt;br /&gt;
# si le temps le permet, regarder les technique de &amp;quot;stéganalyse&amp;quot; qui permettent de détecter la présence d&#039;informations dissimulées dans une image.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# [https://web.archive.org/web/20120905034757/http://www.eece.maine.edu/~eason/steg/SPIE98.pdf Principle and applications of BPCS-Steganography]&lt;br /&gt;
# [https://web.archive.org/web/20110815205714/http://etd.lib.ttu.edu/theses/available/etd-06272008-31295018922590/unrestricted/31295018922590.pdf High capacity data hiding system using BPCS steganography]&lt;br /&gt;
&lt;br /&gt;
=== [[&amp;quot;tableau des suffixes&amp;quot; et transformée de Burrows-Wheeler]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le [https://fr.wikipedia.org/wiki/Tableau_des_suffixes tableau des suffixes] est une structure de données qui permet de répondre très rapidement à des requêtes du style &amp;quot;est-ce que la chaine &#039;&#039;p&#039;&#039; apparait dans la chaine &#039;&#039;S&#039;&#039; ?&amp;quot; La chaine &#039;&#039;p&#039;&#039; pourrait être une &amp;quot;petite&amp;quot; chaine de quelques milliers de caractères, alors que la chaine &#039;&#039;S&#039;&#039; pourrait être une &amp;quot;grosse&amp;quot; chaine de plusieurs milliard de caractères. Les biologistes utilisent des requêtes de ce genre lorsqu&#039;ils recherchent des motifs &#039;&#039;p&#039;&#039; dans l&#039;ADN &#039;&#039;S&#039;&#039;. Lorsque &#039;&#039;S&#039;&#039; ne change pas, l&#039;arbre des suffixes permet de répondre à la requête précédente avec un nombre d&#039;opérations beaucoup plus faible que la recherche naïve qui devrait regarder tous les caractères de &#039;&#039;S&#039;&#039; !&lt;br /&gt;
&lt;br /&gt;
Cette structure de données est également reliée à la transformée de Burrows-Wheeler, à la base de l&#039;algorithme de compression &amp;lt;tt&amp;gt;bzip&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# Le calcul naïf du tableau des suffixes se fait en quelques lignes de Python. Le premier objectif sera d&#039;utiliser cette version pour expérimenter avec les algorithmes de recherche simples sur le tableaux des suffixes, et de comparer les temps d&#039;exécution avec ceux des algorithmes standard. &lt;br /&gt;
# Transformer un tableau de suffixes en transformée de Burrows-Wheeler est également l&#039;affaire de quelques lignes de Python. Le second objectif sera donc de coder les quelques fonctionnalités manquantes pour compresser, et décompresser des chaines de caractères ; et de comparer ceci avec d&#039;autres algorithmes existants.&lt;br /&gt;
# le tableau des suffixes est plus petit que l&#039;arbre des suffixes (variante un peu plus rapide, mais plus complexe), et la transformée de Burrows-Wheeler est encore plus petite. L&#039;idée serait de comprendre d&#039;où viennent ces différences et comment passer d&#039;une structure à l&#039;autre, et comment les améliorer.&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# les liens wikipédia (plutôt en anglais) cités ci dessus sont un bon début&lt;br /&gt;
# [https://www.cs.jhu.edu/~langmea/resources/bwt_fm.pdf Introduction to the Burrows-Wheeler Transform and FM Index]&lt;br /&gt;
# les [https://www.youtube.com/playlist?list=PL2mpR0RYFQsDFNyRsTNcWkFTHTkxWREeb vidéos de Ben Langmead] sur le sujet&lt;br /&gt;
# Dan Gusfield, &#039;&#039;Algorithms on Strings, Trees and Sequences&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===[[le problème du collectionneur]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutrice :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; un collectionneur cherche à avoir toutes les vignettes d’une série&lt;br /&gt;
représentant des joueurs de foot. Chaque vignette représente un joueur,&lt;br /&gt;
il y a en tout &#039;&#039;N&#039;&#039; joueurs. Pour avoir une vignette, on doit acheter un&lt;br /&gt;
paquet de céréales. Chaque paquet de céréales contient une vignette&lt;br /&gt;
choisie de manière uniforme et indépendante au hasard parmi ces &#039;&#039;N&#039;&#039;&lt;br /&gt;
possibilités. Combien faudra t il en moyenne acheter de paquets de&lt;br /&gt;
céréales afin d&#039;obtenir toute la série des &#039;&#039;N&#039;&#039; joueurs de foot?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
# Ecrire un programme qui simule l&#039;expérience&lt;br /&gt;
# en déduire une approximation le nombre moyen de paquets de céréales à acheter&lt;br /&gt;
# Résoudre le problème théoriquement&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
https://fr.wikipedia.org/wiki/Probl%C3%A8me_du_collectionneur_de_vignettes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Jeu de la vie]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Romain Negro&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le [https://fr.wikipedia.org/wiki/Jeu_de_la_vie jeu de la vie] est un [https://fr.wikipedia.org/wiki/Automate_cellulaire automate cellulaire] inventé dans les années 70 par John Conway dont les&lt;br /&gt;
règles sont simples, mais dont des comportements macroscopiques complexes peuvent apparaître. Des simples structures immobiles aux structures semblant dotées d&#039;intelligence, le jeu de la vie est&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Turing-complet Turing-complet].&lt;br /&gt;
&lt;br /&gt;
Le jeu de la vie se présente ainsi : sur une grille infinie, il y a des cellules vivantes ou mortes. A chaque étape, chaque cellule naît, reste en vie ou meurt en fonction de son 8-voisinage. Une cellule naît si&lt;br /&gt;
exactement 3 de ses voisins sont vivants. Une cellule reste en vie son état si celle-ci a entre 2 et 3 voisins vivants. Dans les autres cas, la cellule meurt.&lt;br /&gt;
&lt;br /&gt;
Afin de faire fonctionner cet automate, l&#039;approche naïve consiste à chaque étape à calculer pour chaque cellule son état suivant. Cependant, celle-ci ne fonctionne que sur une grille finie et n&#039;est pas très&lt;br /&gt;
efficace pour de plus grandes grilles.&lt;br /&gt;
&lt;br /&gt;
Certaines approches permettent de travailler sur des grilles de taille infinie (en théorie), voire de pouvoir rapidement se déplacer de plusieurs étapes dans le temps. D&#039;autres approches permettent même de&lt;br /&gt;
s&#039;affranchir de la notion de grille et d&#039;étapes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter (en Python ou Javascript) une version naïve du jeu de la vie sur une grille finie,                                                                                                                    &lt;br /&gt;
# proposer une implémentation permettant d&#039;effectuer la simulation sur une grille infinie,                                                                                                                          &lt;br /&gt;
# comprendre et si le temps le permet implémenter la simulation en utilisant une approche en arbre.                                                                                                                 &lt;br /&gt;
# s&#039;il reste encore du temps, comprendre comment fonctionne l&#039;approche continue du jeu de la vie                                                                                                                    &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# Liens wikipédia cités dans le résumé                                                                                                                                                                              &lt;br /&gt;
# [https://johnhw.github.io/hashlife/index.md.html Implémentation utilisant des arbres]                                                                                                                             &lt;br /&gt;
# [https://arxiv.org/pdf/2005.03742 Lenia : jeu de la vie &amp;quot;continu&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Modèle proie-prédateur sans équations]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
les équations de prédation de Lotka-Volterra sont relativement simples sur le plan mathématiques et permettent d&#039;étudier l&#039;évolution d&#039;une population de proies (typiquement des lapins) et de prédateurs (typiquement des renards). Avec le bon jeu de paramètres, on peut observer des cycles dans le nombre de proies et de prédateurs. L&#039;objectif de ce projet est d&#039;observer de tels cycles sans utiliser d&#039;équations, mais des déplacements aléatoires sur une grille à deux dimensions.&lt;br /&gt;
&lt;br /&gt;
Les règles de base sont les suivantes:&lt;br /&gt;
*A chaque itération, chaque individu se déplace d&#039;une case dans une direction aléatoire(haut/bas/droite/gauche).&lt;br /&gt;
*Les proies sont mangées par les prédateurs lorsqu&#039;elles se retrouvent au même endroit que l&#039;un d&#039;eux.&lt;br /&gt;
*Les proies(respectivement prédateurs) voient leur population doubler toute les &amp;lt;tt&amp;gt;nr_proie&amp;lt;/tt&amp;gt; (resp. &amp;lt;tt&amp;gt;nr_pred&amp;lt;/tt&amp;gt;) itérations.&lt;br /&gt;
*On suppose que les proies ont toujours à manger.&lt;br /&gt;
*Si un prédateur n&#039;a pas mangé pendant &amp;lt;tt&amp;gt;n_faim&amp;lt;/tt&amp;gt; itérations, il meurt.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du projet est le suivant:&lt;br /&gt;
&lt;br /&gt;
#Ecrire un programme en python qui suit les règles de base.&lt;br /&gt;
#Visualiser l&#039;évolution du nombre de proies et de prédateurs en fonction du temps, pour différentes valeurs de &amp;lt;tt&amp;gt;nr_proie&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;nr_pred&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;n_faim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Remarque :&#039;&#039; Des précisions supplémentaires seront discutées avec le tuteur au faire et à mesure de l&#039;avancement du projet pour concrétiser l&#039;implémentation des règles de base.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;références:&#039;&#039;&#039;&lt;br /&gt;
#[https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra Les équations de prédation de Lotka-Volterra]&lt;br /&gt;
#Exemple de déplacement aléatoire: [https://fr.wikipedia.org/wiki/Mouvement_brownien Le Mouvement Brownien]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Où placer une (ou plusieurs) antennes 5G dans un village ?]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Dorin Bucur&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Cette question, présentée ici de manière simplifiée, est très importante et&lt;br /&gt;
apparaît sous différentes formes dans la planification économique. Sa&lt;br /&gt;
modélisation repose sur des notions mathématiques relativement simples, et sa&lt;br /&gt;
résolution implique généralement l&#039;utilisation d&#039;algorithmes numériques&lt;br /&gt;
d&#039;optimisation. De manière simple, on devra chercher à positionner un certain&lt;br /&gt;
nombre de points dans un ensemble donné du plan, de telle manière à ce que la&lt;br /&gt;
moyenne de la distance à l&#039;ensemble des points soit minimale.&lt;br /&gt;
&lt;br /&gt;
En s’appuyant sur les deux références fournies, l’étudiant devra :&lt;br /&gt;
&lt;br /&gt;
*Ecrire un modèle mathématique associé à ce problème&lt;br /&gt;
*Comprendre le rôle des diagrammes de Voronoï&lt;br /&gt;
*Effectuer une analyse élémentaire de quelques cas simples (par exemple : une antenne dans un village circulaire, deux antennes dans le même village, etc.)&lt;br /&gt;
*Proposer une méthode de résolution numérique en développant un algorithme d&#039;optimisation de type gradient, implémenté en Python.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références:&#039;&#039;&#039;&lt;br /&gt;
#https://www.palais-decouverte.fr/fileadmin/fileadmin_Palais/fichiersContribs/au-programme/expos-permanentes/mathematiques/Bloc_Formes/pdf_revue/359_nov_dec_2k8.pdf&lt;br /&gt;
#https://doi.org/10.1080/00029890.2002.11919849&lt;br /&gt;
&lt;br /&gt;
===[[Introduction à la complexité et sa formalisation]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; La notion de complexité d&#039;un programme est une abstraction du temps que va mettre le programme pour calculer son résultat. Plus qu&#039;une durée concrète, mesurée en secondes, il s&#039;agit avant tout de prédire le comportement du programme sur des paramètres de plus en plus grands. Des travaux assez récents développent des langages où la complexité peut être contrôlée directement. L&#039;objectif serait de découvrir sur des exemples simples la notion de complexité, et de regarder comment fonctionnent ces langages qui permettent de l&#039;internaliser.&lt;br /&gt;
&lt;br /&gt;
Ces langages utilisent un style de programmation assez différent des langages utilisé en L1 (comme Python) : ce sont des langages dits &#039;&#039;fonctionnels&#039;&#039;. La première partie du projet sera donc la découverte d&#039;un langage fonctionnel, [https://ocaml.org/ OCaml]. La seconde partie consistera à explorer le langage expérimental [https://github.com/jonsterling/agda-calf calf], le &#039;&#039;cost-aware logical framework&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
=== [[Surfaces polygonales et surfaces de subdivision]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
=== [[Calcul des valeurs de Grundy pour des jeux octaux]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
=== [[Planarité de graphes]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Calibration de caméra et reconstruction 3D]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=16173</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=16173"/>
		<updated>2026-01-07T16:26:18Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Filage d&amp;#039;image et tracé de droites pour un rendu artistique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2024--2025: Pierre Hyvernat&lt;br /&gt;
* Responsable 2016--2024 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés (2025-2026) ==&lt;br /&gt;
&lt;br /&gt;
=== [[Classification de textes grâce à la compression]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; les IA modernes sont devenues très bonne pour *classifier* des textes : étant donné un texte (en français par exemple), il s&#039;agit de le relier à une catégorie dans un ensemble donné. Autan il est facile de distinguer une recette de cuisine d&#039;un pièce de théatre, la classification peut devenir plus complexe si l&#039;on souhaite distinguer des textes très courts, ou distinguer des niveaux de langage.&lt;br /&gt;
Les techniques habituelles reposent sur des réseaux de neurones profonds, mais des chercheurs ont récemment obtenu des résultats pouvant rivaliser avec ces techniques complexes et gourmandent en calcul en utilisant ... des algorithmes de compression !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre la problématique de classification de texte&lt;br /&gt;
* essayer de re-obtenir les résultats décrits dans l&#039;article en codant, en Python un petit programme de classification&lt;br /&gt;
* comparer les résultats obtenus avec différent algorithmes de compression&lt;br /&gt;
* [objectif secondaire] essayer de comparer les résultats obtenus avec des outils modernes plus classiques.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://arxiv.org/abs/2212.09410 Less is More: Parameter-Free Text Classification with Gzip]&lt;br /&gt;
&lt;br /&gt;
=== [[Filage d&#039;image et tracé de droites pour un rendu artistique]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Peut-être avez-vous déjà fait des créations artistiques en enfilant un long fil autour de clous placés sur une planche, en essayant de donner l&#039;illusion d&#039;une forme ou d&#039;une scène ? Nous allons nous intéresser au problème d&#039;approcher au mieux une image (en niveaux de gris) en passant un &amp;quot;fil&amp;quot; noir autour de &amp;quot;clous&amp;quot; disposés autour d&#039;une image blanche. Le fil noir partira d&#039;un clou et on devra décider à chaque étape le prochain clou où passer le fil et ainsi de suite. Au fur et à mesure, si on prend de bonnes décisions, on arrive à dessiner à peu près l&#039;image originale, avec un rendu artistique intéressant. Ce faisant, vous aurez appris à tracer des droites de pixels dans des images et codé un algorithme d&#039;optimisation glouton.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre le principe du filage d&#039;image et du tracé de droites discrètes&lt;br /&gt;
* Coder l&#039;algorithme pour des ensembles quelconques de clous (on commencera par disposer les clous sur les bords de l&#039;image). Il faudra comprendre comment on mesure une erreur de tracé pour une ligne donnée.&lt;br /&gt;
* Tester des variantes: 2 fils (1 blanc, 1 noir sur fond gris), rajouter des clous à l&#039;intérieur du cadre.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Filage.png]]&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2024-2025 ==&lt;br /&gt;
&lt;br /&gt;
* [[Polyominos, pavages et solveurs SAT]] par ÉTienne MALABRE (tuteur: Pierre Hyvernat)&lt;br /&gt;
* [[Algorithmes de couplages parfaits et de mariages stables]] par Eddy GUYON (tuteur: Valentin Gledel)&lt;br /&gt;
* [[Stéganographie &amp;quot;BPC&amp;quot;]] par Hania BOUDJAJ (tuteur: Pierre Hyvernat)&lt;br /&gt;
* [[&amp;quot;tableau des suffixes&amp;quot; et transformée de Burrows-Wheeler]] par Benjamin BOGDAN (tuteur: Sébastien Tavenas)&lt;br /&gt;
* [[Jeu de la vie]] par Alexis ANTOINE (tuteur:  Romain Negro)&lt;br /&gt;
* [[Modèle proie-prédateur sans équations]] par Lucas DELAMEZIERE (tuteur: Mouloud Kessar)&lt;br /&gt;
* [[Où placer une (ou plusieurs) antennes 5G dans un village ?]] par Nils BRIFFOD (tuteur: Dorin Bucur)&lt;br /&gt;
* [[Introduction à la complexité et sa formalisation]] par Mael ALBRECHT (tuteur: Tom Hirschowitz)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
* [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Calcul des valeurs de Grundy pour des jeux octaux]] par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* [[Modélisation de la ruine du joueur]] par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* [[Calibration de caméra et reconstruction 3D]] par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2024-2025 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Polyominos, pavages et solveurs SAT]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; les polyominos sont, comme les pièces de Tetris, des assemblages de petits carrés collés par leurs bords. Un ensemble de polyomino &#039;&#039;pavent&#039;&#039; une forment lorsqu&#039;on peut la remplir avec des ces polyominos, sans chevauchement et sans trou. Il existe des algorithmes spécifiques pour vérifier si on peut paver une forme, mais il est également possible de transformer la question en une grosse formule booléenne qui exprime que chaque case se retrouve bien recouverte, que chaque polyomino a bien la bonne forme, etc. On peut alors utiliser un &#039;&#039;solveur SAT&#039;&#039; qui cherche les solutions pour une telle formule.&lt;br /&gt;
&lt;br /&gt;
En écrivant des formules un peu plus complexes, on peut essayer de calculer le nombre de [https://en.wikipedia.org/wiki/Heesch%27s_problem Heesch&#039;s problem] d&#039;un polyomino. Il s&#039;agit du nombre d&#039;anneaux que l&#039;on peut mettre autour d&#039;un polyomino donné. Par exemple, la figure suivante montre un polyomino avec nombre de Heesh égal à 1 : le polyomino est entouré d&#039;un anneau (composé de copies de lui même), et on ne peut pas ajouter de second anneau supplémentaire (sans chevauchement et sans trou).&lt;br /&gt;
&lt;br /&gt;
[[File:heesch.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Le plus grand nombre de Heesh fini connu est ... 6 ! (Mais il n&#039;est pas atteint par un polyomino.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Comprendre l&#039;utilisation d&#039;un solveur SAT, par exemple en codant la résolution de sudoku.&lt;br /&gt;
# Coder (en Python ?) la génération de la formule associée à un problème de pavage, et la transformation d&#039;une solution booléenne en image finale.&lt;br /&gt;
# Coder (en Python ?) la génération de la formule associée à la question &amp;quot;le nombre de Heesh de ce polyomino est au moins égal à H&amp;quot;, et la transformation d&#039;une solution en image finale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tt&amp;gt;TODO: ref sur les solveur SAT&amp;lt;/tt&amp;gt;&lt;br /&gt;
# G. Kaplan, Heesch Numbers of Unmarked Polyforms : [https://isohedral.ca/heesch-numbers-of-unmarked-polyforms/ blog], [https://arxiv.org/pdf/2105.09438 article]&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes de couplages parfaits et de mariages stables]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un [https://fr.wikipedia.org/wiki/Th%C3%A9orie_des_graphes graphe] est un ensemble de sommets et un ensemble d’arêtes sur ces sommets. Un [https://fr.wikipedia.org/wiki/Couplage_(th%C3%A9orie_des_graphes) couplage] dans un graphe est un ensemble d&#039;arêtes C, tels que toute paire d&#039;arête de C n&#039;a aucun sommet en commun. Un couplage est dit parfait s&#039;il touche tous les sommets du graphe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Graph.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Matching1.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Matching2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un couplage dans ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un couplage parfait dans ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les algorithmes d&#039;[https://fr.wikipedia.org/wiki/Algorithme_d%27Edmonds_pour_les_couplages Edmonds] et de [https://fr.wikipedia.org/wiki/Algorithme_de_Hopcroft-Karp Hopcroft-Karp] sont des algorithmes de recherche de couplage dans des graphes. &lt;br /&gt;
&lt;br /&gt;
Si le graphe que dans lequel on cherche un couplage correspond à un graphe d&#039;affectation avec des préférences, on se retrouve dans le cas du [https://fr.wikipedia.org/wiki/Probl%C3%A8me_des_mariages_stables problème des mariages stables]. C&#039;est par exemple le cas de l&#039;affectation des places dans l&#039;enseignement supérieur où il faut affecter des étudiants dans les différents établissements de tels sorte à respecter les choix des étudiants et des établissements. L&#039;[https://fr.wikipedia.org/wiki/Algorithme_de_Gale_et_Shapley algorithme de Gale et Shapley] permet de résoudre efficacement ce problème.&lt;br /&gt;
&lt;br /&gt;
Dans ce sujet, il est proposé de ce pencher sur ces différents problèmes et d&#039;implémenter les algorithmes de résolutions présentés.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# comprendre le problème du mariage stable,&lt;br /&gt;
# implémenter les algorithmes de Gale-Shapley,&lt;br /&gt;
# implémenter les algorithmes de Hopcroft-Karp,&lt;br /&gt;
# comprendre la preuve de correction de l&#039;algorithme de Hopcroft-Karp,&lt;br /&gt;
# implémenter l&#039;algorithme d&#039;Edmonds.&lt;br /&gt;
# éventuellement implémenter d&#039;autres algorithmes liés aux couplages parfaits comme l&#039;algorithme hongrois ou l&#039;algorithme de Christofides.&lt;br /&gt;
&lt;br /&gt;
=== [[Stéganographie &amp;quot;BPC&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; la [https://fr.wikipedia.org/wiki/St%C3%A9ganographie stéganographie] consiste à dissimuler de l&#039;information dans un message d&#039;apparence anodine. On peut par exemple modifier légèrement les couleurs des pixels d&#039;une image, on l&#039;intensité des sons d&#039;une fichier sonore de manière imperceptible par un humain. Les destinataires peuvent alors récupérer cette information caché en appliquant la méthode inverse.&lt;br /&gt;
&lt;br /&gt;
La méthode la plus simple consiste à utiliser le bit de poids faible des couleurs RVB de chaque pixel d&#039;une image. La différence visuelle est tellement petite qu&#039;on ne peut pas la distinguer à l’œil nu. Par exemple, les deux couleurs suivantes sont différentes uniquement sur les bits de poids faible des composantes RVB.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:bleu1.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:bleu2.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;#237fd1&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;#227ed0&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour augmenter la quantité de données que l&#039;on peut dissimuler, on peut utiliser les 2 bits de poids faible, ou les 3 bits de poids faible, etc. Plus on utilise de bits, plus les distorsions dans l&#039;image deviennent visibles. Une manière plus intelligente est de ne remplacer des bits que dans les endroits &amp;quot;bruités&amp;quot; de l&#039;image. Les distorsions deviennent alors plus difficiles à distinguer. C&#039;est la stéganographie &amp;quot;complexité des plans de bits&amp;quot; (BPCS = &amp;quot;Bit Plane Complexity Steganography&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;exemple suivant, l&#039;intégralité des 9605 lignes / 37860 mots / 239347 octets (avant compression) de la pièce &amp;quot;Cyrano de Bergerac&amp;quot; est dissimulée dans l&#039;image de gauche.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:image-orig.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:LSBS.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:BPCS.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;image [https://pixabay.com/fr/photos/montagnes-lac-nature-paysage-hiver-8025144/ originale]&amp;lt;br&amp;gt;(320x240 pixels)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;stéganographie LSB&amp;lt;br&amp;gt;(avec les 3 bits de poids faible)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;stéganographie BPC &amp;lt;br&amp;gt;(paramètres &amp;lt;tt&amp;gt;0,10,20,30,999,999,999,999&amp;lt;/tt&amp;gt;)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Si vous regardez attentivement, les pixels du ciel ou de la surface de l&#039;eau sont nettement plus modifiés dans l&#039;image centrale que dans l&#039;image de droite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter (par exemple en Python) la stéganographie par bits de poids faible sur des images,&lt;br /&gt;
# comprendre et implémenter la stéganographie par plans de complexité,&lt;br /&gt;
# comparer les 2 approches sur des exemples&lt;br /&gt;
# si le temps le permet, regarder les technique de &amp;quot;stéganalyse&amp;quot; qui permettent de détecter la présence d&#039;informations dissimulées dans une image.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# [https://web.archive.org/web/20120905034757/http://www.eece.maine.edu/~eason/steg/SPIE98.pdf Principle and applications of BPCS-Steganography]&lt;br /&gt;
# [https://web.archive.org/web/20110815205714/http://etd.lib.ttu.edu/theses/available/etd-06272008-31295018922590/unrestricted/31295018922590.pdf High capacity data hiding system using BPCS steganography]&lt;br /&gt;
&lt;br /&gt;
=== [[&amp;quot;tableau des suffixes&amp;quot; et transformée de Burrows-Wheeler]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le [https://fr.wikipedia.org/wiki/Tableau_des_suffixes tableau des suffixes] est une structure de données qui permet de répondre très rapidement à des requêtes du style &amp;quot;est-ce que la chaine &#039;&#039;p&#039;&#039; apparait dans la chaine &#039;&#039;S&#039;&#039; ?&amp;quot; La chaine &#039;&#039;p&#039;&#039; pourrait être une &amp;quot;petite&amp;quot; chaine de quelques milliers de caractères, alors que la chaine &#039;&#039;S&#039;&#039; pourrait être une &amp;quot;grosse&amp;quot; chaine de plusieurs milliard de caractères. Les biologistes utilisent des requêtes de ce genre lorsqu&#039;ils recherchent des motifs &#039;&#039;p&#039;&#039; dans l&#039;ADN &#039;&#039;S&#039;&#039;. Lorsque &#039;&#039;S&#039;&#039; ne change pas, l&#039;arbre des suffixes permet de répondre à la requête précédente avec un nombre d&#039;opérations beaucoup plus faible que la recherche naïve qui devrait regarder tous les caractères de &#039;&#039;S&#039;&#039; !&lt;br /&gt;
&lt;br /&gt;
Cette structure de données est également reliée à la transformée de Burrows-Wheeler, à la base de l&#039;algorithme de compression &amp;lt;tt&amp;gt;bzip&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# Le calcul naïf du tableau des suffixes se fait en quelques lignes de Python. Le premier objectif sera d&#039;utiliser cette version pour expérimenter avec les algorithmes de recherche simples sur le tableaux des suffixes, et de comparer les temps d&#039;exécution avec ceux des algorithmes standard. &lt;br /&gt;
# Transformer un tableau de suffixes en transformée de Burrows-Wheeler est également l&#039;affaire de quelques lignes de Python. Le second objectif sera donc de coder les quelques fonctionnalités manquantes pour compresser, et décompresser des chaines de caractères ; et de comparer ceci avec d&#039;autres algorithmes existants.&lt;br /&gt;
# le tableau des suffixes est plus petit que l&#039;arbre des suffixes (variante un peu plus rapide, mais plus complexe), et la transformée de Burrows-Wheeler est encore plus petite. L&#039;idée serait de comprendre d&#039;où viennent ces différences et comment passer d&#039;une structure à l&#039;autre, et comment les améliorer.&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# les liens wikipédia (plutôt en anglais) cités ci dessus sont un bon début&lt;br /&gt;
# [https://www.cs.jhu.edu/~langmea/resources/bwt_fm.pdf Introduction to the Burrows-Wheeler Transform and FM Index]&lt;br /&gt;
# les [https://www.youtube.com/playlist?list=PL2mpR0RYFQsDFNyRsTNcWkFTHTkxWREeb vidéos de Ben Langmead] sur le sujet&lt;br /&gt;
# Dan Gusfield, &#039;&#039;Algorithms on Strings, Trees and Sequences&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===[[le problème du collectionneur]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutrice :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; un collectionneur cherche à avoir toutes les vignettes d’une série&lt;br /&gt;
représentant des joueurs de foot. Chaque vignette représente un joueur,&lt;br /&gt;
il y a en tout &#039;&#039;N&#039;&#039; joueurs. Pour avoir une vignette, on doit acheter un&lt;br /&gt;
paquet de céréales. Chaque paquet de céréales contient une vignette&lt;br /&gt;
choisie de manière uniforme et indépendante au hasard parmi ces &#039;&#039;N&#039;&#039;&lt;br /&gt;
possibilités. Combien faudra t il en moyenne acheter de paquets de&lt;br /&gt;
céréales afin d&#039;obtenir toute la série des &#039;&#039;N&#039;&#039; joueurs de foot?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
# Ecrire un programme qui simule l&#039;expérience&lt;br /&gt;
# en déduire une approximation le nombre moyen de paquets de céréales à acheter&lt;br /&gt;
# Résoudre le problème théoriquement&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
https://fr.wikipedia.org/wiki/Probl%C3%A8me_du_collectionneur_de_vignettes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Jeu de la vie]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Romain Negro&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le [https://fr.wikipedia.org/wiki/Jeu_de_la_vie jeu de la vie] est un [https://fr.wikipedia.org/wiki/Automate_cellulaire automate cellulaire] inventé dans les années 70 par John Conway dont les&lt;br /&gt;
règles sont simples, mais dont des comportements macroscopiques complexes peuvent apparaître. Des simples structures immobiles aux structures semblant dotées d&#039;intelligence, le jeu de la vie est&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Turing-complet Turing-complet].&lt;br /&gt;
&lt;br /&gt;
Le jeu de la vie se présente ainsi : sur une grille infinie, il y a des cellules vivantes ou mortes. A chaque étape, chaque cellule naît, reste en vie ou meurt en fonction de son 8-voisinage. Une cellule naît si&lt;br /&gt;
exactement 3 de ses voisins sont vivants. Une cellule reste en vie son état si celle-ci a entre 2 et 3 voisins vivants. Dans les autres cas, la cellule meurt.&lt;br /&gt;
&lt;br /&gt;
Afin de faire fonctionner cet automate, l&#039;approche naïve consiste à chaque étape à calculer pour chaque cellule son état suivant. Cependant, celle-ci ne fonctionne que sur une grille finie et n&#039;est pas très&lt;br /&gt;
efficace pour de plus grandes grilles.&lt;br /&gt;
&lt;br /&gt;
Certaines approches permettent de travailler sur des grilles de taille infinie (en théorie), voire de pouvoir rapidement se déplacer de plusieurs étapes dans le temps. D&#039;autres approches permettent même de&lt;br /&gt;
s&#039;affranchir de la notion de grille et d&#039;étapes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter (en Python ou Javascript) une version naïve du jeu de la vie sur une grille finie,                                                                                                                    &lt;br /&gt;
# proposer une implémentation permettant d&#039;effectuer la simulation sur une grille infinie,                                                                                                                          &lt;br /&gt;
# comprendre et si le temps le permet implémenter la simulation en utilisant une approche en arbre.                                                                                                                 &lt;br /&gt;
# s&#039;il reste encore du temps, comprendre comment fonctionne l&#039;approche continue du jeu de la vie                                                                                                                    &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# Liens wikipédia cités dans le résumé                                                                                                                                                                              &lt;br /&gt;
# [https://johnhw.github.io/hashlife/index.md.html Implémentation utilisant des arbres]                                                                                                                             &lt;br /&gt;
# [https://arxiv.org/pdf/2005.03742 Lenia : jeu de la vie &amp;quot;continu&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Modèle proie-prédateur sans équations]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
les équations de prédation de Lotka-Volterra sont relativement simples sur le plan mathématiques et permettent d&#039;étudier l&#039;évolution d&#039;une population de proies (typiquement des lapins) et de prédateurs (typiquement des renards). Avec le bon jeu de paramètres, on peut observer des cycles dans le nombre de proies et de prédateurs. L&#039;objectif de ce projet est d&#039;observer de tels cycles sans utiliser d&#039;équations, mais des déplacements aléatoires sur une grille à deux dimensions.&lt;br /&gt;
&lt;br /&gt;
Les règles de base sont les suivantes:&lt;br /&gt;
*A chaque itération, chaque individu se déplace d&#039;une case dans une direction aléatoire(haut/bas/droite/gauche).&lt;br /&gt;
*Les proies sont mangées par les prédateurs lorsqu&#039;elles se retrouvent au même endroit que l&#039;un d&#039;eux.&lt;br /&gt;
*Les proies(respectivement prédateurs) voient leur population doubler toute les &amp;lt;tt&amp;gt;nr_proie&amp;lt;/tt&amp;gt; (resp. &amp;lt;tt&amp;gt;nr_pred&amp;lt;/tt&amp;gt;) itérations.&lt;br /&gt;
*On suppose que les proies ont toujours à manger.&lt;br /&gt;
*Si un prédateur n&#039;a pas mangé pendant &amp;lt;tt&amp;gt;n_faim&amp;lt;/tt&amp;gt; itérations, il meurt.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du projet est le suivant:&lt;br /&gt;
&lt;br /&gt;
#Ecrire un programme en python qui suit les règles de base.&lt;br /&gt;
#Visualiser l&#039;évolution du nombre de proies et de prédateurs en fonction du temps, pour différentes valeurs de &amp;lt;tt&amp;gt;nr_proie&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;nr_pred&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;n_faim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Remarque :&#039;&#039; Des précisions supplémentaires seront discutées avec le tuteur au faire et à mesure de l&#039;avancement du projet pour concrétiser l&#039;implémentation des règles de base.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;références:&#039;&#039;&#039;&lt;br /&gt;
#[https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra Les équations de prédation de Lotka-Volterra]&lt;br /&gt;
#Exemple de déplacement aléatoire: [https://fr.wikipedia.org/wiki/Mouvement_brownien Le Mouvement Brownien]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Où placer une (ou plusieurs) antennes 5G dans un village ?]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Dorin Bucur&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Cette question, présentée ici de manière simplifiée, est très importante et&lt;br /&gt;
apparaît sous différentes formes dans la planification économique. Sa&lt;br /&gt;
modélisation repose sur des notions mathématiques relativement simples, et sa&lt;br /&gt;
résolution implique généralement l&#039;utilisation d&#039;algorithmes numériques&lt;br /&gt;
d&#039;optimisation. De manière simple, on devra chercher à positionner un certain&lt;br /&gt;
nombre de points dans un ensemble donné du plan, de telle manière à ce que la&lt;br /&gt;
moyenne de la distance à l&#039;ensemble des points soit minimale.&lt;br /&gt;
&lt;br /&gt;
En s’appuyant sur les deux références fournies, l’étudiant devra :&lt;br /&gt;
&lt;br /&gt;
*Ecrire un modèle mathématique associé à ce problème&lt;br /&gt;
*Comprendre le rôle des diagrammes de Voronoï&lt;br /&gt;
*Effectuer une analyse élémentaire de quelques cas simples (par exemple : une antenne dans un village circulaire, deux antennes dans le même village, etc.)&lt;br /&gt;
*Proposer une méthode de résolution numérique en développant un algorithme d&#039;optimisation de type gradient, implémenté en Python.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références:&#039;&#039;&#039;&lt;br /&gt;
#https://www.palais-decouverte.fr/fileadmin/fileadmin_Palais/fichiersContribs/au-programme/expos-permanentes/mathematiques/Bloc_Formes/pdf_revue/359_nov_dec_2k8.pdf&lt;br /&gt;
#https://doi.org/10.1080/00029890.2002.11919849&lt;br /&gt;
&lt;br /&gt;
===[[Introduction à la complexité et sa formalisation]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; La notion de complexité d&#039;un programme est une abstraction du temps que va mettre le programme pour calculer son résultat. Plus qu&#039;une durée concrète, mesurée en secondes, il s&#039;agit avant tout de prédire le comportement du programme sur des paramètres de plus en plus grands. Des travaux assez récents développent des langages où la complexité peut être contrôlée directement. L&#039;objectif serait de découvrir sur des exemples simples la notion de complexité, et de regarder comment fonctionnent ces langages qui permettent de l&#039;internaliser.&lt;br /&gt;
&lt;br /&gt;
Ces langages utilisent un style de programmation assez différent des langages utilisé en L1 (comme Python) : ce sont des langages dits &#039;&#039;fonctionnels&#039;&#039;. La première partie du projet sera donc la découverte d&#039;un langage fonctionnel, [https://ocaml.org/ OCaml]. La seconde partie consistera à explorer le langage expérimental [https://github.com/jonsterling/agda-calf calf], le &#039;&#039;cost-aware logical framework&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
=== [[Surfaces polygonales et surfaces de subdivision]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
=== [[Calcul des valeurs de Grundy pour des jeux octaux]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
=== [[Planarité de graphes]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Calibration de caméra et reconstruction 3D]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Filage.png&amp;diff=16172</id>
		<title>Fichier:Filage.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Filage.png&amp;diff=16172"/>
		<updated>2026-01-07T16:25:45Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=16171</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=16171"/>
		<updated>2026-01-07T16:23:40Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Sujets proposés (2025-2026) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2024--2025: Pierre Hyvernat&lt;br /&gt;
* Responsable 2016--2024 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés (2025-2026) ==&lt;br /&gt;
&lt;br /&gt;
=== [[Classification de textes grâce à la compression]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; les IA modernes sont devenues très bonne pour *classifier* des textes : étant donné un texte (en français par exemple), il s&#039;agit de le relier à une catégorie dans un ensemble donné. Autan il est facile de distinguer une recette de cuisine d&#039;un pièce de théatre, la classification peut devenir plus complexe si l&#039;on souhaite distinguer des textes très courts, ou distinguer des niveaux de langage.&lt;br /&gt;
Les techniques habituelles reposent sur des réseaux de neurones profonds, mais des chercheurs ont récemment obtenu des résultats pouvant rivaliser avec ces techniques complexes et gourmandent en calcul en utilisant ... des algorithmes de compression !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre la problématique de classification de texte&lt;br /&gt;
* essayer de re-obtenir les résultats décrits dans l&#039;article en codant, en Python un petit programme de classification&lt;br /&gt;
* comparer les résultats obtenus avec différent algorithmes de compression&lt;br /&gt;
* [objectif secondaire] essayer de comparer les résultats obtenus avec des outils modernes plus classiques.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://arxiv.org/abs/2212.09410 Less is More: Parameter-Free Text Classification with Gzip]&lt;br /&gt;
&lt;br /&gt;
=== [[Filage d&#039;image et tracé de droites pour un rendu artistique]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Peut-être avez-vous déjà fait des créations artistiques en enfilant un long fil autour de clous placés sur une planche, en essayant de donner l&#039;illusion d&#039;une forme ou d&#039;une scène ? Nous allons nous intéresser au problème d&#039;approcher au mieux une image (en niveaux de gris) en passant un &amp;quot;fil&amp;quot; noir autour de &amp;quot;clous&amp;quot; disposés autour d&#039;une image blanche. Le fil noir partira d&#039;un clou et on devra décider à chaque étape le prochain clou où passer le fil et ainsi de suite. Au fur et à mesure, si on prend de bonnes décisions, on arrive à dessiner à peu près l&#039;image originale, avec un rendu artistique intéressant. Ce faisant, vous aurez appris à tracer des droites de pixels dans des images et codé un algorithme d&#039;optimisation glouton.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre le principe du filage d&#039;image et du tracé de droites discrètes&lt;br /&gt;
* Coder l&#039;algorithme pour des ensembles quelconques de clous (on commencera par disposer les clous sur les bords de l&#039;image). Il faudra comprendre comment on mesure une erreur de tracé pour une ligne donnée.&lt;br /&gt;
* Tester des variantes: 2 fils (1 blanc, 1 noir sur fond gris), rajouter des clous à l&#039;intérieur du cadre.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2024-2025 ==&lt;br /&gt;
&lt;br /&gt;
* [[Polyominos, pavages et solveurs SAT]] par ÉTienne MALABRE (tuteur: Pierre Hyvernat)&lt;br /&gt;
* [[Algorithmes de couplages parfaits et de mariages stables]] par Eddy GUYON (tuteur: Valentin Gledel)&lt;br /&gt;
* [[Stéganographie &amp;quot;BPC&amp;quot;]] par Hania BOUDJAJ (tuteur: Pierre Hyvernat)&lt;br /&gt;
* [[&amp;quot;tableau des suffixes&amp;quot; et transformée de Burrows-Wheeler]] par Benjamin BOGDAN (tuteur: Sébastien Tavenas)&lt;br /&gt;
* [[Jeu de la vie]] par Alexis ANTOINE (tuteur:  Romain Negro)&lt;br /&gt;
* [[Modèle proie-prédateur sans équations]] par Lucas DELAMEZIERE (tuteur: Mouloud Kessar)&lt;br /&gt;
* [[Où placer une (ou plusieurs) antennes 5G dans un village ?]] par Nils BRIFFOD (tuteur: Dorin Bucur)&lt;br /&gt;
* [[Introduction à la complexité et sa formalisation]] par Mael ALBRECHT (tuteur: Tom Hirschowitz)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
* [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Calcul des valeurs de Grundy pour des jeux octaux]] par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* [[Modélisation de la ruine du joueur]] par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* [[Calibration de caméra et reconstruction 3D]] par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2024-2025 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Polyominos, pavages et solveurs SAT]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; les polyominos sont, comme les pièces de Tetris, des assemblages de petits carrés collés par leurs bords. Un ensemble de polyomino &#039;&#039;pavent&#039;&#039; une forment lorsqu&#039;on peut la remplir avec des ces polyominos, sans chevauchement et sans trou. Il existe des algorithmes spécifiques pour vérifier si on peut paver une forme, mais il est également possible de transformer la question en une grosse formule booléenne qui exprime que chaque case se retrouve bien recouverte, que chaque polyomino a bien la bonne forme, etc. On peut alors utiliser un &#039;&#039;solveur SAT&#039;&#039; qui cherche les solutions pour une telle formule.&lt;br /&gt;
&lt;br /&gt;
En écrivant des formules un peu plus complexes, on peut essayer de calculer le nombre de [https://en.wikipedia.org/wiki/Heesch%27s_problem Heesch&#039;s problem] d&#039;un polyomino. Il s&#039;agit du nombre d&#039;anneaux que l&#039;on peut mettre autour d&#039;un polyomino donné. Par exemple, la figure suivante montre un polyomino avec nombre de Heesh égal à 1 : le polyomino est entouré d&#039;un anneau (composé de copies de lui même), et on ne peut pas ajouter de second anneau supplémentaire (sans chevauchement et sans trou).&lt;br /&gt;
&lt;br /&gt;
[[File:heesch.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Le plus grand nombre de Heesh fini connu est ... 6 ! (Mais il n&#039;est pas atteint par un polyomino.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Comprendre l&#039;utilisation d&#039;un solveur SAT, par exemple en codant la résolution de sudoku.&lt;br /&gt;
# Coder (en Python ?) la génération de la formule associée à un problème de pavage, et la transformation d&#039;une solution booléenne en image finale.&lt;br /&gt;
# Coder (en Python ?) la génération de la formule associée à la question &amp;quot;le nombre de Heesh de ce polyomino est au moins égal à H&amp;quot;, et la transformation d&#039;une solution en image finale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tt&amp;gt;TODO: ref sur les solveur SAT&amp;lt;/tt&amp;gt;&lt;br /&gt;
# G. Kaplan, Heesch Numbers of Unmarked Polyforms : [https://isohedral.ca/heesch-numbers-of-unmarked-polyforms/ blog], [https://arxiv.org/pdf/2105.09438 article]&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes de couplages parfaits et de mariages stables]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un [https://fr.wikipedia.org/wiki/Th%C3%A9orie_des_graphes graphe] est un ensemble de sommets et un ensemble d’arêtes sur ces sommets. Un [https://fr.wikipedia.org/wiki/Couplage_(th%C3%A9orie_des_graphes) couplage] dans un graphe est un ensemble d&#039;arêtes C, tels que toute paire d&#039;arête de C n&#039;a aucun sommet en commun. Un couplage est dit parfait s&#039;il touche tous les sommets du graphe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Graph.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Matching1.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Matching2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un couplage dans ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un couplage parfait dans ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les algorithmes d&#039;[https://fr.wikipedia.org/wiki/Algorithme_d%27Edmonds_pour_les_couplages Edmonds] et de [https://fr.wikipedia.org/wiki/Algorithme_de_Hopcroft-Karp Hopcroft-Karp] sont des algorithmes de recherche de couplage dans des graphes. &lt;br /&gt;
&lt;br /&gt;
Si le graphe que dans lequel on cherche un couplage correspond à un graphe d&#039;affectation avec des préférences, on se retrouve dans le cas du [https://fr.wikipedia.org/wiki/Probl%C3%A8me_des_mariages_stables problème des mariages stables]. C&#039;est par exemple le cas de l&#039;affectation des places dans l&#039;enseignement supérieur où il faut affecter des étudiants dans les différents établissements de tels sorte à respecter les choix des étudiants et des établissements. L&#039;[https://fr.wikipedia.org/wiki/Algorithme_de_Gale_et_Shapley algorithme de Gale et Shapley] permet de résoudre efficacement ce problème.&lt;br /&gt;
&lt;br /&gt;
Dans ce sujet, il est proposé de ce pencher sur ces différents problèmes et d&#039;implémenter les algorithmes de résolutions présentés.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# comprendre le problème du mariage stable,&lt;br /&gt;
# implémenter les algorithmes de Gale-Shapley,&lt;br /&gt;
# implémenter les algorithmes de Hopcroft-Karp,&lt;br /&gt;
# comprendre la preuve de correction de l&#039;algorithme de Hopcroft-Karp,&lt;br /&gt;
# implémenter l&#039;algorithme d&#039;Edmonds.&lt;br /&gt;
# éventuellement implémenter d&#039;autres algorithmes liés aux couplages parfaits comme l&#039;algorithme hongrois ou l&#039;algorithme de Christofides.&lt;br /&gt;
&lt;br /&gt;
=== [[Stéganographie &amp;quot;BPC&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; la [https://fr.wikipedia.org/wiki/St%C3%A9ganographie stéganographie] consiste à dissimuler de l&#039;information dans un message d&#039;apparence anodine. On peut par exemple modifier légèrement les couleurs des pixels d&#039;une image, on l&#039;intensité des sons d&#039;une fichier sonore de manière imperceptible par un humain. Les destinataires peuvent alors récupérer cette information caché en appliquant la méthode inverse.&lt;br /&gt;
&lt;br /&gt;
La méthode la plus simple consiste à utiliser le bit de poids faible des couleurs RVB de chaque pixel d&#039;une image. La différence visuelle est tellement petite qu&#039;on ne peut pas la distinguer à l’œil nu. Par exemple, les deux couleurs suivantes sont différentes uniquement sur les bits de poids faible des composantes RVB.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:bleu1.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:bleu2.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;#237fd1&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;#227ed0&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour augmenter la quantité de données que l&#039;on peut dissimuler, on peut utiliser les 2 bits de poids faible, ou les 3 bits de poids faible, etc. Plus on utilise de bits, plus les distorsions dans l&#039;image deviennent visibles. Une manière plus intelligente est de ne remplacer des bits que dans les endroits &amp;quot;bruités&amp;quot; de l&#039;image. Les distorsions deviennent alors plus difficiles à distinguer. C&#039;est la stéganographie &amp;quot;complexité des plans de bits&amp;quot; (BPCS = &amp;quot;Bit Plane Complexity Steganography&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;exemple suivant, l&#039;intégralité des 9605 lignes / 37860 mots / 239347 octets (avant compression) de la pièce &amp;quot;Cyrano de Bergerac&amp;quot; est dissimulée dans l&#039;image de gauche.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:image-orig.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:LSBS.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:BPCS.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;image [https://pixabay.com/fr/photos/montagnes-lac-nature-paysage-hiver-8025144/ originale]&amp;lt;br&amp;gt;(320x240 pixels)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;stéganographie LSB&amp;lt;br&amp;gt;(avec les 3 bits de poids faible)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;stéganographie BPC &amp;lt;br&amp;gt;(paramètres &amp;lt;tt&amp;gt;0,10,20,30,999,999,999,999&amp;lt;/tt&amp;gt;)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Si vous regardez attentivement, les pixels du ciel ou de la surface de l&#039;eau sont nettement plus modifiés dans l&#039;image centrale que dans l&#039;image de droite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter (par exemple en Python) la stéganographie par bits de poids faible sur des images,&lt;br /&gt;
# comprendre et implémenter la stéganographie par plans de complexité,&lt;br /&gt;
# comparer les 2 approches sur des exemples&lt;br /&gt;
# si le temps le permet, regarder les technique de &amp;quot;stéganalyse&amp;quot; qui permettent de détecter la présence d&#039;informations dissimulées dans une image.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# [https://web.archive.org/web/20120905034757/http://www.eece.maine.edu/~eason/steg/SPIE98.pdf Principle and applications of BPCS-Steganography]&lt;br /&gt;
# [https://web.archive.org/web/20110815205714/http://etd.lib.ttu.edu/theses/available/etd-06272008-31295018922590/unrestricted/31295018922590.pdf High capacity data hiding system using BPCS steganography]&lt;br /&gt;
&lt;br /&gt;
=== [[&amp;quot;tableau des suffixes&amp;quot; et transformée de Burrows-Wheeler]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le [https://fr.wikipedia.org/wiki/Tableau_des_suffixes tableau des suffixes] est une structure de données qui permet de répondre très rapidement à des requêtes du style &amp;quot;est-ce que la chaine &#039;&#039;p&#039;&#039; apparait dans la chaine &#039;&#039;S&#039;&#039; ?&amp;quot; La chaine &#039;&#039;p&#039;&#039; pourrait être une &amp;quot;petite&amp;quot; chaine de quelques milliers de caractères, alors que la chaine &#039;&#039;S&#039;&#039; pourrait être une &amp;quot;grosse&amp;quot; chaine de plusieurs milliard de caractères. Les biologistes utilisent des requêtes de ce genre lorsqu&#039;ils recherchent des motifs &#039;&#039;p&#039;&#039; dans l&#039;ADN &#039;&#039;S&#039;&#039;. Lorsque &#039;&#039;S&#039;&#039; ne change pas, l&#039;arbre des suffixes permet de répondre à la requête précédente avec un nombre d&#039;opérations beaucoup plus faible que la recherche naïve qui devrait regarder tous les caractères de &#039;&#039;S&#039;&#039; !&lt;br /&gt;
&lt;br /&gt;
Cette structure de données est également reliée à la transformée de Burrows-Wheeler, à la base de l&#039;algorithme de compression &amp;lt;tt&amp;gt;bzip&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# Le calcul naïf du tableau des suffixes se fait en quelques lignes de Python. Le premier objectif sera d&#039;utiliser cette version pour expérimenter avec les algorithmes de recherche simples sur le tableaux des suffixes, et de comparer les temps d&#039;exécution avec ceux des algorithmes standard. &lt;br /&gt;
# Transformer un tableau de suffixes en transformée de Burrows-Wheeler est également l&#039;affaire de quelques lignes de Python. Le second objectif sera donc de coder les quelques fonctionnalités manquantes pour compresser, et décompresser des chaines de caractères ; et de comparer ceci avec d&#039;autres algorithmes existants.&lt;br /&gt;
# le tableau des suffixes est plus petit que l&#039;arbre des suffixes (variante un peu plus rapide, mais plus complexe), et la transformée de Burrows-Wheeler est encore plus petite. L&#039;idée serait de comprendre d&#039;où viennent ces différences et comment passer d&#039;une structure à l&#039;autre, et comment les améliorer.&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# les liens wikipédia (plutôt en anglais) cités ci dessus sont un bon début&lt;br /&gt;
# [https://www.cs.jhu.edu/~langmea/resources/bwt_fm.pdf Introduction to the Burrows-Wheeler Transform and FM Index]&lt;br /&gt;
# les [https://www.youtube.com/playlist?list=PL2mpR0RYFQsDFNyRsTNcWkFTHTkxWREeb vidéos de Ben Langmead] sur le sujet&lt;br /&gt;
# Dan Gusfield, &#039;&#039;Algorithms on Strings, Trees and Sequences&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===[[le problème du collectionneur]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutrice :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; un collectionneur cherche à avoir toutes les vignettes d’une série&lt;br /&gt;
représentant des joueurs de foot. Chaque vignette représente un joueur,&lt;br /&gt;
il y a en tout &#039;&#039;N&#039;&#039; joueurs. Pour avoir une vignette, on doit acheter un&lt;br /&gt;
paquet de céréales. Chaque paquet de céréales contient une vignette&lt;br /&gt;
choisie de manière uniforme et indépendante au hasard parmi ces &#039;&#039;N&#039;&#039;&lt;br /&gt;
possibilités. Combien faudra t il en moyenne acheter de paquets de&lt;br /&gt;
céréales afin d&#039;obtenir toute la série des &#039;&#039;N&#039;&#039; joueurs de foot?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
# Ecrire un programme qui simule l&#039;expérience&lt;br /&gt;
# en déduire une approximation le nombre moyen de paquets de céréales à acheter&lt;br /&gt;
# Résoudre le problème théoriquement&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
https://fr.wikipedia.org/wiki/Probl%C3%A8me_du_collectionneur_de_vignettes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Jeu de la vie]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Romain Negro&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le [https://fr.wikipedia.org/wiki/Jeu_de_la_vie jeu de la vie] est un [https://fr.wikipedia.org/wiki/Automate_cellulaire automate cellulaire] inventé dans les années 70 par John Conway dont les&lt;br /&gt;
règles sont simples, mais dont des comportements macroscopiques complexes peuvent apparaître. Des simples structures immobiles aux structures semblant dotées d&#039;intelligence, le jeu de la vie est&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Turing-complet Turing-complet].&lt;br /&gt;
&lt;br /&gt;
Le jeu de la vie se présente ainsi : sur une grille infinie, il y a des cellules vivantes ou mortes. A chaque étape, chaque cellule naît, reste en vie ou meurt en fonction de son 8-voisinage. Une cellule naît si&lt;br /&gt;
exactement 3 de ses voisins sont vivants. Une cellule reste en vie son état si celle-ci a entre 2 et 3 voisins vivants. Dans les autres cas, la cellule meurt.&lt;br /&gt;
&lt;br /&gt;
Afin de faire fonctionner cet automate, l&#039;approche naïve consiste à chaque étape à calculer pour chaque cellule son état suivant. Cependant, celle-ci ne fonctionne que sur une grille finie et n&#039;est pas très&lt;br /&gt;
efficace pour de plus grandes grilles.&lt;br /&gt;
&lt;br /&gt;
Certaines approches permettent de travailler sur des grilles de taille infinie (en théorie), voire de pouvoir rapidement se déplacer de plusieurs étapes dans le temps. D&#039;autres approches permettent même de&lt;br /&gt;
s&#039;affranchir de la notion de grille et d&#039;étapes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter (en Python ou Javascript) une version naïve du jeu de la vie sur une grille finie,                                                                                                                    &lt;br /&gt;
# proposer une implémentation permettant d&#039;effectuer la simulation sur une grille infinie,                                                                                                                          &lt;br /&gt;
# comprendre et si le temps le permet implémenter la simulation en utilisant une approche en arbre.                                                                                                                 &lt;br /&gt;
# s&#039;il reste encore du temps, comprendre comment fonctionne l&#039;approche continue du jeu de la vie                                                                                                                    &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# Liens wikipédia cités dans le résumé                                                                                                                                                                              &lt;br /&gt;
# [https://johnhw.github.io/hashlife/index.md.html Implémentation utilisant des arbres]                                                                                                                             &lt;br /&gt;
# [https://arxiv.org/pdf/2005.03742 Lenia : jeu de la vie &amp;quot;continu&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Modèle proie-prédateur sans équations]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
les équations de prédation de Lotka-Volterra sont relativement simples sur le plan mathématiques et permettent d&#039;étudier l&#039;évolution d&#039;une population de proies (typiquement des lapins) et de prédateurs (typiquement des renards). Avec le bon jeu de paramètres, on peut observer des cycles dans le nombre de proies et de prédateurs. L&#039;objectif de ce projet est d&#039;observer de tels cycles sans utiliser d&#039;équations, mais des déplacements aléatoires sur une grille à deux dimensions.&lt;br /&gt;
&lt;br /&gt;
Les règles de base sont les suivantes:&lt;br /&gt;
*A chaque itération, chaque individu se déplace d&#039;une case dans une direction aléatoire(haut/bas/droite/gauche).&lt;br /&gt;
*Les proies sont mangées par les prédateurs lorsqu&#039;elles se retrouvent au même endroit que l&#039;un d&#039;eux.&lt;br /&gt;
*Les proies(respectivement prédateurs) voient leur population doubler toute les &amp;lt;tt&amp;gt;nr_proie&amp;lt;/tt&amp;gt; (resp. &amp;lt;tt&amp;gt;nr_pred&amp;lt;/tt&amp;gt;) itérations.&lt;br /&gt;
*On suppose que les proies ont toujours à manger.&lt;br /&gt;
*Si un prédateur n&#039;a pas mangé pendant &amp;lt;tt&amp;gt;n_faim&amp;lt;/tt&amp;gt; itérations, il meurt.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du projet est le suivant:&lt;br /&gt;
&lt;br /&gt;
#Ecrire un programme en python qui suit les règles de base.&lt;br /&gt;
#Visualiser l&#039;évolution du nombre de proies et de prédateurs en fonction du temps, pour différentes valeurs de &amp;lt;tt&amp;gt;nr_proie&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;nr_pred&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;n_faim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Remarque :&#039;&#039; Des précisions supplémentaires seront discutées avec le tuteur au faire et à mesure de l&#039;avancement du projet pour concrétiser l&#039;implémentation des règles de base.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;références:&#039;&#039;&#039;&lt;br /&gt;
#[https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra Les équations de prédation de Lotka-Volterra]&lt;br /&gt;
#Exemple de déplacement aléatoire: [https://fr.wikipedia.org/wiki/Mouvement_brownien Le Mouvement Brownien]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Où placer une (ou plusieurs) antennes 5G dans un village ?]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Dorin Bucur&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Cette question, présentée ici de manière simplifiée, est très importante et&lt;br /&gt;
apparaît sous différentes formes dans la planification économique. Sa&lt;br /&gt;
modélisation repose sur des notions mathématiques relativement simples, et sa&lt;br /&gt;
résolution implique généralement l&#039;utilisation d&#039;algorithmes numériques&lt;br /&gt;
d&#039;optimisation. De manière simple, on devra chercher à positionner un certain&lt;br /&gt;
nombre de points dans un ensemble donné du plan, de telle manière à ce que la&lt;br /&gt;
moyenne de la distance à l&#039;ensemble des points soit minimale.&lt;br /&gt;
&lt;br /&gt;
En s’appuyant sur les deux références fournies, l’étudiant devra :&lt;br /&gt;
&lt;br /&gt;
*Ecrire un modèle mathématique associé à ce problème&lt;br /&gt;
*Comprendre le rôle des diagrammes de Voronoï&lt;br /&gt;
*Effectuer une analyse élémentaire de quelques cas simples (par exemple : une antenne dans un village circulaire, deux antennes dans le même village, etc.)&lt;br /&gt;
*Proposer une méthode de résolution numérique en développant un algorithme d&#039;optimisation de type gradient, implémenté en Python.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références:&#039;&#039;&#039;&lt;br /&gt;
#https://www.palais-decouverte.fr/fileadmin/fileadmin_Palais/fichiersContribs/au-programme/expos-permanentes/mathematiques/Bloc_Formes/pdf_revue/359_nov_dec_2k8.pdf&lt;br /&gt;
#https://doi.org/10.1080/00029890.2002.11919849&lt;br /&gt;
&lt;br /&gt;
===[[Introduction à la complexité et sa formalisation]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; La notion de complexité d&#039;un programme est une abstraction du temps que va mettre le programme pour calculer son résultat. Plus qu&#039;une durée concrète, mesurée en secondes, il s&#039;agit avant tout de prédire le comportement du programme sur des paramètres de plus en plus grands. Des travaux assez récents développent des langages où la complexité peut être contrôlée directement. L&#039;objectif serait de découvrir sur des exemples simples la notion de complexité, et de regarder comment fonctionnent ces langages qui permettent de l&#039;internaliser.&lt;br /&gt;
&lt;br /&gt;
Ces langages utilisent un style de programmation assez différent des langages utilisé en L1 (comme Python) : ce sont des langages dits &#039;&#039;fonctionnels&#039;&#039;. La première partie du projet sera donc la découverte d&#039;un langage fonctionnel, [https://ocaml.org/ OCaml]. La seconde partie consistera à explorer le langage expérimental [https://github.com/jonsterling/agda-calf calf], le &#039;&#039;cost-aware logical framework&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
=== [[Surfaces polygonales et surfaces de subdivision]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
=== [[Calcul des valeurs de Grundy pour des jeux octaux]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
=== [[Planarité de graphes]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Calibration de caméra et reconstruction 3D]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=16170</id>
		<title>VISI401 CMI : bibliographie scientifique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=16170"/>
		<updated>2026-01-07T16:06:16Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Synthèse de texture et transfert de texture par matelassage d&amp;#039;images */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable:&lt;br /&gt;
* 2017--2021 : Jacques-Olivier Lachaud&lt;br /&gt;
* 2022-- : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
Ce module amène l&#039;étudiant à effectuer des recherches bibliographiques sur un sujet donné, et à synthétiser ses résultats sous la forme d&#039;un exposé construit.&lt;br /&gt;
&lt;br /&gt;
L&#039;étudiant, à partir d&#039;un sujet et d&#039;un ou plusieurs articles initiaux, doit approfondir le sujet, appréhender son historique, ses évolutions, et son état actuel. &lt;br /&gt;
&lt;br /&gt;
A côté des ressources fournies par les bibliothèques, quelques pointeurs très utiles pour faire des recherches bibliographiques:&lt;br /&gt;
* [https://scholar.google.fr Scholar Google] (libre)&lt;br /&gt;
* [https://researchgate.net ResearchGate] (libre)&lt;br /&gt;
* [https://mathscinet.ams.org/mathscinet/ MashSciNet] (plus math)&lt;br /&gt;
* [https://www.springerlink.com  Springer] (accès via USMB)&lt;br /&gt;
* [https://www.sciencedirect.com Elsevier Sciencedirect] (accès via USMB)&lt;br /&gt;
* SciHub lorsqu&#039;on ne trouve pas&lt;br /&gt;
&lt;br /&gt;
La synthèse bibliographique se fait en interaction avec le tuteur par des visites régulières et/ou des compte-rendus d&#039;avancement par email. La synthèse finale fait l&#039;objet d&#039;un exposé final (15-20 minutes + questions) et d&#039;un document de présentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2025-2026 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Synthèse de texture et transfert de texture par matelassage d&#039;images]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; La synthèse de texture est le procédé qui vise à générer une nouvelle image à partir d&#039;une ou plusieurs (petites) images modèles, en donnant l&#039;impression que cette nouvelle image suit les propriétés structurelles, colorimétriques et statistiques de l&#039;image originelle. C&#039;est très utilisé en synthèse d&#039;image pour générer de grandes textures à partir de petits échantillons. On se propose d&#039;étudier et d&#039;implémenter un algorithme assez simple mais assez efficace appelé &amp;lt;i&amp;gt;image quilting&amp;lt;/i&amp;gt; pour faire de la génération de texture. Il se base sur de simples recherches de sous-images dans l&#039;image original, en superposant au mieux les sous-images. L&#039;algorithme peut même servir à du transfert de textures. Le langage de développement est au choix.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre la méthode d&#039;image quilting, voir le papier d&#039;Efros et Freeman, Siggraph&#039;2001&lt;br /&gt;
* implémenter dans un premier temps la méthode simple qui parcourt l&#039;image en scan-line et recherche la meilleure sous-image avec un overlap choisi.&lt;br /&gt;
* dans un 2e temps, implémenter la méthode de découpe optimale entre 2 sous-images superposées&lt;br /&gt;
* dans un 3e temps, implémenter le transfert de texture&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;References&#039;&#039;&#039;&lt;br /&gt;
* [[http://graphics.cs.cmu.edu/people/efros/research/quilting.html Efros et Freeman, Siggraph&#039;2001]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:imagequilting.gif|400px]][[Fichier:Quiltingtransfer.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[le bytecode Python]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; Python est un langage &amp;quot;interprété&amp;quot;. Un programme Python n&#039;est jamais directement transformé en suite d&#039;instructions pour le processeur sur lequel il doit s&#039;exécuter. C&#039;est l&#039;interpréteur qui va, lors de l&#039;exécution, regarder les instructions Python pour les exécuter. Pour éviter que le passage par cet intermédiaire prenne trop de temps, le programme Python est d&#039;abord transformé en un &amp;quot;langage intermédiaire&amp;quot; appelé &amp;quot;bytecode&amp;quot;. Ce langage est une espèce de langage d&#039;assemblage propre à Python. Les instructions sont beaucoup plus simples à exécuter que les instructions &amp;quot;haut niveau&amp;quot; et sont identiques pour tous les processeurs.&lt;br /&gt;
&lt;br /&gt;
L&#039;outils principal pour étudier le bytecode python est le module &amp;lt;tt&amp;gt;dis&amp;lt;/tt&amp;gt; (comme &amp;lt;tt&amp;gt;dis&amp;lt;/tt&amp;gt;assembler) de la version usuelle de Python (CPython).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre la différence entre les langages compilé et interprétés&lt;br /&gt;
* comprendre globalement le mécanisme de transformation d&#039;un programme Python en bytecode&lt;br /&gt;
* étudier le bytecode produit sur des exemples particuliers et pertinents (&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;, concaténation, &amp;lt;tt&amp;gt;append&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== [[Peut-on calculer(efficacement) une transformation de Fourier Rapide sur GPU ]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Mouloud Kessar &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039;&lt;br /&gt;
En traitement du signal, ainsi que pour les simulations numériques, les transformations de Fourier rapides sont extrêmement répandues. L&#039;algorithme de Cooley-Tukey publié en 1965 réduit la complexité du calcul d&#039;une transformée de Fourier discrète à 0(nlog(n)), contre O(n2) pour une implémentation native. Sur CPU, la librairie la plus répandue est FFTW (Fastest Fourier Transform in the West). De nombreuses librairies existent sur GPU pour le calcul des FFT. Malgré tout, pour les simulations numériques en mécanique des fluides, ce sont les transformations de Fourier qui peuvent rendre délicat le portage de codes sur GPU.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* De comprendre les différences de la programmation sur GPU par rapport au CPU.&lt;br /&gt;
* Faire un travail bibliographique pour donner des perspectives d’améliorations dans le cas des FFT.&lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, on essaiera:&lt;br /&gt;
* de Paralléliser un code( c++) déjà existant à l&#039;aide d&#039;OpenMP&lt;br /&gt;
* de porter un code( c++) déjà existant sur GPU à l&#039;aide d&#039;OpenMP GPU&lt;br /&gt;
* de déterminer s&#039;il y a des contextes dans lesquels le code est plus efficace sur GPU ou CPU.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références:&#039;&#039;&#039;&lt;br /&gt;
* La page wikipedia des FFT https://fr.wikipedia.org/wiki/Transformation_de_Fourier_rapide&lt;br /&gt;
* les supports de cours de l&#039;IDRIS  http://www.idris.fr/formations/supports_de_cours.html&lt;br /&gt;
&lt;br /&gt;
== sujets 2024-2025 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes de colorations de graphes]] ===&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; Un [https://fr.wikipedia.org/wiki/Th%C3%A9orie_des_graphes graphe] est un ensemble de sommets et un ensemble d’arêtes sur ces sommets. Une [https://fr.wikipedia.org/wiki/Coloration_de_graphe coloration propre] d&#039;un graphe est une assignation de couleurs à chaque sommet du graphe telle que chaque paire de sommets reliée par une arête a des couleurs différentes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Graph.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Coloration.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Impropre.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Une coloration propre de ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Une coloration impropre du graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Connaître le nombre minimum de couleurs permettant de colorer proprement un graphe est un problème NP-difficile. Cependant, il existe des algorithmes de coloration de graphe permettant de trouver une coloration propre en fonction du nombre de voisins maximums d&#039;un sommet. L&#039;objectif de ce sujet est d&#039;implémenter certains de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter l&#039;algorithme de coloration glouton d&#039;un graphe&lt;br /&gt;
# implémenter l&#039;amélioration de cet algorithme en utilisant la dégénérescence du graphe&lt;br /&gt;
# implémenter l&#039;algorithme issus du théorème de Brooks&lt;br /&gt;
# éventuellement, implémenter un algorithme de coloration d&#039;arêtes&lt;br /&gt;
# éventuellement, implémenter un algorithme de transformation du problème SAT en problème de coloration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de Ukkonen / algorithme SA-IS]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; L&#039;arbre des suffixes est une structure de données qui permet de répondre très rapidement à de nombreuses requêtes du style &amp;quot;est-ce que la chaine &#039;&#039;p&#039;&#039; apparait dans la chaine &#039;&#039;S&#039;&#039; ?&amp;quot; La chaine &#039;&#039;p&#039;&#039; pourrait être une &amp;quot;petite&amp;quot; chaine de quelques milliers de caractères, alors que la chaine &#039;&#039;S&#039;&#039; pourrait être une &amp;quot;grosse&amp;quot; chaine de plusieurs milliard de caractères. Lorsque la chaine &#039;&#039;S&#039;&#039; est fixe, cette recherche se fait en un temps proportionnel à la taille de &#039;&#039;p&#039;&#039;, indépendamment de la taille de &#039;&#039;S&#039;&#039; ! Ce qui rend ceci possible est le précalcul de l&#039;arbre des suffixes de &#039;&#039;S&#039;&#039;, une fois pour toute. Si on fait ce précalcul de manière naïve, il prend un temps proportionnel à la taille de &#039;&#039;S&#039;&#039; &#039;&#039;&#039;au carré&#039;&#039;&#039;. Lorsque &#039;&#039;S&#039;&#039; contient des milliards de caractéres, ceci n&#039;est pas raisonnable.&lt;br /&gt;
&lt;br /&gt;
L&#039;algorithme de Ukkonen permet de calculer l&#039;arbre des suffixes en un temps proportionnel à la taille de &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# comprendre la structure d&#039;arbre des suffixes&lt;br /&gt;
# coder une version naïve du calcul de l&#039;arbre des suffixes&lt;br /&gt;
# comprendre et coder une version de l&#039;algorithme de Ukkonen, et comparer les temps de calcul&lt;br /&gt;
# si le temps le permet, comprendre l&#039;algorithme SA-IS qui permet de construite le tableau des suffixes en un temps proportionnel à la taille de &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# les [https://www.youtube.com/playlist?list=PL2mpR0RYFQsDFNyRsTNcWkFTHTkxWREeb vidéos de Ben Langmead] sur les arbres de suffixes (vidéos 1 -- 9)&lt;br /&gt;
# description de l&#039;algoritme de Ukkonen dans Dan Gusfield, &#039;&#039;Algorithms on Strings, Trees and Sequences&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Approximations d&#039;Euler et Runge-Kutta pour la modélisation du problème à 3 corps===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
en astronomie, la modélisation du problème à N corp est un enjeu majeur. Il est indispensable pour l&#039;exploration spatiale, notamment pour l&#039;envoie de sonde sur Mars, ou&lt;br /&gt;
Titan (Lune de Jupiter).&lt;br /&gt;
&lt;br /&gt;
Les équations décrivant le problème à N corps existent depuis de nombreuses années, mais les mathématiciens et les physiciens ne savent pas les résoudre analytiquement.&lt;br /&gt;
&lt;br /&gt;
Des codes de calcul existent pour réaliser des simulations du système solaire.&lt;br /&gt;
&lt;br /&gt;
D&#039;un point de vue algorithmique, le point clef se situe dans l&#039;approximation choisie pour les dérivées en temps.&lt;br /&gt;
&lt;br /&gt;
Une approximation à l&#039;aide d&#039;une méthode type Euler ou Runge-Kutta va avoir un ordre de précision prédéfini.&lt;br /&gt;
&lt;br /&gt;
Toutes ces approximations ne se valent pas, et une analyse rigoureuse de la fiabilité de ces méthodes est nécessaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; il n&#039;est pas nécessaire de connaître les méthodes numériques au préalables car elles seront introduites et développées dans un cadre simple au fur et à mesure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre le fonctionnement de l&#039;approximation d&#039;une dérivée par une méthode numérique (type Euler et Runge-Kutta d&#039;ordre 2)&lt;br /&gt;
* Développer  un programme permettant de  prédire les mouvements des corps suivants: Jupiter, La Terre, et Le Soleil&lt;br /&gt;
* Mesurer l&#039;ordre de précision des deux méthodes numériques implémentées, et comparer à l&#039;ordre théorique.&lt;br /&gt;
* Si le temps le permet:&lt;br /&gt;
** Ajouter les schémas  Runge-Kutta 4 et 6&lt;br /&gt;
** modifier le code pour inclure Mars, Venus et Mercure&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
# La formulation générale du problème à N-corp est donnée ici: https://en.wikipedia.org/wiki/N-body_problem&lt;br /&gt;
# Ce type d&#039;étude peut devenir autrement plus complexe que la version présentée ici. Dans le film &amp;quot;The Martian&amp;quot; , un astronaute est piégé sur Mars, et son équipe qui était en route pour la terre doit venir le récupérer. Le centre de calcul &amp;quot;Pléiades&amp;quot; de la NASA est présenté, et utilisé pour déterminer s&#039;il est possible de renvoyer le vaisseau spatial récupérer l&#039;astronaute, notamment à l&#039;aide d&#039;une fronde gravitationnelle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Programmation graphique sur GPU]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé et objectifs :&#039;&#039;&#039; les cartes graphiques modernes permettent l&#039;affichage de millions de polygones avec des rendus presque réalistes en temps réel.&lt;br /&gt;
L&#039;objectif de ce sujet est de découvrir la modélisation 3D, puis les programmations spécifiques des vertex et fragment shaders pour réaliser certains types d&#039;effet (camera,&lt;br /&gt;
transformations géométriques, illumination, textures, halos, stylisations, incrustations).&lt;br /&gt;
Le pipeline OpenGL sera étudié, et accédé via WebGL/javascript/three.js. Dans une 2eme partie, certains shaders de shadertoy.com seront étudiés plus en détails, afin de&lt;br /&gt;
comprendre les nombreuses astuces utilisées par les experts du domaine pour faire des effets impressionnants en temps réel.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque :&#039;&#039;&#039; sujet discuté avec Vetea Stoll&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Magic Numbers et Jeux Vidéo]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé et objectifs :&#039;&#039;&#039; les magic numbers sont souvent considérés comme une mauvaise pratique en&lt;br /&gt;
programmation. Cependant, l&#039;algorithme emblématique de la racine carrée inverse rapide,&lt;br /&gt;
utilisé dans les moteurs de jeux vidéo comme Quake III Arena, justifie&lt;br /&gt;
l&#039;utilisation du fameux 0x5f3759df.&lt;br /&gt;
Ce sujet propose d&#039;étudier cet algorithme, ainsi que des sujets connexes.&lt;br /&gt;
&lt;br /&gt;
Travail à réaliser :&lt;br /&gt;
* Expliquer le fonctionnement détaillé de l&#039;algorithme.&lt;br /&gt;
* Comparer avec la méthode de Newton-Raphson&lt;br /&gt;
* Expliquer les applications pratiques&lt;br /&gt;
* Comparer les performances en temps d&#039;exécution et en mémoire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Indexation dans les Bases de Données]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sujet :&#039;&#039;&#039; en bases de données, les index sont essentiels pour accélérer les requêtes,&lt;br /&gt;
mais ils impliquent des compromis entre performance, espace et coût de&lt;br /&gt;
maintenance.&lt;br /&gt;
Dans ce sujet, vous étudierez les types d&#039;index (B-tree, Hash, etc.), leur&lt;br /&gt;
impact sur les requêtes et les modifications (``INSERT``, ``UPDATE``, ``DELETE``).&lt;br /&gt;
&lt;br /&gt;
Travail à réaliser :&lt;br /&gt;
* Expliquer les structures d’index (B-tree, Hash).&lt;br /&gt;
* Expliquer les différents cas d&#039;usage&lt;br /&gt;
* Expliquer l’impact des index sur les performances des requêtes (``SELECT WHERE``).&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ressource pour commencer :&#039;&#039;&#039;&lt;br /&gt;
# &amp;quot;Bases de données : concepts, utilisation et développement&amp;quot;, Jean-Luc Hainaut, chapitre 4 (disponible à la BU)&lt;br /&gt;
&lt;br /&gt;
== sujets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Génération de labyrinthes &amp;quot;organiques&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; la génération de labyrinthes est un problème classique, notamment abordé dans les cours d&#039;algorithmes de graphes. Ces méthodes permettent de générer des labyrinthes sur des &#039;&#039;grilles&#039;&#039;, typiquement carrées :&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze_grid.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
La création de labyrinthe &amp;quot;organiques&amp;quot;, du style&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
utilise une méthode très différente. Les détails sont décrits dans un article publié en  2006: http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf. La description peut sembler très abstraite, mais l&#039;idée initiale est assez simple : une courbe initiale est, petit à petit, déformée aléatoirement.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; comprendre la méthode de base, et l&#039;implémenter pour générer des labyrinthes organiques. La première version pourra être codée en Python, mais comme la méthode nécessite une &#039;&#039;grosse&#039;&#039; quantité de calculs, il pourra être intéressant de coder une seconde version en utilisant un langage compilé si l&#039;on souhaite obtenir de &amp;quot;gros&amp;quot; labyrinthes. De nombreuses améliorations sont décrites dans l&#039;article de H. Pedersen et K. Singh, et il serait intéressant de d&#039;en implémenter certaines, soient en Python (en les testant sur de petits labyrinthes) soit dans un autre langage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039; Hans Pedersen et Karan Singh, &#039;&#039;Organic Labyrinths and Mazes&#039;&#039;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== Tramage artistique d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le tramage d&#039;une image (en anglais *dithering* ou *half-toning*) consiste à esquisser une image en niveaux de gris ou en couleur à l&#039;aide de très peu d&#039;encres ou couleurs différentes. Historiquement, l&#039;utilisation la plus courante est en impression: un fax ne dispose que d&#039;une encre noire (donc 2 couleurs noir et blanc pour transférer une image), les imprimantes n&#039;ont que 4 encres (et donc cinq couleurs jaune, cyan, magenta, noir et le blanc du papier). Les premiers ordinateurs avaient des écrans avec très peu de couleurs, donc les photos étaient approchées avec 8 ou 16 couleurs. &lt;br /&gt;
&lt;br /&gt;
En informatique, les algorithmes de tramage par diffusion d&#039;erreur [https://fr.wikipedia.org/wiki/Algorithme_de_Floyd-Steinberg#:~:text=L%27algorithme%20de%20Floyd%2DSteinberg,un%20pixel%20à%20ses%20voisins. Floyd-Steinberg] sont faciles à implémenter et rapide, donc très utilisés.&lt;br /&gt;
&lt;br /&gt;
Néanmoins, il existe des algorithmes qui donnent des résultats beaucoup plus jolis, notamment celui proposé par Ostromoukhov et Hersch (1999). Nous proposons de l&#039;étudier et de l&#039;implémenter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-david.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-photo.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Floyd-Steinberg&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Ostromoukhov-Hersch&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre les principes du tramage, éventuellement coder en python/opencv l&#039;algorithme basique. Comprendre ensuite l&#039;algorithme d&#039;Ostromoukhov et Hersch (1999), et l&#039;implémenter en python, d&#039;abord en noir et blanc, et si le temps le permet, en couleur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://dl.acm.org/doi/pdf/10.1145/311535.311605 Ostromoukhov et Hersch, Multi-Color and Artistic Dithering, ACM SIGGRAPH 1999]&lt;br /&gt;
* [https://opencv.org OpenCV], pratique pour lire une image, l&#039;afficher, faire des traitements.&lt;br /&gt;
&lt;br /&gt;
=== Rendu réaliste de scènes 3D par lancer de rayons ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note : &#039;&#039;&#039; Sujet demandé par Lukas Rey.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le rendu réaliste de scène 3D a été (et reste) un des objectifs majeurs de l&#039;informatique graphique, notamment grâce à ses nombreuses applications dans différents domaines : le cinéma (effets spéciaux), mais aussi le marketing, la publicité, l&#039;architecture, ou l&#039;art. L&#039;algorithme le plus utilisé est appelé &amp;quot;lancer de rayons&amp;quot;, avec un objectif de simuler le trajet des rayons lumineux dans une scène 3D afin de déterminer les couleurs perçues par un observateur. Plutôt que de calculer tous les rayons lumineux d&#039;une scène, cet algorithme calcule seulement le trajet inverse des rayons lumineux qui arrivent dans l&#039;oeil de l&#039;observateur, ce qui est beaucoup plus économique. On verra que cet algorithme permet de simuler des matériaux réfléchissants ou (semi-)transparents, de calculer des ombres portées, de simuler du brouillard...&lt;br /&gt;
&lt;br /&gt;
[[file:ray-tracing.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Il s&#039;agit de comprendre d&#039;où vient la couleur perçue d&#039;un objet, d&#039;implémenter l&#039;algorithme récursif classique du lancé de rayons, au moins avec des objets simples (sphères, tétraèdres), et de voir comment optimiser les calculs (car ça devient vite coûteux). On pourra s&#039;appuyer sur ce [https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html TP] pour l&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://en.wikipedia.org/wiki/Ray_tracing_(graphics)&lt;br /&gt;
* https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html&lt;br /&gt;
&lt;br /&gt;
=== Rendu temps réel avec OpenGL ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Colin Weill-Duflos&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; On cherche à utiliser une API graphique (OpenGL) afin de faire du rendu de scène 3d en utilisant la carte graphique. Cela permet d&#039;utiliser les techniques de rendu 3d en temps réel (rastérisation) et de les faire effectivement fonctionner en temps réel, permettant d&#039;afficher une scène avec laquelle on peut intéragir : en déplaçant la caméré, en bougeant des éléments...&lt;br /&gt;
Ces techniques ont déjà été utilisée dans des années précédentes, sans utiliser la carte graphique (le résultat était assez lent). Grâce à OpenGL, la plupart de ces opérations peuvent s&#039;effectuer sur la carte graphique, ce qui permet de ne pas avoir à en recoder une partie (grâce à des composants capables de faire uniquement ces opérations) et d&#039;être plus rapide.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre les techniques de raterisation&lt;br /&gt;
* comprendre la pipeline OpenGL&lt;br /&gt;
* implémenter une scène avec un objet et une caméra controlable&lt;br /&gt;
* rajouter des shaders pour simuler la lumière (Phong shading), variantes stylisées (Toon shading)&lt;br /&gt;
* rajouter des textures sur la scène&lt;br /&gt;
* faire des shadow maps pour les ombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [Travaux précédents](http://os-vps418.infomaniak.ch:1250/mediawiki/images/0/0d/Gossin-2023.pdf)&lt;br /&gt;
* [Pipeline OpenGL](https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview)&lt;br /&gt;
* [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
* [Toon shading](https://fr.wikipedia.org/wiki/Ombrage_de_cellulo%C3%AFd)&lt;br /&gt;
* [Shadow maps](https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping)&lt;br /&gt;
&lt;br /&gt;
=== Problèmes indécidables ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Quand on a un calcul à faire, on peut se demander de la meilleure implémentation pour faire faire ce calcul par un ordinateur. On pense généralement moins à la question - pourtant primordiale - de savoir si ce calcul peut être effectué par l’ordinateur. Pourtant, on sait depuis l’origine de l’informatique qu’il existe des fonctions que l’on ne peut pas calculer à l’aide d’un ordinateur.  On cherchera à comprendre ce que serait un programme qui résoudrait le problème de l’arrêt et pourquoi, il ne marchera pas. On pourra se demander alors s’il y a un lien entre les différents problèmes non-calculables : avec une librairie qui résout le problème de l’arrêt, peut-on écrire un problème qui résout le problème de correspondance de Post ? Peut-on imaginer un problème qu’on ne pourrait pas résoudre même si on avait une fonction qui résolvait le problème de l’arrêt ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de fonction calculable (et donc de fonction non-calculable). Donner des exemples. &amp;quot;Coder&amp;quot; l’argument diagonal de la non-calculabilité de l’arrêt. Coder une réduction entre deux problèmes non-calculables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Th%C3%A9orie_de_la_calculabilit%C3%A9 Wikipédia - Théorie de la calculabilité]&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_l%27arr%C3%AAt Wikipédia - Problème de l&#039;arrêt]&lt;br /&gt;
* [https://ludovicpatey.com/courses/comp-thy-2023/cr11-fr.pdf Livre récent en français sur la théorie de la calculabilité]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Réseaux de neurones et apprentissage ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; sujet demandé par Elliot Moiroud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
# se familiariser avec les concepts utilisés en apprentissage,&lt;br /&gt;
# essayer d&#039;implémenter une version ultra simple de la procédure d&#039;apprentissage,&lt;br /&gt;
# utiliser une bibliothèque existante sur quelques exemples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
# http://neuralnetworksanddeeplearning.com/&lt;br /&gt;
&lt;br /&gt;
=== Synchronisation dans les Systèmes Distribués ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; l&#039;algorithme de Lamport joue un rôle crucial dans la synchronisation des horloges dans un réseau de machines qui ne sont pas nécessairement précises ou synchronisées entre elles. Il permet de créer un consensus sur l&#039;ordre des événements dans un système distribué, où la communication peut être retardée ou désordonnée. Cette capacité est fondamentale pour assurer la cohérence et la fiabilité des opérations dans des environnements distribués, tels que les bases de données distribuées, les systèmes de fichiers en réseau et les applications de blockchain. Après avoir maîtrisé l&#039;algorithme de Lamport, l&#039;étudiant pourra les fautes byzantines pour comprendre comment les systèmes distribués gèrent les informations contradictoires ou erronées transmises par différents nœuds du réseau.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Analyser et comprendre l&#039;algorithme de Lamport pour la synchronisation des horloges.&lt;br /&gt;
# (Examiner les fautes byzantines et leur influence sur la stabilité des systèmes distribués.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Time, Clocks, and the Ordering of Events in a Distributed System.&lt;br /&gt;
https://lamport.azurewebsites.net/pubs/time-clocks.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation dynamique et complexité ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; La programmation dynamique est sans doute une des techniques de programmation qui porte le plus mal son nom.  Elle s&#039;applique lorsqu&#039;un problème peut se décomposer en sous-problèmes, dont les solutions peuvent être combinées. Dans le cas relativement simples où les sous-problèmes sont toujours disjoint, on utilise une approche de type &amp;quot;diviser pour rêgner&amp;quot;. Lorsque ce n&#039;est pas le cas, il faut faire attention à ne pas dupliquer les calculs. Les deux approches habituelles sont :&lt;br /&gt;
# la &amp;quot;mémoization&amp;quot;, qui consiste à sauvegarder toutes les solutions trouvées pour éviter de les recalculer,&lt;br /&gt;
# la &amp;quot;programmation dynamique&amp;quot; qui consiste à faire les solutions dans le &amp;quot;bon ordre&amp;quot; afin de ne jamais avoir besoin d&#039;une solution qui n&#039;aurait pas été calculée.&lt;br /&gt;
&lt;br /&gt;
Ces techniques permettent en général d&#039;obtenir un algorithme beaucoup plus rapide que la version naïve.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# étudier les méthodes de &amp;quot;mémoization&amp;quot; et &amp;quot;programmation dynamique&amp;quot; sur plusieurs exemples et les comparer&lt;br /&gt;
# mettre en évidence les complexités &amp;quot;pratiques&amp;quot; de ces algorithmes au moyen de benchmarks pertinents&lt;br /&gt;
# comprendre les calculs &amp;quot;théoriques&amp;quot; de la complexité de ces algorithmes pour vérifier que les prédictions correspondent à la pratique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;Introduction à l&#039;algorithmique&amp;quot;, T. Cormen, C. Leiserson, R. Rivest, C. Stein&lt;br /&gt;
# la page wikipedia française : https://fr.wikipedia.org/wiki/Programmation_dynamique&lt;br /&gt;
&lt;br /&gt;
== sujets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
=== algorithmes de recherche de chaines ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : rechercher si une chaine &#039;&#039;s1&#039;&#039; apparait à l&#039;intérieur d&#039;une chaine &#039;&#039;s2&#039;&#039; est assez simple, mais l&#039;algorithme naïf n&#039;est pas très rapide. L&#039;objectif de ce sujet est de s&#039;intéresser à certains algorithmes de recherche de sous-chaines plus efficaces. Le plus simple est probablement l&#039;algorithme KMP (du noms de ses inventeurs : Knuth, Morris et Pratt) qui évite des comparaisons inutiles de l&#039;algorithme naïf. L&#039;algorithme de Boyer-Moore utilise des idées similaires mais considère la sous-chaine (&#039;&#039;s1&#039;&#039;) à l&#039;envers, ce qui lui permet d&#039;aller en général plus vite. Ces algorithmes restent assez lents lorsque la chaine &#039;&#039;s2&#039;&#039; est très grande. C&#039;est par exemple le cas en bio-informatique lorsque l&#039;on doit rechercher des chaines dans le génome. Dans ce cas, la chaine &#039;&#039;s2&#039;&#039; est fixe et on rercherche de nombreuses sous-chaines &#039;&#039;s1&#039;&#039;. Il est alors possible de faire un &#039;&#039;pré-traitement&#039;&#039; pour faire une recherche beaucoup plus rapide qui ne dépend pas de la taille de &#039;&#039;s2&#039;&#039; !&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de quelques uns de ces algorithmes&lt;br /&gt;
*# les implémenter (par exemple en Python)&lt;br /&gt;
*# essayer de les comparer&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
# https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm&lt;br /&gt;
# transformé de Burrows-Wheeler et recherche de sous-chaines https://www.youtube.com/watch?v=P3ORBMon8aw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== génération de labyrinthes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : il existe de nombreuses méthodes algorithmiques pour générer des labyrinthes aléatoires. La plupart de ces méthodes sont expliquées sur des grilles carrées mais il est possible de les implémenter sur d&#039;autres types de grilles. Il est possible des les adapter par exemple pour générer des labyrinthes circulaires, cylindriques, ou sphériques ; ou bien des labyrinthes en plusieurs parties (de grandes pièces contenant des labyrinthes, reliées par des couloirs formant un autre labyrinthe).&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de plusieurs algorithmes de génération de labyrinthes&lt;br /&gt;
*# les étendres à des grilles plus intéressantes&lt;br /&gt;
*# &#039;&#039;expérimenter et chercher des manières simples de générer un labyrinthe &amp;quot;continu&amp;quot;&#039;&#039; (La solution décrite dans &amp;quot;How to Generate Perfect Mazes?&amp;quot; est probablement un peu trop complexe.)&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** le livre &amp;quot;Mazes for programmers&amp;quot;, https://pragprog.com/titles/jbmaze/mazes-for-programmers/&lt;br /&gt;
** l&#039;article &amp;quot;How to Generate Perfect Mazes?&amp;quot;, https://hal.uca.fr/hal-03174952/file/article-journal-2020.pdf&lt;br /&gt;
** l&#039;article &amp;quot;Organic Labyrinths and Mazes&amp;quot;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== L’infâme GOTO ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : L’instruction goto n’a aujourd’hui plus la côte parmi les informaticiens, et est souvent considérée comme une instruction à bannir. L&#039;idée est d&#039;explorer ce que permet cette instruction, et comment a évolué son utilisation.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# remplacer des structures de contrôles simples simples par des goto&lt;br /&gt;
*# faire un programme plus complexe utilisant un maximum de goto&lt;br /&gt;
*# expliquer l&#039;évolution de l&#039;utilisation du goto&lt;br /&gt;
*# avantages/inconvénients de son utilisation&lt;br /&gt;
*# comparaison des langages prenant en charge ou non cette instruction et pourquoi&lt;br /&gt;
*# utilisation actuelle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Blockchains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : les blockchains sont de plus en plus populaires, utilisées initialement pour les cryptomonnaies, elles peuvent être utilisées pour stocker des données, gérer les contrats intelligents, etc.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre le fonctionnement des blockchains (par exemple avec l&#039;article de Satoshi Nakamoto)&lt;br /&gt;
*# implémenter une blockchaine&lt;br /&gt;
*# ...&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de reconstruction de surfaces à partir d&#039;images 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les images 3D sont devenues courantes avec les outils d&#039;acquisition comme les scanners X ou les scanners IRM. On peut aussi modéliser des objets 3D sous forme de volumes, pour ensuite en extraire des surfaces (e.g. modélisation de fluides, de feu ou de fumées). Un enjeu est de pouvoir construire des surfaces qui représentent le bord d&#039;objets d&#039;intérêt dans ces données volumiques. Les algorithmes les plus classiques reconstruisent une surface composée de triangles qui approchent un niveau de gris donné dans le volume 3D :  c&#039;est une iso-surface, comparable à une courbe d&#039;iso-altitude dans une carte topographique, mais en 3D ! On  s&#039;intéreressera à deux algorithmes particulièrement : le marching-tetrahedra et le marching-cubes.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre ce qu&#039;est une iso-surface dans une image 3D ou dans une fonction implicite.&lt;br /&gt;
*# Comprendre les points communs et différences des algorithmes Marching Tetrahedra et Marching Cubes&lt;br /&gt;
*# Implémenter un des deux algorithmes. On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python. &lt;br /&gt;
*# On lira des fichiers .vol pour les images 3D, qui vous seront fournies.&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_tetrahedra Marching Tetrahedra sur wikipedia]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_cubes Marching Cubes sur wikipedia]&lt;br /&gt;
** [https://dl.acm.org/doi/pdf/10.1145/37402.37422 Lorensen, Cline, Marching cubes: a high resolutions 3D surface construction algorithm, Computer Graphics, 21(4), 1987]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-slices.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-isosurface.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Coupes dans une image 3D &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Isosurface dans cette image &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Invitation à la complexité algorithmique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
* Résumé : on abordera le thème de la complexité algorithmique : étant donné un programme implémentant une fonction, peut-on borner son temps de calcul en fonction de la taille de ses entrées. On procédera par l&#039;exemple, en tentant de confirmer la théorie par des expériences concrets de petits programmes (par exemple en Python). Comme point d&#039;entrée, on pourra par exemple examiner les différences de complexité entre quelques algorithmes de tri.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre l&#039;intérêt de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;,&lt;br /&gt;
*# se familiariser avec les notions et notations utilisées pour décrire la complexité en temps de calcul (ou en mémoire) des algorithmes,&lt;br /&gt;
*# apprendre à vers de &amp;quot;benchmarks&amp;quot; pour évaluer l&#039;efficacité réelle d&#039;une fonction dans un langage de programmation,&lt;br /&gt;
*# comprendre les limites de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== sujets 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
===Rust et la notion d&#039;appartenance (&amp;quot;ownership&amp;quot;)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Théo Connetable : [[Fichier:VISI401-2022-Connetable.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : dans la plupart des langages &amp;quot;haut niveau&amp;quot; (Python, Java, Javascript, ...), la mémoire est gérée automatiquement. Par exemple, Python détecte qu&#039;une liste ne sert plus à rien pour libérer la mémoire qu&#039;elle occupait. Dans les langages &amp;quot;bas niveau&amp;quot; (C), c&#039;est au programmeur de libérer explicitement la mémoire qu&#039;il utilise. (S&#039;il ne le fait pas, son programme risque d&#039;avoir des &amp;quot;fuites de mémoire&amp;quot;.) Rust est un nouveau (première version en 2010) langage de programmation. Un des objectifs de Rust est d&#039;offrir des garanties de sécurité sur la mémoire avec la notion d&#039;appartenance. Ces garanties sont testées à la compilation et ne dégradent donc pas l&#039;efficacité du programme final.&lt;br /&gt;
* Objectifs : l&#039;objectif, après s&#039;être familiarisé avec le langage Rust, est de comprendre à quoi correspond la notion de &amp;quot;ownership&amp;quot; (&amp;quot;appartenance&amp;quot;) et de l&#039;illustrer sur quelques exemples. Si l&#039;étudiant ne les connait pas, les notions de pointeurs (en C), d&#039;allocation sur la pile, sur le tas, et le concept de &amp;quot;ramasse miettes&amp;quot; (garbage collector&amp;quot; en anglais) seront des étapes préliminaires importantes.&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# The Rust Programming Language https://doc.rust-lang.org/book/title-page.html, avec en particulier la section 4, &amp;quot;Understanding Ownership&amp;quot;&lt;br /&gt;
*# Safe Systems Programming in Rust https://cacm.acm.org/magazines/2021/4/251364-safe-systems-programming-in-rust/fulltext&lt;br /&gt;
*# Rust Ownership by Example https://depth-first.com/articles/2020/01/27/rust-ownership-by-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Bitcoin &amp;amp; blockchain===&lt;br /&gt;
* Présentation : Baptiste Griva [[Fichier:VISI401-2022-Griva.pdf]]&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Les blockchain sont de plus en plus populaires. Avec l&#039;article de Satoshi Nakamoto, l&#039;étudiant devra comprendre son fonctionnement. On pourra dans un second temps s&#039;intéresser aux attaques habituelles face à une blockchain.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre le fonctionnement de la blockchain bitcoin&lt;br /&gt;
*# S&#039;intéresser à ses vulnérabilités (51% attack,...)&lt;br /&gt;
* Références: pour commencer https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
===Débruitage d&#039;image===&lt;br /&gt;
* Présentation : Lucas Policastro [[Fichier:VISI401-2022-Policastro.pdf]]&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La plupart des procédés d&#039;acquisition d&#039;image (typiquement capteurs CCD ou CMOS des caméras ou téléphones) ne sont pas parfaits et introduisent du bruit (des perturbations) dans les images résultantes. Ce bruit ressemble en général à une perturbation aléatoire locale par capteur, indépendante de ce  qui se passe sur un capteur proche. Peut-on alors améliorer la qualité visuelle d&#039;une photo dégradée par un tel bruit (typiquement gaussien) ? On regardera notamment les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
*# On pourra s&#039;appuyer sur les démos IPOL en ligne de ces algorithmes et leur description. http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
*# L&#039;algorithme des moyennes non locales est implémentable relativement facilement (même en numpy).&lt;br /&gt;
* Références:&lt;br /&gt;
** http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
** Le site https://www.ipol.im contient plein d&#039;algos de restauration d&#039;image (suivre Enhancement &amp;amp; Restoration, puis Denoising).&lt;br /&gt;
&lt;br /&gt;
===Sécurité des cartes RFID : le cas Mifare===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Paul Aubry [[Fichier:VISI401-2022-Aubry.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : les cartes RFID (Radio Frequency IDentification) sont des cartes à puce qui peuvent communiquer avec un lecteur distant (mais proche). De nombreuses cartes de transport en commun ou d&#039;ouverture de portes utilisent cette technologie. La carte Mifare classic, très répandue, utilise un protocole cryptographique pour éviter les &amp;quot;replay attacks&amp;quot; (enregistrer un échange pour le réutiliser) et le clonage de la carte. Le détails du protocole est longtemps resté un secret industriel, mais ceci n&#039;a pas empéché la découverte de *grosses* failles. Il est maintenant possible de cloner une carte Mifare en quelques secondes avec du matériel grand public.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre fonctionne la protection contre les &amp;quot;replay attacks&amp;quot; à partir de challenges cryptographiques&lt;br /&gt;
*# comprendre le protocole Mifare classic&lt;br /&gt;
*# comprendre les attaques sur le protocole&lt;br /&gt;
*# expérimenter avec des puces RFID existante *(facultatif)*&lt;br /&gt;
*# regarder les évolutions du protocole pour se protéger de ces attaques&lt;br /&gt;
* Référence : F. D. Garcia, P. van Rossum, R. Verdult, R. Wichers Schreur : &amp;quot;Wirelessly Pickpocketing a Mifare Classic Card&amp;quot; https://www.cs.ru.nl/~flaviog/publications/Pickpocketing.Mifare.pdf&lt;br /&gt;
&lt;br /&gt;
===Ingénierie Dirigée par les Modèles (IDM)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Alexandre Desbos [[Fichier:VISI-401-2022-Desbos.pdf]]&lt;br /&gt;
* Tuteur : Philippe Pernelle&lt;br /&gt;
* Résumé : l&#039;ingénierie dirigée par les modèles (ou MDE Model Driven Engineering) est une approche de conception basée sur la transformation de modèle sur des niveaux d&#039;abstraction différents (modèle, méta-modèle, méta-méta-modèle ...). l&#039;OMG propose une approche MDE basée sur 3 niveaux  d&#039;abstraction (CIM,PIM, PSM)  permettant de bâtir une application  en partant du niveaux d&#039;abstraction le plus haut (CIM) et en procédant par transformation / raffinement pour arriver au PSM puis à la génération de code. Il existe par ailleurs différents langages  (ATL, OCL) qui vont faciliter la transformation de modèle. A noter que la fondation Eclipse propose un environnement spécifique pour manipuler des modèles avec des implémentations d&#039;ATL et d&#039;OCL&lt;br /&gt;
* Objectifs :  L&#039;objectif est d&#039;étudier ces mécanismes de transformation / raffinement par l&#039;implémentation d&#039;un cas d&#039;étude dans eclipse en utilisant les langages ATL et OCL. Après une étude bibliographique des principes de MDA, l&#039;idée est de mettre en oeuvre dans Eclipse des extrait des modèles CIM, PIM et PSM proposés par les articles ci-dessous puis d&#039;essayer de construire des OCL et des scripts ATL afin de faciliter la transformation (sans aller jusqu&#039;à la génération de code)&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# These : https://hal.archives-ouvertes.fr/tel-01247610 (uniquement les pages 35 à 47)&lt;br /&gt;
*# Models and Mechanisms for implementing playful scenarios https://hal.archives-ouvertes.fr/hal-01372311&lt;br /&gt;
*# Digital Twin and Ecological Transition Integration in Training Process https://hal.archives-ouvertes.fr/hal-03375508&lt;br /&gt;
*# Eclipse Modeling Tools https://www.eclipse.org/downloads/packages/release/2021-12/r/eclipse-modeling-tools&lt;br /&gt;
&lt;br /&gt;
===[[Couvrir un polygone rectilinéaire avec des rectangles]]===&lt;br /&gt;
* Présentation : Maxent Bernier [[Fichier:VISI401-2022-Bernier.pdf]]&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Un polygone est dit rectilinéaire si les seuls angles qui apparaissent sont des angles droits. On considérera des polygones simples (i.e., sans trous et qui ne s&#039;auto-intersectent pas). Un tel polygone peut donc être recouvert par des carrés ou par des rectangles. On cherchera à écrire un algorithme qui trouve une couverture minimale (i.e., avec le moins de carrés/rectangles possibles). Dans le cas des carrés, on va pouvoir trouver un algorithme efficace pour ce problème. Malheureusement, le cas de la couverture minimale par les rectangles est NP-complète. &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme de recouvrement par des carrés&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet et le lien avec la couverture par les rectangles&lt;br /&gt;
*# Contourner la difficulté de la NP-complétude (heuristique ou cas des polygones orthogonalement convexes)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polygon_covering#cite_note-cr88-4  Couvertures de polygones (Wikipedia)]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/NP-completeness NP-complétude (Wikipedia)]]&lt;br /&gt;
** [[http://webdocs.cs.ualberta.ca/~joe/Preprints/Cover/paper.ps La couverture par rectangles est NP-complète]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires ===&lt;br /&gt;
&lt;br /&gt;
*Présentation : Emilien Boitouzet [[Fichier:VISI401-2022-Boitouzet.pdf]]&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
[[Fichier:automate_1.png]] [[Fichier:automate_2.jpeg]]&lt;br /&gt;
* Sujet : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser des calculs. Cependant les réalisations pratiques manquent, ce sujet se propose d’étudier l’utilisation des automates cellulaires dans les domaines suivant par exemple :&lt;br /&gt;
*# Modélisation des systèmes complexes (propagation des feux de forêt, processus de percolation, écoulement du sable ...)&lt;br /&gt;
*# Modélisation du comportement d&#039;un gaz&lt;br /&gt;
*# Système dynamique discret alternatif au modèle physique des équations aux dérivées partielles&lt;br /&gt;
*# Modélisation de la croissance de tissus cellulaires en biologie&lt;br /&gt;
*# Simulation de la croissance des cristaux&lt;br /&gt;
*# Correction automatique d’erreurs en imagerie&lt;br /&gt;
* Référence: https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
&lt;br /&gt;
=== Programmation bare-metal ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Andrien Montmayeur [[Fichier:VISI401-2022-Montmayeur.pdf]]&lt;br /&gt;
* Tuteur : Colin Weill-Duflos&lt;br /&gt;
* Sujet : l&#039;execution d&#039;un programme compilé peut parfois paraître un peu magique: on ne comprend pas forcément tout ce que fait le compilateur, et le système d&#039;exploitation fournit des abstractions bien pratiques. Comment se débrouille-t-on dans un contexte où il n&#039;y a pas de système d&#039;exploitation, comme certaines applications embarquées ou bien le système d&#039;exploitation lui-même?&lt;br /&gt;
* Objectifs : comprendre en détails la chaîne de compilation du C, l&#039;architecture d&#039;un executable et comment ce dernier est executé par une machine pour parvenir à faire executer un programme directement par un microprocesseur arm et interagir avec des périphériques simples.&lt;br /&gt;
* Référence:&lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Executable_and_Linkable_Format Architecture d&#039;un executable]&lt;br /&gt;
*#[https://aticleworld.com/c-compilation-process/ les étapes de compilation du C] (regarder notamment le linkage)&lt;br /&gt;
*# [https://azeria-labs.com/arm-data-types-and-registers-part-2/ débuter avec l&#039;assembleur arm]&lt;br /&gt;
&lt;br /&gt;
===GeoGebra et algèbre géométrique ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Nolann Sanmarti [[Fichier:VISI401-2022-Sanmarti.pdf]]&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Sujet : l&#039;algèbre géométrique émerge récemment comme un outil prometteur pour la synthèse d&#039;images : avec des points de contrôle, un produit, il est possible de représenter et de manipuler de manière efficace un ensemble d&#039;objets géométriques. Récemment, des bibliothèques c++ ont été développées. Ces bibliothèques autorisent une utilisation générique de l&#039;algèbre géométrique mais sont encore limitées par le manque d&#039;outils intéractifs adaptés. Par ailleurs, le logiciel de visualisation GeoGebra est un outil particulièrement utile pour la visualisation et la résolution de problèmes géométriques. Le but de ce projet serait de travailler un binding entre l&#039;algèbre géométrique et GeoGebra.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# se familiariser avec l&#039;algèbre géométrique, et l&#039;applet Javascript de GeoGebra,&lt;br /&gt;
*# identifier les objets et les opérations géométriques intéressantes à visualiser avec l&#039;algèbre géométrique,&lt;br /&gt;
*# implantations d&#039;une méthode générique permettant de générer des scripts dans l&#039;applet Javascript de GeoGebra.&lt;br /&gt;
* Références :&lt;br /&gt;
*# Projective geometric algebra: A new framework for doing euclidean geometry, Charles G. Gunn, 2019&lt;br /&gt;
*# [http://www.geogebra.org geogebra]&lt;br /&gt;
&lt;br /&gt;
== sujets 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
=== Comment Facebook gère ses données ?  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Pour une base de données, il est impossible d&#039;être cohérent, disponible tout le temps et partitionné. C&#039;est le fameux théorème CAP. Pour autant, les données de Facebook sont cohérentes, disponibles tout le temps, et réparties à travers le monde !? Impossible. Pour l&#039;étudiant, il faudra comprendre pourquoi c&#039;est impossible, et comment Facebook fait en pratique pour gérer ce problème.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le CAP théorème, et sa démonstration&lt;br /&gt;
*# Comprendre comment Facebook gère ce problème, et ses données d&#039;une manière générale&lt;br /&gt;
*# À définir, selon les questions que se pose l&#039;étudiant.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Théorème CAP :&lt;br /&gt;
*## https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_CAP&lt;br /&gt;
*## Brewer&#039;s Conjeture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services (https://awoc.wolski.fi/dlib/big-data/GiLy02-CAP.pdf)&lt;br /&gt;
*# Facebook Social Graph :&lt;br /&gt;
*## TAO : The power of the graph (https://engineering.fb.com/2013/06/25/core-data/tao-the-power-of-the-graph/)&lt;br /&gt;
*## TAO: Facebook’s Distributed Data Store for the Social Graph (https://www.usenix.org/system/files/conference/atc13/atc13-bronson.pdf)&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de calcul de l&#039;enveloppe convexe  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les ensembles convexes ont beaucoup de propriétés géométriques intéressantes, par exemple détecter la collision de deux ensembles convexes est &amp;quot;facile&amp;quot; algorithmiquement. Une étape fréquente dans beaucoup d&#039;algorithmes de traitements de données 2D/3D/nD est donc de calculer l&#039;enveloppe convexe d&#039;un nuage de points, c&#039;est-à-dire le plus petit ensemble convexe contenant ces points. Il existe de nombreux algorithmes de calcul d&#039;enveloppe convexe en 2D (Graham scan, Melkman, balayage de ligne (sweep-line), division-fusion, Chan&#039;s algorithm, Quickhull) et 3D (Chan&#039;s algorithm, Quickhull) et même nD (Quickhull notamment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
|Enveloppe convexe des points à coordonnées entières inclus dans une boule de diamètre 25&lt;br /&gt;
|----&lt;br /&gt;
[[Fichier:Qhull-25.png|300px]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Objectifs: il s&#039;agira de regarder quelques uns de ces algorithmes, d&#039;identifier leurs principales différences ainsi que leurs complexités théoriques et pratiques. On pourra aussi regarder plus précisément l&#039;algorithme Quickhull, dont l&#039;implémentation 2D est facile, et 3D accessible.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Barber, C. B., Dobkin, D. P., &amp;amp; Huhdanpaa, H. (1996). The quickhull algorithm for convex hulls. ACM Transactions on Mathematical Software (TOMS), 22(4), 469-483 [[https://www.researchgate.net/profile/Hannu_Huhdanpaa/publication/242414606_The_Quickhull_Algorithm_for_Convex_Hulls/links/54e5f6970cf2bff5a4f1e7db.pdf (PDF)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Graham_scan Algorithme de Graham (Wikipedia)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Convex_hull_algorithms Convex hull algorithms (Wikipedia)]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes autour des polyominos ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Un polyomino est une forme (sans trou) obtenue en collant des petits carrés de taille 1 par leurs bords. Des exemples connus sont par exemples les pièces du jeu tetris : il s&#039;agit de &amp;quot;tétramino&amp;quot;, c&#039;est à dire de polyomino formés de 4 carrés. Voici également les pentaminos, composés de 5 carrés :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:polyominos.png]]&lt;br /&gt;
&lt;br /&gt;
Une question récurrente est celle de la pavabilité : peut-on (en utilisant certains types de polyominos) paver un domaine donné.&lt;br /&gt;
Lorsque le domaine est fini, on peut utiliser une recherche exhaustive, mais lorsqu&#039;on veut paver tout le plan, le problème devient indécidable en général.&lt;br /&gt;
Nous nous intéresserons au cas le plus simple : est-il possible de paver le plan tout entier en utilisant des polyominos tous identiques, et en utilisant uniquement des translations.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pavages.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les définitions et notions de bases des polyominos, et en particulier leur représentation comme mot de contour&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance de polyominos en Python&lt;br /&gt;
*# comprendre la caractérisation des polyominos &amp;quot;exacts&amp;quot;, càd ceux qui pavent le plan&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance des polyominos exacts en Python&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Bibliographie initiale&lt;br /&gt;
*# [http://www.xprov.org/doc/these-XProvencal.pdf &amp;quot;Combinatoire des mots, géométrie discrète et pavages&amp;quot;], Xavier Provencal (chapitres 1 et 2)&lt;br /&gt;
*# [https://www.lama.univ-smb.fr/pagesmembres/vuillon/IanRAIRO.pdf &amp;quot;An algorithm for deciding if a polyomino tiles the plane by translation&amp;quot;], Ian Gambini et Laurent Vuillon&lt;br /&gt;
&lt;br /&gt;
=== Version algorithmique du lemme local de Lovász  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons un problème standard sur le routage de paquets dans des réseaux. Donnés un réseau et une collection de paquets, chacun venant avec un chemin dans le réseau (de la source vers la destination), le but est d’établir un planning qui minimise le temps pour que tous les paquets atteignent leur destination. Il est naturel de mesurer la qualité d’un tel planning en fonction de deux paramètres : la congestion c qui est le nombre maximum de paquets qui doivent emprunter une même arête du réseau et la dilatation d qui est le nombre maximum d’arêtes d’un chemin. En effet, il est facile de trouver un planning en temps c*d, et tout planning doit prendre comme temps au moins max(c,d). &lt;br /&gt;
&lt;br /&gt;
En 1994, Leighton, Maggsand et Rao ont montré qu’il existait toujours un planning en temps O(c+d). Malheureusement, ce résultat est basé sur le lemme local de Lovász. Il s’agit d’un résultat classique de combinatoire dont la preuve était à l’époque non constructive. Le problème précédent du routage de paquets n’est qu’une application de ce lemme parmi tant d’autres. En 2010, Moser et Tardos donnèrent un algorithme (en plus assez simple et efficace) pour le lemme local de Lovász.&lt;br /&gt;
&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le lemme local de Lovász et certaines de ses applications&lt;br /&gt;
*# Coder la version algorithmique de Moser et Tardos&lt;br /&gt;
*# Coder des applications du lemme (comme par exemple le routage de paquets)&lt;br /&gt;
* Bibliographie initiale : &lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Algorithmic_Lov%C3%A1sz_local_lemma Page wikipedia de la version algorithmique du lemme local de Lovász]&lt;br /&gt;
*# [http://www.scs.cmu.edu/afs/cs.cmu.edu/project/phrensy/pub/papers/LeightonMR94.pdf Application aux routage de paquets par Leighton, Maagsand et Rao]&lt;br /&gt;
*# [https://arxiv.org/pdf/0903.0544.pdf La version algorithmique du lemme local de Lovász par Moser et Tardos]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* Crypto-système de Merkle-Hellman et algorithme de Shamir, Ewan Rakotoanosy (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Reconstruction de surfaces à partir de nuages de points et de normales, Yohan Thépaut (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Algorithmes de super-résolution par apprentissage, Romain Théodet (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Autour de la question de la sensibilité des fonctions Booléennes, Christophe Carmagnac (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Structures de données purement fonctionnelles]], Loïc Dornel (Tuteur : Tom Hirschowitz)&lt;br /&gt;
* Automates cellulaires et décidabilité, Lucas Chardonnet (Tuteur : François Boussion)&lt;br /&gt;
&lt;br /&gt;
== sujets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
=== Crypto-système de Merkle-Hellman et algorithme de Shamir ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Le système de Merkle-Hellman est un système cryptographique de type &amp;quot;clé publique / clé privée&amp;quot;. Il a été inventé juste en 1978, après le système RSA (encore utilisé). Ce système a l&#039;avantage d&#039;être un peu plus simple, mais le **gros** désavantage d&#039;avoir été craqué par A. Shamir en 1984. L&#039;objectif est de comprendre le système, et la faille qu&#039;il contenait. Cela permettra de comprendre l&#039;algorithme de Shamir...&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Shamir, Adi (1984). &amp;quot;A polynomial-time algorithm for breaking the  basic Merkle - Hellman cryptosystem&amp;quot;. IEEE Transactions on Information  Theory. 30 (5): 699–704. doi:10.1109/SFCS.1982.5 [[http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.123.5840&amp;amp;rep=rep1&amp;amp;type=pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Reconstruction de surfaces à partir de nuages de points et de normales ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les lasers d&#039;acquisition de données 3d permettent de fabriquer des données qui approchent le bord d&#039;un objet 3D. Ces données sont souvent sous la forme d&#039;un nuage de points, doublé d&#039;un vecteur associé à chaque point et qui indique la direction normale à la surface de l&#039;objet. On parle de données de Hermite. Il existe des algorithmes dédiés, très efficaces et robustes, pour reconstruire une surface qui passe par ces points. L&#039;objectif est de comprendre les deux principales méthodes, l&#039;une appelée reconstruction de Poisson, l&#039;autre relié à la notion d&#039;indice (ou winding number), leurs qualités et leur défaut.&lt;br /&gt;
* Bibliographie initiale:&lt;br /&gt;
** KAZHDAN, Michael, BOLITHO, Matthew, et HOPPE, Hugues. Poisson surface reconstruction. In : Proceedings of the fourth Eurographics symposium on Geometry processing. 2006 [[http://faculty.cs.tamu.edu/schaefer/teaching/689_Fall2006/poissonrecon.pdf PDF]]&lt;br /&gt;
** BARILL, Gavin, DICKSON, Neil G., SCHMIDT, Ryan, et al. Fast winding numbers for soups and clouds. ACM Transactions on Graphics (TOG), 2018, vol. 37, no 4, p. 43. [[http://www.dgp.toronto.edu/projects/fast-winding-numbers/fast-winding-numbers-for-soups-and-clouds-siggraph-2018-compressed-barill-et-al.pdf]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de super-résolution par apprentissage ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La super-résolution consiste à, étant donné une image M x N, de fabriquer une image &amp;quot;zoomée&amp;quot; de taille kM x kN, où l&#039;information inventée est &amp;quot;crédible&amp;quot;. Le problème est évidemment mal posé mathématiquement, et du coup on rajoute de l&#039;information a priori : continuité des couleurs, continuité des structures géométriques, modèles probabilistes, moyennes non-locales (auto-similarités), etc. Avec l&#039;avènement du deep learning, des méthodes à base d&#039;apprentissage ont vu le jour. En gros, un réseau de neurones (CNN) apprend sur plein d&#039;images en &amp;quot;dézoomant&amp;quot; les images en entrées (facile, on sous-échantillonne), puis on utilise la fonction construite pour faire la super-résolution.&lt;br /&gt;
* L&#039;objectif est de regarder les méthodes de super-résolution, notamment celles par apprentissage et de voir leurs qualités et défauts. On pourra aussi les comparer avec des méthodes purement géométriques de super-résolution, ou des méthodes de moyennes non-locales.&lt;br /&gt;
* Ce sujet a été discuté avec Romain Théodet et conduit à un stage au LAMA pour combiner méthode géométrique et méthode par deep learning pour la super-résolution.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** SHI, Wenzhe, CABALLERO, Jose, HUSZÁR, Ferenc, et al. Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network. In : Proceedings of the IEEE conference on computer vision and pattern recognition. 2016. p. 1874-1883 [[https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf PDF]]?&lt;br /&gt;
** Lachaud, J.-O. and Kerautret, B., Geometric Total Variation for image vectorization, zooming and pixel art depixelizing, In : Proceedings of 5th Asian Conference on Pattern Recognition, 2019 [[Fichier:Paper-GTV.pdf]]&lt;br /&gt;
** [[https://github.com/kerautret/GTVimageVect Démos en ligne d&#039;algorithmes de super-résolution]]&lt;br /&gt;
&lt;br /&gt;
=== Autour de la question de la sensibilité des fonctions Booléennes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : On souhaite s’intéresser aux problèmes résolus par des algorithmes qui répondent par Vrai/Faux. Ces problèmes ont des entrées dans {0,1}^n (entrées codées en binaire) et une sortie dans {0,1) (Vrai ou Faux). Il est donc naturel de s’intéresser aux propriétés de ces fonctions Booléennes. Un certain nombre de paramètres intéressants ont été identifiés, comme la complexité du certificat (nombre minimal de bits nécessaires pour connaître la valeur de sortie), le degré (degré d’un polynôme qui correspond à la fonction sur les entrées Booléennes), la sensibilité (lnombre de bits qui, s’ils sont modifiés, impliquent une modification de la sortie), et bien d’autres (taille d’un arbre de décision, complexité en requêtes classiques ou quantiques, taille des coefficients de Fourier,…). En 1992, Nisan et Szegedy ont montré que tous ces paramètres sont reliés entre eux : si on connait l’un d’eux, par exemple le degré, on sait alors que n’importe quel autre de ces paramètres, par exemple la taille de l’arbre de décision, est limité à un certain intervalle de valeurs. Tous, sauf un : la sensibilité. Aucune méthode de preuve semblait impliquer que ce paramètre ne pouvait pas être beaucoup plus petit que les autres. Nisan et Szegedy posèrent alors la question de savoir si la sensibilité d’une fonction Bolléenne était reliée ou non aux autres paramètres classiques.&lt;br /&gt;
* Cet été, en 2019, un chercheur, Hao Huang, a montré dans une preuve de deux pages que la sensibilité ne pouvait pas être significativement plus petite que les autres paramètres, résolvant le problème posé 27 ans auparavant. Cette &amp;quot;sensitivity&amp;quot; conjecture a été attaquée en vain par de nombreux chercheurs renommés. Or, la nouvelle preuve est si simple qu’un chercheur l’a résumé en un [[https://twitter.com/BooleanAnalysis/status/1145837576487612416 tweet]].&lt;br /&gt;
* L&#039;objectif est de comprendre quels sont les paramètres classiques des fonctions Booléennes et des liens entre eux avant de s&#039;intéresser à la preuve de la conjecture. On pourra essayer de construire des fonctions extrémales (ie, avec des paramètres extrémaux dans leur plage de valeurs).&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** Le papier original où la question a été posée : N. Nisan, M. Szegedy. [[https://www.researchgate.net/profile/Mario_Szegedy/publication/2508255_On_the_Degree_of_Boolean_Functions_as_Real_Polynomials/links/09e41514878e7ef890000000.pdf On the degree of Boolean functions as real polynomials.]] Comput. Complexity, 4 (1992), 462–467.&lt;br /&gt;
** Une référence sur l&#039;analyse des fonctions Booléennes : Ryan O’Donnell. [[http://www.cs.tau.ac.il/~amnon/Classes/2016-PRG/Analysis-Of-Boolean-Functions.pdf Analysis of Boolean Functions]], Cambridge University Press, 2014  &lt;br /&gt;
** La preuve de la conjecture : Hao Huang. [[https://arxiv.org/abs/1907.00847 Induced subgraphs of hypercubes and a proof of the Sensitivity Conjecture]]. Annals of Mathematics, 190 (2019), 949-955&lt;br /&gt;
&lt;br /&gt;
=== Structures de données purement fonctionnelles ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;algorithmique est souvent enseignée sur des langages principalement impératifs tels que C. Les structures de données utilisées ne sont pas toujours évidentes à traduire vers les langages fonctionnels tels que OCaml. L&#039;étudiant s&#039;initiera aux structures de données fonctionnelles et aux concepts liés tels que la persistence, en suivant le livre « Purely functional data structures » d&#039;Okasaki.&lt;br /&gt;
* Liens&lt;br /&gt;
** [[https://www.cs.cmu.edu/~rwh/theses/okasaki.pdf La thèse d&#039;Okasaki (PDF)]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires et décidabilité ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Un automate cellulaire est un modèle de calcul discret, utilisé en dans différentes sciences (informatique, mathématiques, physique, biologie, etc;). Le jeu de la vie est l&#039;exemple emblématique d&#039;automate cellulaire. Les règles de calcul d&#039;un automate cellulaire, et de son évolution au cours du temps sont assez simples, mais mènent cependant à des problèmes complexes dont certains indécidables. Par exemple, déterminer si, étant donné des règles, on arrivera forcément, en un nombre fini d&#039;étapes, dans une configuration donné, quelque soit la configuration initiale (problème de nilopotence).&lt;br /&gt;
* L&#039;objectif est de s&#039;intéresser à ces problèmes indécidables dans les automates cellulaires et de produire un mini-cours sur le sujet.&lt;br /&gt;
* Références &lt;br /&gt;
** K. JARKKO, The nilpotency problem of one-dimensional cellular automata, SIAM J. Comput., Vol. 21, No. 3, pp. 571-586, June 1992.&lt;br /&gt;
** K. CULIK II, J. PACHL, S. Yu, On the limit sets ofcellular automata, SIAM J. Comput., 18 (1989), pp.831-842.&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le &amp;lt;b&amp;gt;lundi 27 mai&amp;lt;/b&amp;gt; de 9h à 11h en salle 115 du chablais.&lt;br /&gt;
Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Tristan_Porteries Tristan Porteries (PDF)]: problèmes avec mémoire restreinte, tuteur S. Tavenas&lt;br /&gt;
* R. Wagner: Reconstruction de surfaces à partir de nuages de points, tuteur J.-O. Lachaud&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Nils_Ruet Nils Ruet (PDF)]: LISP, tuteur P. Hyvernat&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Remy_Bouvier Rémy Bouvier (PDF)]: dancing links, tuteur P. Hyvernat&lt;br /&gt;
&lt;br /&gt;
== sujets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les sujets 1-3 sont encadrés par J.-O. Lachaud, les sujets 4-5 par P. Hyvernat, le sujet 6 par S. Tavenas.&lt;br /&gt;
Un encadrant encadre au max 2 étudiants.&lt;br /&gt;
&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;br /&gt;
# Une question naturelle est de savoir quels sont les problèmes qui peuvent être résolus avec un espace mémoire restreint. Plus formellement, on notera L l&#039;ensemble des problèmes que l&#039;on peut résoudre en utilisant seulement un espace mémoire logarithmique. On s&#039;intéresse à cette classe de problèmes, et plus particulièrement aux problèmes de connectivité dans un graphe.&lt;br /&gt;
#* [https://www.irif.fr/~sperifel/complexite.pdf Sylvain Périfel Complexité algorithmique] : Un livre récent qui survole une grosse partie de la complexité algorithmique. Le chapitre 4 concerne la complexité en espace.&lt;br /&gt;
#* [https://omereingold.files.wordpress.com/2014/10/sl.pdf Omer Reingold Undirected Connectivity in Log-Space]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le vendredi 25 mai 2018, à 9h. Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* ray-tracing au path-tracing, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Raphael_Tournafond.pdf Raphael Tournafond (PDF)]&lt;br /&gt;
* &amp;quot;dancing links&amp;quot; et NP complétude, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Ambroise_Decouttere.pdf Ambroise Decouttere (PDF)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
# Du ray-tracing au path-tracing: il s&#039;agit de comprendre l&#039;évolution des algorithmes de rendu (dits &amp;quot;réalistes&amp;quot;) et de mettre en avant les principales évolutions.&lt;br /&gt;
#* An introduction to ray tracing AS Glassner - 1989 - books.google.com&lt;br /&gt;
#* Energy redistribution path tracing, D Cline, J Talbot, P Egbert - ACM Transactions on Graphics (TOG), 2005 - dl.acm.org&lt;br /&gt;
#* et pour une introduction douce au ray-tracing: TP2 de http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO805/Tests/html/index.html&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; et NP complétude : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
#* [https://arxiv.org/pdf/1203.1895.pdf Classic Nintendo Games are (Computationally) Hard] : preuve que Super Mario et d&#039;autres jeux video classiques sont NP-complets &#039;&#039;Theoretical Computer Science, volume 586, 2015, pages 135–160.&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Quiltingtransfer.png&amp;diff=16169</id>
		<title>Fichier:Quiltingtransfer.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Quiltingtransfer.png&amp;diff=16169"/>
		<updated>2026-01-07T16:05:46Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=16168</id>
		<title>VISI401 CMI : bibliographie scientifique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=16168"/>
		<updated>2026-01-07T16:03:50Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Synthèse de texture et transfert de texture par matelassage d&amp;#039;images */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable:&lt;br /&gt;
* 2017--2021 : Jacques-Olivier Lachaud&lt;br /&gt;
* 2022-- : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
Ce module amène l&#039;étudiant à effectuer des recherches bibliographiques sur un sujet donné, et à synthétiser ses résultats sous la forme d&#039;un exposé construit.&lt;br /&gt;
&lt;br /&gt;
L&#039;étudiant, à partir d&#039;un sujet et d&#039;un ou plusieurs articles initiaux, doit approfondir le sujet, appréhender son historique, ses évolutions, et son état actuel. &lt;br /&gt;
&lt;br /&gt;
A côté des ressources fournies par les bibliothèques, quelques pointeurs très utiles pour faire des recherches bibliographiques:&lt;br /&gt;
* [https://scholar.google.fr Scholar Google] (libre)&lt;br /&gt;
* [https://researchgate.net ResearchGate] (libre)&lt;br /&gt;
* [https://mathscinet.ams.org/mathscinet/ MashSciNet] (plus math)&lt;br /&gt;
* [https://www.springerlink.com  Springer] (accès via USMB)&lt;br /&gt;
* [https://www.sciencedirect.com Elsevier Sciencedirect] (accès via USMB)&lt;br /&gt;
* SciHub lorsqu&#039;on ne trouve pas&lt;br /&gt;
&lt;br /&gt;
La synthèse bibliographique se fait en interaction avec le tuteur par des visites régulières et/ou des compte-rendus d&#039;avancement par email. La synthèse finale fait l&#039;objet d&#039;un exposé final (15-20 minutes + questions) et d&#039;un document de présentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2025-2026 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Synthèse de texture et transfert de texture par matelassage d&#039;images]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; La synthèse de texture est le procédé qui vise à générer une nouvelle image à partir d&#039;une ou plusieurs (petites) images modèles, en donnant l&#039;impression que cette nouvelle image suit les propriétés structurelles, colorimétriques et statistiques de l&#039;image originelle. C&#039;est très utilisé en synthèse d&#039;image pour générer de grandes textures à partir de petits échantillons. On se propose d&#039;étudier et d&#039;implémenter un algorithme assez simple mais assez efficace appelé &amp;lt;i&amp;gt;image quilting&amp;lt;/i&amp;gt; pour faire de la génération de texture. Il se base sur de simples recherches de sous-images dans l&#039;image original, en superposant au mieux les sous-images. L&#039;algorithme peut même servir à du transfert de textures. Le langage de développement est au choix.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre la méthode d&#039;image quilting, voir le papier d&#039;Efros et Freeman, Siggraph&#039;2001&lt;br /&gt;
* implémenter dans un premier temps la méthode simple qui parcourt l&#039;image en scan-line et recherche la meilleure sous-image avec un overlap choisi.&lt;br /&gt;
* dans un 2e temps, implémenter la méthode de découpe optimale entre 2 sous-images superposées&lt;br /&gt;
* dans un 3e temps, implémenter le transfert de texture&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;References&#039;&#039;&#039;&lt;br /&gt;
* [[http://graphics.cs.cmu.edu/people/efros/research/quilting.html Efros et Freeman, Siggraph&#039;2001]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:imagequilting.gif|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[le bytecode Python]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; Python est un langage &amp;quot;interprété&amp;quot;. Un programme Python n&#039;est jamais directement transformé en suite d&#039;instructions pour le processeur sur lequel il doit s&#039;exécuter. C&#039;est l&#039;interpréteur qui va, lors de l&#039;exécution, regarder les instructions Python pour les exécuter. Pour éviter que le passage par cet intermédiaire prenne trop de temps, le programme Python est d&#039;abord transformé en un &amp;quot;langage intermédiaire&amp;quot; appelé &amp;quot;bytecode&amp;quot;. Ce langage est une espèce de langage d&#039;assemblage propre à Python. Les instructions sont beaucoup plus simples à exécuter que les instructions &amp;quot;haut niveau&amp;quot; et sont identiques pour tous les processeurs.&lt;br /&gt;
&lt;br /&gt;
L&#039;outils principal pour étudier le bytecode python est le module &amp;lt;tt&amp;gt;dis&amp;lt;/tt&amp;gt; (comme &amp;lt;tt&amp;gt;dis&amp;lt;/tt&amp;gt;assembler) de la version usuelle de Python (CPython).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre la différence entre les langages compilé et interprétés&lt;br /&gt;
* comprendre globalement le mécanisme de transformation d&#039;un programme Python en bytecode&lt;br /&gt;
* étudier le bytecode produit sur des exemples particuliers et pertinents (&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;, concaténation, &amp;lt;tt&amp;gt;append&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== [[Peut-on calculer(efficacement) une transformation de Fourier Rapide sur GPU ]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Mouloud Kessar &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039;&lt;br /&gt;
En traitement du signal, ainsi que pour les simulations numériques, les transformations de Fourier rapides sont extrêmement répandues. L&#039;algorithme de Cooley-Tukey publié en 1965 réduit la complexité du calcul d&#039;une transformée de Fourier discrète à 0(nlog(n)), contre O(n2) pour une implémentation native. Sur CPU, la librairie la plus répandue est FFTW (Fastest Fourier Transform in the West). De nombreuses librairies existent sur GPU pour le calcul des FFT. Malgré tout, pour les simulations numériques en mécanique des fluides, ce sont les transformations de Fourier qui peuvent rendre délicat le portage de codes sur GPU.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* De comprendre les différences de la programmation sur GPU par rapport au CPU.&lt;br /&gt;
* Faire un travail bibliographique pour donner des perspectives d’améliorations dans le cas des FFT.&lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, on essaiera:&lt;br /&gt;
* de Paralléliser un code( c++) déjà existant à l&#039;aide d&#039;OpenMP&lt;br /&gt;
* de porter un code( c++) déjà existant sur GPU à l&#039;aide d&#039;OpenMP GPU&lt;br /&gt;
* de déterminer s&#039;il y a des contextes dans lesquels le code est plus efficace sur GPU ou CPU.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références:&#039;&#039;&#039;&lt;br /&gt;
* La page wikipedia des FFT https://fr.wikipedia.org/wiki/Transformation_de_Fourier_rapide&lt;br /&gt;
* les supports de cours de l&#039;IDRIS  http://www.idris.fr/formations/supports_de_cours.html&lt;br /&gt;
&lt;br /&gt;
== sujets 2024-2025 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes de colorations de graphes]] ===&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; Un [https://fr.wikipedia.org/wiki/Th%C3%A9orie_des_graphes graphe] est un ensemble de sommets et un ensemble d’arêtes sur ces sommets. Une [https://fr.wikipedia.org/wiki/Coloration_de_graphe coloration propre] d&#039;un graphe est une assignation de couleurs à chaque sommet du graphe telle que chaque paire de sommets reliée par une arête a des couleurs différentes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Graph.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Coloration.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Impropre.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Une coloration propre de ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Une coloration impropre du graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Connaître le nombre minimum de couleurs permettant de colorer proprement un graphe est un problème NP-difficile. Cependant, il existe des algorithmes de coloration de graphe permettant de trouver une coloration propre en fonction du nombre de voisins maximums d&#039;un sommet. L&#039;objectif de ce sujet est d&#039;implémenter certains de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter l&#039;algorithme de coloration glouton d&#039;un graphe&lt;br /&gt;
# implémenter l&#039;amélioration de cet algorithme en utilisant la dégénérescence du graphe&lt;br /&gt;
# implémenter l&#039;algorithme issus du théorème de Brooks&lt;br /&gt;
# éventuellement, implémenter un algorithme de coloration d&#039;arêtes&lt;br /&gt;
# éventuellement, implémenter un algorithme de transformation du problème SAT en problème de coloration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de Ukkonen / algorithme SA-IS]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; L&#039;arbre des suffixes est une structure de données qui permet de répondre très rapidement à de nombreuses requêtes du style &amp;quot;est-ce que la chaine &#039;&#039;p&#039;&#039; apparait dans la chaine &#039;&#039;S&#039;&#039; ?&amp;quot; La chaine &#039;&#039;p&#039;&#039; pourrait être une &amp;quot;petite&amp;quot; chaine de quelques milliers de caractères, alors que la chaine &#039;&#039;S&#039;&#039; pourrait être une &amp;quot;grosse&amp;quot; chaine de plusieurs milliard de caractères. Lorsque la chaine &#039;&#039;S&#039;&#039; est fixe, cette recherche se fait en un temps proportionnel à la taille de &#039;&#039;p&#039;&#039;, indépendamment de la taille de &#039;&#039;S&#039;&#039; ! Ce qui rend ceci possible est le précalcul de l&#039;arbre des suffixes de &#039;&#039;S&#039;&#039;, une fois pour toute. Si on fait ce précalcul de manière naïve, il prend un temps proportionnel à la taille de &#039;&#039;S&#039;&#039; &#039;&#039;&#039;au carré&#039;&#039;&#039;. Lorsque &#039;&#039;S&#039;&#039; contient des milliards de caractéres, ceci n&#039;est pas raisonnable.&lt;br /&gt;
&lt;br /&gt;
L&#039;algorithme de Ukkonen permet de calculer l&#039;arbre des suffixes en un temps proportionnel à la taille de &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# comprendre la structure d&#039;arbre des suffixes&lt;br /&gt;
# coder une version naïve du calcul de l&#039;arbre des suffixes&lt;br /&gt;
# comprendre et coder une version de l&#039;algorithme de Ukkonen, et comparer les temps de calcul&lt;br /&gt;
# si le temps le permet, comprendre l&#039;algorithme SA-IS qui permet de construite le tableau des suffixes en un temps proportionnel à la taille de &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# les [https://www.youtube.com/playlist?list=PL2mpR0RYFQsDFNyRsTNcWkFTHTkxWREeb vidéos de Ben Langmead] sur les arbres de suffixes (vidéos 1 -- 9)&lt;br /&gt;
# description de l&#039;algoritme de Ukkonen dans Dan Gusfield, &#039;&#039;Algorithms on Strings, Trees and Sequences&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Approximations d&#039;Euler et Runge-Kutta pour la modélisation du problème à 3 corps===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
en astronomie, la modélisation du problème à N corp est un enjeu majeur. Il est indispensable pour l&#039;exploration spatiale, notamment pour l&#039;envoie de sonde sur Mars, ou&lt;br /&gt;
Titan (Lune de Jupiter).&lt;br /&gt;
&lt;br /&gt;
Les équations décrivant le problème à N corps existent depuis de nombreuses années, mais les mathématiciens et les physiciens ne savent pas les résoudre analytiquement.&lt;br /&gt;
&lt;br /&gt;
Des codes de calcul existent pour réaliser des simulations du système solaire.&lt;br /&gt;
&lt;br /&gt;
D&#039;un point de vue algorithmique, le point clef se situe dans l&#039;approximation choisie pour les dérivées en temps.&lt;br /&gt;
&lt;br /&gt;
Une approximation à l&#039;aide d&#039;une méthode type Euler ou Runge-Kutta va avoir un ordre de précision prédéfini.&lt;br /&gt;
&lt;br /&gt;
Toutes ces approximations ne se valent pas, et une analyse rigoureuse de la fiabilité de ces méthodes est nécessaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; il n&#039;est pas nécessaire de connaître les méthodes numériques au préalables car elles seront introduites et développées dans un cadre simple au fur et à mesure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre le fonctionnement de l&#039;approximation d&#039;une dérivée par une méthode numérique (type Euler et Runge-Kutta d&#039;ordre 2)&lt;br /&gt;
* Développer  un programme permettant de  prédire les mouvements des corps suivants: Jupiter, La Terre, et Le Soleil&lt;br /&gt;
* Mesurer l&#039;ordre de précision des deux méthodes numériques implémentées, et comparer à l&#039;ordre théorique.&lt;br /&gt;
* Si le temps le permet:&lt;br /&gt;
** Ajouter les schémas  Runge-Kutta 4 et 6&lt;br /&gt;
** modifier le code pour inclure Mars, Venus et Mercure&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
# La formulation générale du problème à N-corp est donnée ici: https://en.wikipedia.org/wiki/N-body_problem&lt;br /&gt;
# Ce type d&#039;étude peut devenir autrement plus complexe que la version présentée ici. Dans le film &amp;quot;The Martian&amp;quot; , un astronaute est piégé sur Mars, et son équipe qui était en route pour la terre doit venir le récupérer. Le centre de calcul &amp;quot;Pléiades&amp;quot; de la NASA est présenté, et utilisé pour déterminer s&#039;il est possible de renvoyer le vaisseau spatial récupérer l&#039;astronaute, notamment à l&#039;aide d&#039;une fronde gravitationnelle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Programmation graphique sur GPU]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé et objectifs :&#039;&#039;&#039; les cartes graphiques modernes permettent l&#039;affichage de millions de polygones avec des rendus presque réalistes en temps réel.&lt;br /&gt;
L&#039;objectif de ce sujet est de découvrir la modélisation 3D, puis les programmations spécifiques des vertex et fragment shaders pour réaliser certains types d&#039;effet (camera,&lt;br /&gt;
transformations géométriques, illumination, textures, halos, stylisations, incrustations).&lt;br /&gt;
Le pipeline OpenGL sera étudié, et accédé via WebGL/javascript/three.js. Dans une 2eme partie, certains shaders de shadertoy.com seront étudiés plus en détails, afin de&lt;br /&gt;
comprendre les nombreuses astuces utilisées par les experts du domaine pour faire des effets impressionnants en temps réel.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque :&#039;&#039;&#039; sujet discuté avec Vetea Stoll&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Magic Numbers et Jeux Vidéo]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé et objectifs :&#039;&#039;&#039; les magic numbers sont souvent considérés comme une mauvaise pratique en&lt;br /&gt;
programmation. Cependant, l&#039;algorithme emblématique de la racine carrée inverse rapide,&lt;br /&gt;
utilisé dans les moteurs de jeux vidéo comme Quake III Arena, justifie&lt;br /&gt;
l&#039;utilisation du fameux 0x5f3759df.&lt;br /&gt;
Ce sujet propose d&#039;étudier cet algorithme, ainsi que des sujets connexes.&lt;br /&gt;
&lt;br /&gt;
Travail à réaliser :&lt;br /&gt;
* Expliquer le fonctionnement détaillé de l&#039;algorithme.&lt;br /&gt;
* Comparer avec la méthode de Newton-Raphson&lt;br /&gt;
* Expliquer les applications pratiques&lt;br /&gt;
* Comparer les performances en temps d&#039;exécution et en mémoire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Indexation dans les Bases de Données]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sujet :&#039;&#039;&#039; en bases de données, les index sont essentiels pour accélérer les requêtes,&lt;br /&gt;
mais ils impliquent des compromis entre performance, espace et coût de&lt;br /&gt;
maintenance.&lt;br /&gt;
Dans ce sujet, vous étudierez les types d&#039;index (B-tree, Hash, etc.), leur&lt;br /&gt;
impact sur les requêtes et les modifications (``INSERT``, ``UPDATE``, ``DELETE``).&lt;br /&gt;
&lt;br /&gt;
Travail à réaliser :&lt;br /&gt;
* Expliquer les structures d’index (B-tree, Hash).&lt;br /&gt;
* Expliquer les différents cas d&#039;usage&lt;br /&gt;
* Expliquer l’impact des index sur les performances des requêtes (``SELECT WHERE``).&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ressource pour commencer :&#039;&#039;&#039;&lt;br /&gt;
# &amp;quot;Bases de données : concepts, utilisation et développement&amp;quot;, Jean-Luc Hainaut, chapitre 4 (disponible à la BU)&lt;br /&gt;
&lt;br /&gt;
== sujets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Génération de labyrinthes &amp;quot;organiques&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; la génération de labyrinthes est un problème classique, notamment abordé dans les cours d&#039;algorithmes de graphes. Ces méthodes permettent de générer des labyrinthes sur des &#039;&#039;grilles&#039;&#039;, typiquement carrées :&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze_grid.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
La création de labyrinthe &amp;quot;organiques&amp;quot;, du style&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
utilise une méthode très différente. Les détails sont décrits dans un article publié en  2006: http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf. La description peut sembler très abstraite, mais l&#039;idée initiale est assez simple : une courbe initiale est, petit à petit, déformée aléatoirement.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; comprendre la méthode de base, et l&#039;implémenter pour générer des labyrinthes organiques. La première version pourra être codée en Python, mais comme la méthode nécessite une &#039;&#039;grosse&#039;&#039; quantité de calculs, il pourra être intéressant de coder une seconde version en utilisant un langage compilé si l&#039;on souhaite obtenir de &amp;quot;gros&amp;quot; labyrinthes. De nombreuses améliorations sont décrites dans l&#039;article de H. Pedersen et K. Singh, et il serait intéressant de d&#039;en implémenter certaines, soient en Python (en les testant sur de petits labyrinthes) soit dans un autre langage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039; Hans Pedersen et Karan Singh, &#039;&#039;Organic Labyrinths and Mazes&#039;&#039;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== Tramage artistique d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le tramage d&#039;une image (en anglais *dithering* ou *half-toning*) consiste à esquisser une image en niveaux de gris ou en couleur à l&#039;aide de très peu d&#039;encres ou couleurs différentes. Historiquement, l&#039;utilisation la plus courante est en impression: un fax ne dispose que d&#039;une encre noire (donc 2 couleurs noir et blanc pour transférer une image), les imprimantes n&#039;ont que 4 encres (et donc cinq couleurs jaune, cyan, magenta, noir et le blanc du papier). Les premiers ordinateurs avaient des écrans avec très peu de couleurs, donc les photos étaient approchées avec 8 ou 16 couleurs. &lt;br /&gt;
&lt;br /&gt;
En informatique, les algorithmes de tramage par diffusion d&#039;erreur [https://fr.wikipedia.org/wiki/Algorithme_de_Floyd-Steinberg#:~:text=L%27algorithme%20de%20Floyd%2DSteinberg,un%20pixel%20à%20ses%20voisins. Floyd-Steinberg] sont faciles à implémenter et rapide, donc très utilisés.&lt;br /&gt;
&lt;br /&gt;
Néanmoins, il existe des algorithmes qui donnent des résultats beaucoup plus jolis, notamment celui proposé par Ostromoukhov et Hersch (1999). Nous proposons de l&#039;étudier et de l&#039;implémenter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-david.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-photo.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Floyd-Steinberg&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Ostromoukhov-Hersch&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre les principes du tramage, éventuellement coder en python/opencv l&#039;algorithme basique. Comprendre ensuite l&#039;algorithme d&#039;Ostromoukhov et Hersch (1999), et l&#039;implémenter en python, d&#039;abord en noir et blanc, et si le temps le permet, en couleur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://dl.acm.org/doi/pdf/10.1145/311535.311605 Ostromoukhov et Hersch, Multi-Color and Artistic Dithering, ACM SIGGRAPH 1999]&lt;br /&gt;
* [https://opencv.org OpenCV], pratique pour lire une image, l&#039;afficher, faire des traitements.&lt;br /&gt;
&lt;br /&gt;
=== Rendu réaliste de scènes 3D par lancer de rayons ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note : &#039;&#039;&#039; Sujet demandé par Lukas Rey.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le rendu réaliste de scène 3D a été (et reste) un des objectifs majeurs de l&#039;informatique graphique, notamment grâce à ses nombreuses applications dans différents domaines : le cinéma (effets spéciaux), mais aussi le marketing, la publicité, l&#039;architecture, ou l&#039;art. L&#039;algorithme le plus utilisé est appelé &amp;quot;lancer de rayons&amp;quot;, avec un objectif de simuler le trajet des rayons lumineux dans une scène 3D afin de déterminer les couleurs perçues par un observateur. Plutôt que de calculer tous les rayons lumineux d&#039;une scène, cet algorithme calcule seulement le trajet inverse des rayons lumineux qui arrivent dans l&#039;oeil de l&#039;observateur, ce qui est beaucoup plus économique. On verra que cet algorithme permet de simuler des matériaux réfléchissants ou (semi-)transparents, de calculer des ombres portées, de simuler du brouillard...&lt;br /&gt;
&lt;br /&gt;
[[file:ray-tracing.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Il s&#039;agit de comprendre d&#039;où vient la couleur perçue d&#039;un objet, d&#039;implémenter l&#039;algorithme récursif classique du lancé de rayons, au moins avec des objets simples (sphères, tétraèdres), et de voir comment optimiser les calculs (car ça devient vite coûteux). On pourra s&#039;appuyer sur ce [https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html TP] pour l&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://en.wikipedia.org/wiki/Ray_tracing_(graphics)&lt;br /&gt;
* https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html&lt;br /&gt;
&lt;br /&gt;
=== Rendu temps réel avec OpenGL ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Colin Weill-Duflos&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; On cherche à utiliser une API graphique (OpenGL) afin de faire du rendu de scène 3d en utilisant la carte graphique. Cela permet d&#039;utiliser les techniques de rendu 3d en temps réel (rastérisation) et de les faire effectivement fonctionner en temps réel, permettant d&#039;afficher une scène avec laquelle on peut intéragir : en déplaçant la caméré, en bougeant des éléments...&lt;br /&gt;
Ces techniques ont déjà été utilisée dans des années précédentes, sans utiliser la carte graphique (le résultat était assez lent). Grâce à OpenGL, la plupart de ces opérations peuvent s&#039;effectuer sur la carte graphique, ce qui permet de ne pas avoir à en recoder une partie (grâce à des composants capables de faire uniquement ces opérations) et d&#039;être plus rapide.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre les techniques de raterisation&lt;br /&gt;
* comprendre la pipeline OpenGL&lt;br /&gt;
* implémenter une scène avec un objet et une caméra controlable&lt;br /&gt;
* rajouter des shaders pour simuler la lumière (Phong shading), variantes stylisées (Toon shading)&lt;br /&gt;
* rajouter des textures sur la scène&lt;br /&gt;
* faire des shadow maps pour les ombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [Travaux précédents](http://os-vps418.infomaniak.ch:1250/mediawiki/images/0/0d/Gossin-2023.pdf)&lt;br /&gt;
* [Pipeline OpenGL](https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview)&lt;br /&gt;
* [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
* [Toon shading](https://fr.wikipedia.org/wiki/Ombrage_de_cellulo%C3%AFd)&lt;br /&gt;
* [Shadow maps](https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping)&lt;br /&gt;
&lt;br /&gt;
=== Problèmes indécidables ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Quand on a un calcul à faire, on peut se demander de la meilleure implémentation pour faire faire ce calcul par un ordinateur. On pense généralement moins à la question - pourtant primordiale - de savoir si ce calcul peut être effectué par l’ordinateur. Pourtant, on sait depuis l’origine de l’informatique qu’il existe des fonctions que l’on ne peut pas calculer à l’aide d’un ordinateur.  On cherchera à comprendre ce que serait un programme qui résoudrait le problème de l’arrêt et pourquoi, il ne marchera pas. On pourra se demander alors s’il y a un lien entre les différents problèmes non-calculables : avec une librairie qui résout le problème de l’arrêt, peut-on écrire un problème qui résout le problème de correspondance de Post ? Peut-on imaginer un problème qu’on ne pourrait pas résoudre même si on avait une fonction qui résolvait le problème de l’arrêt ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de fonction calculable (et donc de fonction non-calculable). Donner des exemples. &amp;quot;Coder&amp;quot; l’argument diagonal de la non-calculabilité de l’arrêt. Coder une réduction entre deux problèmes non-calculables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Th%C3%A9orie_de_la_calculabilit%C3%A9 Wikipédia - Théorie de la calculabilité]&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_l%27arr%C3%AAt Wikipédia - Problème de l&#039;arrêt]&lt;br /&gt;
* [https://ludovicpatey.com/courses/comp-thy-2023/cr11-fr.pdf Livre récent en français sur la théorie de la calculabilité]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Réseaux de neurones et apprentissage ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; sujet demandé par Elliot Moiroud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
# se familiariser avec les concepts utilisés en apprentissage,&lt;br /&gt;
# essayer d&#039;implémenter une version ultra simple de la procédure d&#039;apprentissage,&lt;br /&gt;
# utiliser une bibliothèque existante sur quelques exemples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
# http://neuralnetworksanddeeplearning.com/&lt;br /&gt;
&lt;br /&gt;
=== Synchronisation dans les Systèmes Distribués ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; l&#039;algorithme de Lamport joue un rôle crucial dans la synchronisation des horloges dans un réseau de machines qui ne sont pas nécessairement précises ou synchronisées entre elles. Il permet de créer un consensus sur l&#039;ordre des événements dans un système distribué, où la communication peut être retardée ou désordonnée. Cette capacité est fondamentale pour assurer la cohérence et la fiabilité des opérations dans des environnements distribués, tels que les bases de données distribuées, les systèmes de fichiers en réseau et les applications de blockchain. Après avoir maîtrisé l&#039;algorithme de Lamport, l&#039;étudiant pourra les fautes byzantines pour comprendre comment les systèmes distribués gèrent les informations contradictoires ou erronées transmises par différents nœuds du réseau.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Analyser et comprendre l&#039;algorithme de Lamport pour la synchronisation des horloges.&lt;br /&gt;
# (Examiner les fautes byzantines et leur influence sur la stabilité des systèmes distribués.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Time, Clocks, and the Ordering of Events in a Distributed System.&lt;br /&gt;
https://lamport.azurewebsites.net/pubs/time-clocks.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation dynamique et complexité ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; La programmation dynamique est sans doute une des techniques de programmation qui porte le plus mal son nom.  Elle s&#039;applique lorsqu&#039;un problème peut se décomposer en sous-problèmes, dont les solutions peuvent être combinées. Dans le cas relativement simples où les sous-problèmes sont toujours disjoint, on utilise une approche de type &amp;quot;diviser pour rêgner&amp;quot;. Lorsque ce n&#039;est pas le cas, il faut faire attention à ne pas dupliquer les calculs. Les deux approches habituelles sont :&lt;br /&gt;
# la &amp;quot;mémoization&amp;quot;, qui consiste à sauvegarder toutes les solutions trouvées pour éviter de les recalculer,&lt;br /&gt;
# la &amp;quot;programmation dynamique&amp;quot; qui consiste à faire les solutions dans le &amp;quot;bon ordre&amp;quot; afin de ne jamais avoir besoin d&#039;une solution qui n&#039;aurait pas été calculée.&lt;br /&gt;
&lt;br /&gt;
Ces techniques permettent en général d&#039;obtenir un algorithme beaucoup plus rapide que la version naïve.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# étudier les méthodes de &amp;quot;mémoization&amp;quot; et &amp;quot;programmation dynamique&amp;quot; sur plusieurs exemples et les comparer&lt;br /&gt;
# mettre en évidence les complexités &amp;quot;pratiques&amp;quot; de ces algorithmes au moyen de benchmarks pertinents&lt;br /&gt;
# comprendre les calculs &amp;quot;théoriques&amp;quot; de la complexité de ces algorithmes pour vérifier que les prédictions correspondent à la pratique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;Introduction à l&#039;algorithmique&amp;quot;, T. Cormen, C. Leiserson, R. Rivest, C. Stein&lt;br /&gt;
# la page wikipedia française : https://fr.wikipedia.org/wiki/Programmation_dynamique&lt;br /&gt;
&lt;br /&gt;
== sujets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
=== algorithmes de recherche de chaines ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : rechercher si une chaine &#039;&#039;s1&#039;&#039; apparait à l&#039;intérieur d&#039;une chaine &#039;&#039;s2&#039;&#039; est assez simple, mais l&#039;algorithme naïf n&#039;est pas très rapide. L&#039;objectif de ce sujet est de s&#039;intéresser à certains algorithmes de recherche de sous-chaines plus efficaces. Le plus simple est probablement l&#039;algorithme KMP (du noms de ses inventeurs : Knuth, Morris et Pratt) qui évite des comparaisons inutiles de l&#039;algorithme naïf. L&#039;algorithme de Boyer-Moore utilise des idées similaires mais considère la sous-chaine (&#039;&#039;s1&#039;&#039;) à l&#039;envers, ce qui lui permet d&#039;aller en général plus vite. Ces algorithmes restent assez lents lorsque la chaine &#039;&#039;s2&#039;&#039; est très grande. C&#039;est par exemple le cas en bio-informatique lorsque l&#039;on doit rechercher des chaines dans le génome. Dans ce cas, la chaine &#039;&#039;s2&#039;&#039; est fixe et on rercherche de nombreuses sous-chaines &#039;&#039;s1&#039;&#039;. Il est alors possible de faire un &#039;&#039;pré-traitement&#039;&#039; pour faire une recherche beaucoup plus rapide qui ne dépend pas de la taille de &#039;&#039;s2&#039;&#039; !&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de quelques uns de ces algorithmes&lt;br /&gt;
*# les implémenter (par exemple en Python)&lt;br /&gt;
*# essayer de les comparer&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
# https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm&lt;br /&gt;
# transformé de Burrows-Wheeler et recherche de sous-chaines https://www.youtube.com/watch?v=P3ORBMon8aw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== génération de labyrinthes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : il existe de nombreuses méthodes algorithmiques pour générer des labyrinthes aléatoires. La plupart de ces méthodes sont expliquées sur des grilles carrées mais il est possible de les implémenter sur d&#039;autres types de grilles. Il est possible des les adapter par exemple pour générer des labyrinthes circulaires, cylindriques, ou sphériques ; ou bien des labyrinthes en plusieurs parties (de grandes pièces contenant des labyrinthes, reliées par des couloirs formant un autre labyrinthe).&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de plusieurs algorithmes de génération de labyrinthes&lt;br /&gt;
*# les étendres à des grilles plus intéressantes&lt;br /&gt;
*# &#039;&#039;expérimenter et chercher des manières simples de générer un labyrinthe &amp;quot;continu&amp;quot;&#039;&#039; (La solution décrite dans &amp;quot;How to Generate Perfect Mazes?&amp;quot; est probablement un peu trop complexe.)&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** le livre &amp;quot;Mazes for programmers&amp;quot;, https://pragprog.com/titles/jbmaze/mazes-for-programmers/&lt;br /&gt;
** l&#039;article &amp;quot;How to Generate Perfect Mazes?&amp;quot;, https://hal.uca.fr/hal-03174952/file/article-journal-2020.pdf&lt;br /&gt;
** l&#039;article &amp;quot;Organic Labyrinths and Mazes&amp;quot;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== L’infâme GOTO ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : L’instruction goto n’a aujourd’hui plus la côte parmi les informaticiens, et est souvent considérée comme une instruction à bannir. L&#039;idée est d&#039;explorer ce que permet cette instruction, et comment a évolué son utilisation.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# remplacer des structures de contrôles simples simples par des goto&lt;br /&gt;
*# faire un programme plus complexe utilisant un maximum de goto&lt;br /&gt;
*# expliquer l&#039;évolution de l&#039;utilisation du goto&lt;br /&gt;
*# avantages/inconvénients de son utilisation&lt;br /&gt;
*# comparaison des langages prenant en charge ou non cette instruction et pourquoi&lt;br /&gt;
*# utilisation actuelle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Blockchains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : les blockchains sont de plus en plus populaires, utilisées initialement pour les cryptomonnaies, elles peuvent être utilisées pour stocker des données, gérer les contrats intelligents, etc.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre le fonctionnement des blockchains (par exemple avec l&#039;article de Satoshi Nakamoto)&lt;br /&gt;
*# implémenter une blockchaine&lt;br /&gt;
*# ...&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de reconstruction de surfaces à partir d&#039;images 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les images 3D sont devenues courantes avec les outils d&#039;acquisition comme les scanners X ou les scanners IRM. On peut aussi modéliser des objets 3D sous forme de volumes, pour ensuite en extraire des surfaces (e.g. modélisation de fluides, de feu ou de fumées). Un enjeu est de pouvoir construire des surfaces qui représentent le bord d&#039;objets d&#039;intérêt dans ces données volumiques. Les algorithmes les plus classiques reconstruisent une surface composée de triangles qui approchent un niveau de gris donné dans le volume 3D :  c&#039;est une iso-surface, comparable à une courbe d&#039;iso-altitude dans une carte topographique, mais en 3D ! On  s&#039;intéreressera à deux algorithmes particulièrement : le marching-tetrahedra et le marching-cubes.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre ce qu&#039;est une iso-surface dans une image 3D ou dans une fonction implicite.&lt;br /&gt;
*# Comprendre les points communs et différences des algorithmes Marching Tetrahedra et Marching Cubes&lt;br /&gt;
*# Implémenter un des deux algorithmes. On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python. &lt;br /&gt;
*# On lira des fichiers .vol pour les images 3D, qui vous seront fournies.&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_tetrahedra Marching Tetrahedra sur wikipedia]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_cubes Marching Cubes sur wikipedia]&lt;br /&gt;
** [https://dl.acm.org/doi/pdf/10.1145/37402.37422 Lorensen, Cline, Marching cubes: a high resolutions 3D surface construction algorithm, Computer Graphics, 21(4), 1987]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-slices.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-isosurface.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Coupes dans une image 3D &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Isosurface dans cette image &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Invitation à la complexité algorithmique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
* Résumé : on abordera le thème de la complexité algorithmique : étant donné un programme implémentant une fonction, peut-on borner son temps de calcul en fonction de la taille de ses entrées. On procédera par l&#039;exemple, en tentant de confirmer la théorie par des expériences concrets de petits programmes (par exemple en Python). Comme point d&#039;entrée, on pourra par exemple examiner les différences de complexité entre quelques algorithmes de tri.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre l&#039;intérêt de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;,&lt;br /&gt;
*# se familiariser avec les notions et notations utilisées pour décrire la complexité en temps de calcul (ou en mémoire) des algorithmes,&lt;br /&gt;
*# apprendre à vers de &amp;quot;benchmarks&amp;quot; pour évaluer l&#039;efficacité réelle d&#039;une fonction dans un langage de programmation,&lt;br /&gt;
*# comprendre les limites de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== sujets 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
===Rust et la notion d&#039;appartenance (&amp;quot;ownership&amp;quot;)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Théo Connetable : [[Fichier:VISI401-2022-Connetable.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : dans la plupart des langages &amp;quot;haut niveau&amp;quot; (Python, Java, Javascript, ...), la mémoire est gérée automatiquement. Par exemple, Python détecte qu&#039;une liste ne sert plus à rien pour libérer la mémoire qu&#039;elle occupait. Dans les langages &amp;quot;bas niveau&amp;quot; (C), c&#039;est au programmeur de libérer explicitement la mémoire qu&#039;il utilise. (S&#039;il ne le fait pas, son programme risque d&#039;avoir des &amp;quot;fuites de mémoire&amp;quot;.) Rust est un nouveau (première version en 2010) langage de programmation. Un des objectifs de Rust est d&#039;offrir des garanties de sécurité sur la mémoire avec la notion d&#039;appartenance. Ces garanties sont testées à la compilation et ne dégradent donc pas l&#039;efficacité du programme final.&lt;br /&gt;
* Objectifs : l&#039;objectif, après s&#039;être familiarisé avec le langage Rust, est de comprendre à quoi correspond la notion de &amp;quot;ownership&amp;quot; (&amp;quot;appartenance&amp;quot;) et de l&#039;illustrer sur quelques exemples. Si l&#039;étudiant ne les connait pas, les notions de pointeurs (en C), d&#039;allocation sur la pile, sur le tas, et le concept de &amp;quot;ramasse miettes&amp;quot; (garbage collector&amp;quot; en anglais) seront des étapes préliminaires importantes.&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# The Rust Programming Language https://doc.rust-lang.org/book/title-page.html, avec en particulier la section 4, &amp;quot;Understanding Ownership&amp;quot;&lt;br /&gt;
*# Safe Systems Programming in Rust https://cacm.acm.org/magazines/2021/4/251364-safe-systems-programming-in-rust/fulltext&lt;br /&gt;
*# Rust Ownership by Example https://depth-first.com/articles/2020/01/27/rust-ownership-by-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Bitcoin &amp;amp; blockchain===&lt;br /&gt;
* Présentation : Baptiste Griva [[Fichier:VISI401-2022-Griva.pdf]]&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Les blockchain sont de plus en plus populaires. Avec l&#039;article de Satoshi Nakamoto, l&#039;étudiant devra comprendre son fonctionnement. On pourra dans un second temps s&#039;intéresser aux attaques habituelles face à une blockchain.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre le fonctionnement de la blockchain bitcoin&lt;br /&gt;
*# S&#039;intéresser à ses vulnérabilités (51% attack,...)&lt;br /&gt;
* Références: pour commencer https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
===Débruitage d&#039;image===&lt;br /&gt;
* Présentation : Lucas Policastro [[Fichier:VISI401-2022-Policastro.pdf]]&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La plupart des procédés d&#039;acquisition d&#039;image (typiquement capteurs CCD ou CMOS des caméras ou téléphones) ne sont pas parfaits et introduisent du bruit (des perturbations) dans les images résultantes. Ce bruit ressemble en général à une perturbation aléatoire locale par capteur, indépendante de ce  qui se passe sur un capteur proche. Peut-on alors améliorer la qualité visuelle d&#039;une photo dégradée par un tel bruit (typiquement gaussien) ? On regardera notamment les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
*# On pourra s&#039;appuyer sur les démos IPOL en ligne de ces algorithmes et leur description. http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
*# L&#039;algorithme des moyennes non locales est implémentable relativement facilement (même en numpy).&lt;br /&gt;
* Références:&lt;br /&gt;
** http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
** Le site https://www.ipol.im contient plein d&#039;algos de restauration d&#039;image (suivre Enhancement &amp;amp; Restoration, puis Denoising).&lt;br /&gt;
&lt;br /&gt;
===Sécurité des cartes RFID : le cas Mifare===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Paul Aubry [[Fichier:VISI401-2022-Aubry.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : les cartes RFID (Radio Frequency IDentification) sont des cartes à puce qui peuvent communiquer avec un lecteur distant (mais proche). De nombreuses cartes de transport en commun ou d&#039;ouverture de portes utilisent cette technologie. La carte Mifare classic, très répandue, utilise un protocole cryptographique pour éviter les &amp;quot;replay attacks&amp;quot; (enregistrer un échange pour le réutiliser) et le clonage de la carte. Le détails du protocole est longtemps resté un secret industriel, mais ceci n&#039;a pas empéché la découverte de *grosses* failles. Il est maintenant possible de cloner une carte Mifare en quelques secondes avec du matériel grand public.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre fonctionne la protection contre les &amp;quot;replay attacks&amp;quot; à partir de challenges cryptographiques&lt;br /&gt;
*# comprendre le protocole Mifare classic&lt;br /&gt;
*# comprendre les attaques sur le protocole&lt;br /&gt;
*# expérimenter avec des puces RFID existante *(facultatif)*&lt;br /&gt;
*# regarder les évolutions du protocole pour se protéger de ces attaques&lt;br /&gt;
* Référence : F. D. Garcia, P. van Rossum, R. Verdult, R. Wichers Schreur : &amp;quot;Wirelessly Pickpocketing a Mifare Classic Card&amp;quot; https://www.cs.ru.nl/~flaviog/publications/Pickpocketing.Mifare.pdf&lt;br /&gt;
&lt;br /&gt;
===Ingénierie Dirigée par les Modèles (IDM)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Alexandre Desbos [[Fichier:VISI-401-2022-Desbos.pdf]]&lt;br /&gt;
* Tuteur : Philippe Pernelle&lt;br /&gt;
* Résumé : l&#039;ingénierie dirigée par les modèles (ou MDE Model Driven Engineering) est une approche de conception basée sur la transformation de modèle sur des niveaux d&#039;abstraction différents (modèle, méta-modèle, méta-méta-modèle ...). l&#039;OMG propose une approche MDE basée sur 3 niveaux  d&#039;abstraction (CIM,PIM, PSM)  permettant de bâtir une application  en partant du niveaux d&#039;abstraction le plus haut (CIM) et en procédant par transformation / raffinement pour arriver au PSM puis à la génération de code. Il existe par ailleurs différents langages  (ATL, OCL) qui vont faciliter la transformation de modèle. A noter que la fondation Eclipse propose un environnement spécifique pour manipuler des modèles avec des implémentations d&#039;ATL et d&#039;OCL&lt;br /&gt;
* Objectifs :  L&#039;objectif est d&#039;étudier ces mécanismes de transformation / raffinement par l&#039;implémentation d&#039;un cas d&#039;étude dans eclipse en utilisant les langages ATL et OCL. Après une étude bibliographique des principes de MDA, l&#039;idée est de mettre en oeuvre dans Eclipse des extrait des modèles CIM, PIM et PSM proposés par les articles ci-dessous puis d&#039;essayer de construire des OCL et des scripts ATL afin de faciliter la transformation (sans aller jusqu&#039;à la génération de code)&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# These : https://hal.archives-ouvertes.fr/tel-01247610 (uniquement les pages 35 à 47)&lt;br /&gt;
*# Models and Mechanisms for implementing playful scenarios https://hal.archives-ouvertes.fr/hal-01372311&lt;br /&gt;
*# Digital Twin and Ecological Transition Integration in Training Process https://hal.archives-ouvertes.fr/hal-03375508&lt;br /&gt;
*# Eclipse Modeling Tools https://www.eclipse.org/downloads/packages/release/2021-12/r/eclipse-modeling-tools&lt;br /&gt;
&lt;br /&gt;
===[[Couvrir un polygone rectilinéaire avec des rectangles]]===&lt;br /&gt;
* Présentation : Maxent Bernier [[Fichier:VISI401-2022-Bernier.pdf]]&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Un polygone est dit rectilinéaire si les seuls angles qui apparaissent sont des angles droits. On considérera des polygones simples (i.e., sans trous et qui ne s&#039;auto-intersectent pas). Un tel polygone peut donc être recouvert par des carrés ou par des rectangles. On cherchera à écrire un algorithme qui trouve une couverture minimale (i.e., avec le moins de carrés/rectangles possibles). Dans le cas des carrés, on va pouvoir trouver un algorithme efficace pour ce problème. Malheureusement, le cas de la couverture minimale par les rectangles est NP-complète. &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme de recouvrement par des carrés&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet et le lien avec la couverture par les rectangles&lt;br /&gt;
*# Contourner la difficulté de la NP-complétude (heuristique ou cas des polygones orthogonalement convexes)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polygon_covering#cite_note-cr88-4  Couvertures de polygones (Wikipedia)]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/NP-completeness NP-complétude (Wikipedia)]]&lt;br /&gt;
** [[http://webdocs.cs.ualberta.ca/~joe/Preprints/Cover/paper.ps La couverture par rectangles est NP-complète]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires ===&lt;br /&gt;
&lt;br /&gt;
*Présentation : Emilien Boitouzet [[Fichier:VISI401-2022-Boitouzet.pdf]]&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
[[Fichier:automate_1.png]] [[Fichier:automate_2.jpeg]]&lt;br /&gt;
* Sujet : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser des calculs. Cependant les réalisations pratiques manquent, ce sujet se propose d’étudier l’utilisation des automates cellulaires dans les domaines suivant par exemple :&lt;br /&gt;
*# Modélisation des systèmes complexes (propagation des feux de forêt, processus de percolation, écoulement du sable ...)&lt;br /&gt;
*# Modélisation du comportement d&#039;un gaz&lt;br /&gt;
*# Système dynamique discret alternatif au modèle physique des équations aux dérivées partielles&lt;br /&gt;
*# Modélisation de la croissance de tissus cellulaires en biologie&lt;br /&gt;
*# Simulation de la croissance des cristaux&lt;br /&gt;
*# Correction automatique d’erreurs en imagerie&lt;br /&gt;
* Référence: https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
&lt;br /&gt;
=== Programmation bare-metal ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Andrien Montmayeur [[Fichier:VISI401-2022-Montmayeur.pdf]]&lt;br /&gt;
* Tuteur : Colin Weill-Duflos&lt;br /&gt;
* Sujet : l&#039;execution d&#039;un programme compilé peut parfois paraître un peu magique: on ne comprend pas forcément tout ce que fait le compilateur, et le système d&#039;exploitation fournit des abstractions bien pratiques. Comment se débrouille-t-on dans un contexte où il n&#039;y a pas de système d&#039;exploitation, comme certaines applications embarquées ou bien le système d&#039;exploitation lui-même?&lt;br /&gt;
* Objectifs : comprendre en détails la chaîne de compilation du C, l&#039;architecture d&#039;un executable et comment ce dernier est executé par une machine pour parvenir à faire executer un programme directement par un microprocesseur arm et interagir avec des périphériques simples.&lt;br /&gt;
* Référence:&lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Executable_and_Linkable_Format Architecture d&#039;un executable]&lt;br /&gt;
*#[https://aticleworld.com/c-compilation-process/ les étapes de compilation du C] (regarder notamment le linkage)&lt;br /&gt;
*# [https://azeria-labs.com/arm-data-types-and-registers-part-2/ débuter avec l&#039;assembleur arm]&lt;br /&gt;
&lt;br /&gt;
===GeoGebra et algèbre géométrique ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Nolann Sanmarti [[Fichier:VISI401-2022-Sanmarti.pdf]]&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Sujet : l&#039;algèbre géométrique émerge récemment comme un outil prometteur pour la synthèse d&#039;images : avec des points de contrôle, un produit, il est possible de représenter et de manipuler de manière efficace un ensemble d&#039;objets géométriques. Récemment, des bibliothèques c++ ont été développées. Ces bibliothèques autorisent une utilisation générique de l&#039;algèbre géométrique mais sont encore limitées par le manque d&#039;outils intéractifs adaptés. Par ailleurs, le logiciel de visualisation GeoGebra est un outil particulièrement utile pour la visualisation et la résolution de problèmes géométriques. Le but de ce projet serait de travailler un binding entre l&#039;algèbre géométrique et GeoGebra.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# se familiariser avec l&#039;algèbre géométrique, et l&#039;applet Javascript de GeoGebra,&lt;br /&gt;
*# identifier les objets et les opérations géométriques intéressantes à visualiser avec l&#039;algèbre géométrique,&lt;br /&gt;
*# implantations d&#039;une méthode générique permettant de générer des scripts dans l&#039;applet Javascript de GeoGebra.&lt;br /&gt;
* Références :&lt;br /&gt;
*# Projective geometric algebra: A new framework for doing euclidean geometry, Charles G. Gunn, 2019&lt;br /&gt;
*# [http://www.geogebra.org geogebra]&lt;br /&gt;
&lt;br /&gt;
== sujets 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
=== Comment Facebook gère ses données ?  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Pour une base de données, il est impossible d&#039;être cohérent, disponible tout le temps et partitionné. C&#039;est le fameux théorème CAP. Pour autant, les données de Facebook sont cohérentes, disponibles tout le temps, et réparties à travers le monde !? Impossible. Pour l&#039;étudiant, il faudra comprendre pourquoi c&#039;est impossible, et comment Facebook fait en pratique pour gérer ce problème.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le CAP théorème, et sa démonstration&lt;br /&gt;
*# Comprendre comment Facebook gère ce problème, et ses données d&#039;une manière générale&lt;br /&gt;
*# À définir, selon les questions que se pose l&#039;étudiant.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Théorème CAP :&lt;br /&gt;
*## https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_CAP&lt;br /&gt;
*## Brewer&#039;s Conjeture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services (https://awoc.wolski.fi/dlib/big-data/GiLy02-CAP.pdf)&lt;br /&gt;
*# Facebook Social Graph :&lt;br /&gt;
*## TAO : The power of the graph (https://engineering.fb.com/2013/06/25/core-data/tao-the-power-of-the-graph/)&lt;br /&gt;
*## TAO: Facebook’s Distributed Data Store for the Social Graph (https://www.usenix.org/system/files/conference/atc13/atc13-bronson.pdf)&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de calcul de l&#039;enveloppe convexe  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les ensembles convexes ont beaucoup de propriétés géométriques intéressantes, par exemple détecter la collision de deux ensembles convexes est &amp;quot;facile&amp;quot; algorithmiquement. Une étape fréquente dans beaucoup d&#039;algorithmes de traitements de données 2D/3D/nD est donc de calculer l&#039;enveloppe convexe d&#039;un nuage de points, c&#039;est-à-dire le plus petit ensemble convexe contenant ces points. Il existe de nombreux algorithmes de calcul d&#039;enveloppe convexe en 2D (Graham scan, Melkman, balayage de ligne (sweep-line), division-fusion, Chan&#039;s algorithm, Quickhull) et 3D (Chan&#039;s algorithm, Quickhull) et même nD (Quickhull notamment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
|Enveloppe convexe des points à coordonnées entières inclus dans une boule de diamètre 25&lt;br /&gt;
|----&lt;br /&gt;
[[Fichier:Qhull-25.png|300px]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Objectifs: il s&#039;agira de regarder quelques uns de ces algorithmes, d&#039;identifier leurs principales différences ainsi que leurs complexités théoriques et pratiques. On pourra aussi regarder plus précisément l&#039;algorithme Quickhull, dont l&#039;implémentation 2D est facile, et 3D accessible.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Barber, C. B., Dobkin, D. P., &amp;amp; Huhdanpaa, H. (1996). The quickhull algorithm for convex hulls. ACM Transactions on Mathematical Software (TOMS), 22(4), 469-483 [[https://www.researchgate.net/profile/Hannu_Huhdanpaa/publication/242414606_The_Quickhull_Algorithm_for_Convex_Hulls/links/54e5f6970cf2bff5a4f1e7db.pdf (PDF)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Graham_scan Algorithme de Graham (Wikipedia)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Convex_hull_algorithms Convex hull algorithms (Wikipedia)]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes autour des polyominos ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Un polyomino est une forme (sans trou) obtenue en collant des petits carrés de taille 1 par leurs bords. Des exemples connus sont par exemples les pièces du jeu tetris : il s&#039;agit de &amp;quot;tétramino&amp;quot;, c&#039;est à dire de polyomino formés de 4 carrés. Voici également les pentaminos, composés de 5 carrés :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:polyominos.png]]&lt;br /&gt;
&lt;br /&gt;
Une question récurrente est celle de la pavabilité : peut-on (en utilisant certains types de polyominos) paver un domaine donné.&lt;br /&gt;
Lorsque le domaine est fini, on peut utiliser une recherche exhaustive, mais lorsqu&#039;on veut paver tout le plan, le problème devient indécidable en général.&lt;br /&gt;
Nous nous intéresserons au cas le plus simple : est-il possible de paver le plan tout entier en utilisant des polyominos tous identiques, et en utilisant uniquement des translations.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pavages.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les définitions et notions de bases des polyominos, et en particulier leur représentation comme mot de contour&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance de polyominos en Python&lt;br /&gt;
*# comprendre la caractérisation des polyominos &amp;quot;exacts&amp;quot;, càd ceux qui pavent le plan&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance des polyominos exacts en Python&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Bibliographie initiale&lt;br /&gt;
*# [http://www.xprov.org/doc/these-XProvencal.pdf &amp;quot;Combinatoire des mots, géométrie discrète et pavages&amp;quot;], Xavier Provencal (chapitres 1 et 2)&lt;br /&gt;
*# [https://www.lama.univ-smb.fr/pagesmembres/vuillon/IanRAIRO.pdf &amp;quot;An algorithm for deciding if a polyomino tiles the plane by translation&amp;quot;], Ian Gambini et Laurent Vuillon&lt;br /&gt;
&lt;br /&gt;
=== Version algorithmique du lemme local de Lovász  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons un problème standard sur le routage de paquets dans des réseaux. Donnés un réseau et une collection de paquets, chacun venant avec un chemin dans le réseau (de la source vers la destination), le but est d’établir un planning qui minimise le temps pour que tous les paquets atteignent leur destination. Il est naturel de mesurer la qualité d’un tel planning en fonction de deux paramètres : la congestion c qui est le nombre maximum de paquets qui doivent emprunter une même arête du réseau et la dilatation d qui est le nombre maximum d’arêtes d’un chemin. En effet, il est facile de trouver un planning en temps c*d, et tout planning doit prendre comme temps au moins max(c,d). &lt;br /&gt;
&lt;br /&gt;
En 1994, Leighton, Maggsand et Rao ont montré qu’il existait toujours un planning en temps O(c+d). Malheureusement, ce résultat est basé sur le lemme local de Lovász. Il s’agit d’un résultat classique de combinatoire dont la preuve était à l’époque non constructive. Le problème précédent du routage de paquets n’est qu’une application de ce lemme parmi tant d’autres. En 2010, Moser et Tardos donnèrent un algorithme (en plus assez simple et efficace) pour le lemme local de Lovász.&lt;br /&gt;
&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le lemme local de Lovász et certaines de ses applications&lt;br /&gt;
*# Coder la version algorithmique de Moser et Tardos&lt;br /&gt;
*# Coder des applications du lemme (comme par exemple le routage de paquets)&lt;br /&gt;
* Bibliographie initiale : &lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Algorithmic_Lov%C3%A1sz_local_lemma Page wikipedia de la version algorithmique du lemme local de Lovász]&lt;br /&gt;
*# [http://www.scs.cmu.edu/afs/cs.cmu.edu/project/phrensy/pub/papers/LeightonMR94.pdf Application aux routage de paquets par Leighton, Maagsand et Rao]&lt;br /&gt;
*# [https://arxiv.org/pdf/0903.0544.pdf La version algorithmique du lemme local de Lovász par Moser et Tardos]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* Crypto-système de Merkle-Hellman et algorithme de Shamir, Ewan Rakotoanosy (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Reconstruction de surfaces à partir de nuages de points et de normales, Yohan Thépaut (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Algorithmes de super-résolution par apprentissage, Romain Théodet (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Autour de la question de la sensibilité des fonctions Booléennes, Christophe Carmagnac (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Structures de données purement fonctionnelles]], Loïc Dornel (Tuteur : Tom Hirschowitz)&lt;br /&gt;
* Automates cellulaires et décidabilité, Lucas Chardonnet (Tuteur : François Boussion)&lt;br /&gt;
&lt;br /&gt;
== sujets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
=== Crypto-système de Merkle-Hellman et algorithme de Shamir ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Le système de Merkle-Hellman est un système cryptographique de type &amp;quot;clé publique / clé privée&amp;quot;. Il a été inventé juste en 1978, après le système RSA (encore utilisé). Ce système a l&#039;avantage d&#039;être un peu plus simple, mais le **gros** désavantage d&#039;avoir été craqué par A. Shamir en 1984. L&#039;objectif est de comprendre le système, et la faille qu&#039;il contenait. Cela permettra de comprendre l&#039;algorithme de Shamir...&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Shamir, Adi (1984). &amp;quot;A polynomial-time algorithm for breaking the  basic Merkle - Hellman cryptosystem&amp;quot;. IEEE Transactions on Information  Theory. 30 (5): 699–704. doi:10.1109/SFCS.1982.5 [[http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.123.5840&amp;amp;rep=rep1&amp;amp;type=pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Reconstruction de surfaces à partir de nuages de points et de normales ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les lasers d&#039;acquisition de données 3d permettent de fabriquer des données qui approchent le bord d&#039;un objet 3D. Ces données sont souvent sous la forme d&#039;un nuage de points, doublé d&#039;un vecteur associé à chaque point et qui indique la direction normale à la surface de l&#039;objet. On parle de données de Hermite. Il existe des algorithmes dédiés, très efficaces et robustes, pour reconstruire une surface qui passe par ces points. L&#039;objectif est de comprendre les deux principales méthodes, l&#039;une appelée reconstruction de Poisson, l&#039;autre relié à la notion d&#039;indice (ou winding number), leurs qualités et leur défaut.&lt;br /&gt;
* Bibliographie initiale:&lt;br /&gt;
** KAZHDAN, Michael, BOLITHO, Matthew, et HOPPE, Hugues. Poisson surface reconstruction. In : Proceedings of the fourth Eurographics symposium on Geometry processing. 2006 [[http://faculty.cs.tamu.edu/schaefer/teaching/689_Fall2006/poissonrecon.pdf PDF]]&lt;br /&gt;
** BARILL, Gavin, DICKSON, Neil G., SCHMIDT, Ryan, et al. Fast winding numbers for soups and clouds. ACM Transactions on Graphics (TOG), 2018, vol. 37, no 4, p. 43. [[http://www.dgp.toronto.edu/projects/fast-winding-numbers/fast-winding-numbers-for-soups-and-clouds-siggraph-2018-compressed-barill-et-al.pdf]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de super-résolution par apprentissage ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La super-résolution consiste à, étant donné une image M x N, de fabriquer une image &amp;quot;zoomée&amp;quot; de taille kM x kN, où l&#039;information inventée est &amp;quot;crédible&amp;quot;. Le problème est évidemment mal posé mathématiquement, et du coup on rajoute de l&#039;information a priori : continuité des couleurs, continuité des structures géométriques, modèles probabilistes, moyennes non-locales (auto-similarités), etc. Avec l&#039;avènement du deep learning, des méthodes à base d&#039;apprentissage ont vu le jour. En gros, un réseau de neurones (CNN) apprend sur plein d&#039;images en &amp;quot;dézoomant&amp;quot; les images en entrées (facile, on sous-échantillonne), puis on utilise la fonction construite pour faire la super-résolution.&lt;br /&gt;
* L&#039;objectif est de regarder les méthodes de super-résolution, notamment celles par apprentissage et de voir leurs qualités et défauts. On pourra aussi les comparer avec des méthodes purement géométriques de super-résolution, ou des méthodes de moyennes non-locales.&lt;br /&gt;
* Ce sujet a été discuté avec Romain Théodet et conduit à un stage au LAMA pour combiner méthode géométrique et méthode par deep learning pour la super-résolution.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** SHI, Wenzhe, CABALLERO, Jose, HUSZÁR, Ferenc, et al. Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network. In : Proceedings of the IEEE conference on computer vision and pattern recognition. 2016. p. 1874-1883 [[https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf PDF]]?&lt;br /&gt;
** Lachaud, J.-O. and Kerautret, B., Geometric Total Variation for image vectorization, zooming and pixel art depixelizing, In : Proceedings of 5th Asian Conference on Pattern Recognition, 2019 [[Fichier:Paper-GTV.pdf]]&lt;br /&gt;
** [[https://github.com/kerautret/GTVimageVect Démos en ligne d&#039;algorithmes de super-résolution]]&lt;br /&gt;
&lt;br /&gt;
=== Autour de la question de la sensibilité des fonctions Booléennes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : On souhaite s’intéresser aux problèmes résolus par des algorithmes qui répondent par Vrai/Faux. Ces problèmes ont des entrées dans {0,1}^n (entrées codées en binaire) et une sortie dans {0,1) (Vrai ou Faux). Il est donc naturel de s’intéresser aux propriétés de ces fonctions Booléennes. Un certain nombre de paramètres intéressants ont été identifiés, comme la complexité du certificat (nombre minimal de bits nécessaires pour connaître la valeur de sortie), le degré (degré d’un polynôme qui correspond à la fonction sur les entrées Booléennes), la sensibilité (lnombre de bits qui, s’ils sont modifiés, impliquent une modification de la sortie), et bien d’autres (taille d’un arbre de décision, complexité en requêtes classiques ou quantiques, taille des coefficients de Fourier,…). En 1992, Nisan et Szegedy ont montré que tous ces paramètres sont reliés entre eux : si on connait l’un d’eux, par exemple le degré, on sait alors que n’importe quel autre de ces paramètres, par exemple la taille de l’arbre de décision, est limité à un certain intervalle de valeurs. Tous, sauf un : la sensibilité. Aucune méthode de preuve semblait impliquer que ce paramètre ne pouvait pas être beaucoup plus petit que les autres. Nisan et Szegedy posèrent alors la question de savoir si la sensibilité d’une fonction Bolléenne était reliée ou non aux autres paramètres classiques.&lt;br /&gt;
* Cet été, en 2019, un chercheur, Hao Huang, a montré dans une preuve de deux pages que la sensibilité ne pouvait pas être significativement plus petite que les autres paramètres, résolvant le problème posé 27 ans auparavant. Cette &amp;quot;sensitivity&amp;quot; conjecture a été attaquée en vain par de nombreux chercheurs renommés. Or, la nouvelle preuve est si simple qu’un chercheur l’a résumé en un [[https://twitter.com/BooleanAnalysis/status/1145837576487612416 tweet]].&lt;br /&gt;
* L&#039;objectif est de comprendre quels sont les paramètres classiques des fonctions Booléennes et des liens entre eux avant de s&#039;intéresser à la preuve de la conjecture. On pourra essayer de construire des fonctions extrémales (ie, avec des paramètres extrémaux dans leur plage de valeurs).&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** Le papier original où la question a été posée : N. Nisan, M. Szegedy. [[https://www.researchgate.net/profile/Mario_Szegedy/publication/2508255_On_the_Degree_of_Boolean_Functions_as_Real_Polynomials/links/09e41514878e7ef890000000.pdf On the degree of Boolean functions as real polynomials.]] Comput. Complexity, 4 (1992), 462–467.&lt;br /&gt;
** Une référence sur l&#039;analyse des fonctions Booléennes : Ryan O’Donnell. [[http://www.cs.tau.ac.il/~amnon/Classes/2016-PRG/Analysis-Of-Boolean-Functions.pdf Analysis of Boolean Functions]], Cambridge University Press, 2014  &lt;br /&gt;
** La preuve de la conjecture : Hao Huang. [[https://arxiv.org/abs/1907.00847 Induced subgraphs of hypercubes and a proof of the Sensitivity Conjecture]]. Annals of Mathematics, 190 (2019), 949-955&lt;br /&gt;
&lt;br /&gt;
=== Structures de données purement fonctionnelles ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;algorithmique est souvent enseignée sur des langages principalement impératifs tels que C. Les structures de données utilisées ne sont pas toujours évidentes à traduire vers les langages fonctionnels tels que OCaml. L&#039;étudiant s&#039;initiera aux structures de données fonctionnelles et aux concepts liés tels que la persistence, en suivant le livre « Purely functional data structures » d&#039;Okasaki.&lt;br /&gt;
* Liens&lt;br /&gt;
** [[https://www.cs.cmu.edu/~rwh/theses/okasaki.pdf La thèse d&#039;Okasaki (PDF)]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires et décidabilité ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Un automate cellulaire est un modèle de calcul discret, utilisé en dans différentes sciences (informatique, mathématiques, physique, biologie, etc;). Le jeu de la vie est l&#039;exemple emblématique d&#039;automate cellulaire. Les règles de calcul d&#039;un automate cellulaire, et de son évolution au cours du temps sont assez simples, mais mènent cependant à des problèmes complexes dont certains indécidables. Par exemple, déterminer si, étant donné des règles, on arrivera forcément, en un nombre fini d&#039;étapes, dans une configuration donné, quelque soit la configuration initiale (problème de nilopotence).&lt;br /&gt;
* L&#039;objectif est de s&#039;intéresser à ces problèmes indécidables dans les automates cellulaires et de produire un mini-cours sur le sujet.&lt;br /&gt;
* Références &lt;br /&gt;
** K. JARKKO, The nilpotency problem of one-dimensional cellular automata, SIAM J. Comput., Vol. 21, No. 3, pp. 571-586, June 1992.&lt;br /&gt;
** K. CULIK II, J. PACHL, S. Yu, On the limit sets ofcellular automata, SIAM J. Comput., 18 (1989), pp.831-842.&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le &amp;lt;b&amp;gt;lundi 27 mai&amp;lt;/b&amp;gt; de 9h à 11h en salle 115 du chablais.&lt;br /&gt;
Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Tristan_Porteries Tristan Porteries (PDF)]: problèmes avec mémoire restreinte, tuteur S. Tavenas&lt;br /&gt;
* R. Wagner: Reconstruction de surfaces à partir de nuages de points, tuteur J.-O. Lachaud&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Nils_Ruet Nils Ruet (PDF)]: LISP, tuteur P. Hyvernat&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Remy_Bouvier Rémy Bouvier (PDF)]: dancing links, tuteur P. Hyvernat&lt;br /&gt;
&lt;br /&gt;
== sujets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les sujets 1-3 sont encadrés par J.-O. Lachaud, les sujets 4-5 par P. Hyvernat, le sujet 6 par S. Tavenas.&lt;br /&gt;
Un encadrant encadre au max 2 étudiants.&lt;br /&gt;
&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;br /&gt;
# Une question naturelle est de savoir quels sont les problèmes qui peuvent être résolus avec un espace mémoire restreint. Plus formellement, on notera L l&#039;ensemble des problèmes que l&#039;on peut résoudre en utilisant seulement un espace mémoire logarithmique. On s&#039;intéresse à cette classe de problèmes, et plus particulièrement aux problèmes de connectivité dans un graphe.&lt;br /&gt;
#* [https://www.irif.fr/~sperifel/complexite.pdf Sylvain Périfel Complexité algorithmique] : Un livre récent qui survole une grosse partie de la complexité algorithmique. Le chapitre 4 concerne la complexité en espace.&lt;br /&gt;
#* [https://omereingold.files.wordpress.com/2014/10/sl.pdf Omer Reingold Undirected Connectivity in Log-Space]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le vendredi 25 mai 2018, à 9h. Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* ray-tracing au path-tracing, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Raphael_Tournafond.pdf Raphael Tournafond (PDF)]&lt;br /&gt;
* &amp;quot;dancing links&amp;quot; et NP complétude, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Ambroise_Decouttere.pdf Ambroise Decouttere (PDF)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
# Du ray-tracing au path-tracing: il s&#039;agit de comprendre l&#039;évolution des algorithmes de rendu (dits &amp;quot;réalistes&amp;quot;) et de mettre en avant les principales évolutions.&lt;br /&gt;
#* An introduction to ray tracing AS Glassner - 1989 - books.google.com&lt;br /&gt;
#* Energy redistribution path tracing, D Cline, J Talbot, P Egbert - ACM Transactions on Graphics (TOG), 2005 - dl.acm.org&lt;br /&gt;
#* et pour une introduction douce au ray-tracing: TP2 de http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO805/Tests/html/index.html&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; et NP complétude : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
#* [https://arxiv.org/pdf/1203.1895.pdf Classic Nintendo Games are (Computationally) Hard] : preuve que Super Mario et d&#039;autres jeux video classiques sont NP-complets &#039;&#039;Theoretical Computer Science, volume 586, 2015, pages 135–160.&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=16167</id>
		<title>VISI401 CMI : bibliographie scientifique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=16167"/>
		<updated>2026-01-07T16:03:38Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* sujets 2025-2026 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable:&lt;br /&gt;
* 2017--2021 : Jacques-Olivier Lachaud&lt;br /&gt;
* 2022-- : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
Ce module amène l&#039;étudiant à effectuer des recherches bibliographiques sur un sujet donné, et à synthétiser ses résultats sous la forme d&#039;un exposé construit.&lt;br /&gt;
&lt;br /&gt;
L&#039;étudiant, à partir d&#039;un sujet et d&#039;un ou plusieurs articles initiaux, doit approfondir le sujet, appréhender son historique, ses évolutions, et son état actuel. &lt;br /&gt;
&lt;br /&gt;
A côté des ressources fournies par les bibliothèques, quelques pointeurs très utiles pour faire des recherches bibliographiques:&lt;br /&gt;
* [https://scholar.google.fr Scholar Google] (libre)&lt;br /&gt;
* [https://researchgate.net ResearchGate] (libre)&lt;br /&gt;
* [https://mathscinet.ams.org/mathscinet/ MashSciNet] (plus math)&lt;br /&gt;
* [https://www.springerlink.com  Springer] (accès via USMB)&lt;br /&gt;
* [https://www.sciencedirect.com Elsevier Sciencedirect] (accès via USMB)&lt;br /&gt;
* SciHub lorsqu&#039;on ne trouve pas&lt;br /&gt;
&lt;br /&gt;
La synthèse bibliographique se fait en interaction avec le tuteur par des visites régulières et/ou des compte-rendus d&#039;avancement par email. La synthèse finale fait l&#039;objet d&#039;un exposé final (15-20 minutes + questions) et d&#039;un document de présentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2025-2026 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Synthèse de texture et transfert de texture par matelassage d&#039;images]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; La synthèse de texture est le procédé qui vise à générer une nouvelle image à partir d&#039;une ou plusieurs (petites) images modèles, en donnant l&#039;impression que cette nouvelle image suit les propriétés structurelles, colorimétriques et statistiques de l&#039;image originelle. C&#039;est très utilisé en synthèse d&#039;image pour générer de grandes textures à partir de petits échantillons. On se propose d&#039;étudier et d&#039;implémenter un algorithme assez simple mais assez efficace appelé &amp;lt;i&amp;gt;image quilting&amp;lt;/i&amp;gt; pour faire de la génération de texture. Il se base sur de simples recherches de sous-images dans l&#039;image original, en superposant au mieux les sous-images. L&#039;algorithme peut même servir à du transfert de textures. Le langage de développement est au choix.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre la méthode d&#039;image quilting, voir le papier d&#039;Efros et Freeman, Siggraph&#039;2001&lt;br /&gt;
* implémenter dans un premier temps la méthode simple qui parcourt l&#039;image en scan-line et recherche la meilleure sous-image avec un overlap choisi.&lt;br /&gt;
* dans un 2e temps, implémenter la méthode de découpe optimale entre 2 sous-images superposées&lt;br /&gt;
* dans un 3e temps, implémenter le transfert de texture&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;References&#039;&#039;&#039;&lt;br /&gt;
* [[http://graphics.cs.cmu.edu/people/efros/research/quilting.html Efros et Freeman, Siggraph&#039;2001]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:imagequilting.gif|200px]]&lt;br /&gt;
&lt;br /&gt;
=== [[le bytecode Python]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; Python est un langage &amp;quot;interprété&amp;quot;. Un programme Python n&#039;est jamais directement transformé en suite d&#039;instructions pour le processeur sur lequel il doit s&#039;exécuter. C&#039;est l&#039;interpréteur qui va, lors de l&#039;exécution, regarder les instructions Python pour les exécuter. Pour éviter que le passage par cet intermédiaire prenne trop de temps, le programme Python est d&#039;abord transformé en un &amp;quot;langage intermédiaire&amp;quot; appelé &amp;quot;bytecode&amp;quot;. Ce langage est une espèce de langage d&#039;assemblage propre à Python. Les instructions sont beaucoup plus simples à exécuter que les instructions &amp;quot;haut niveau&amp;quot; et sont identiques pour tous les processeurs.&lt;br /&gt;
&lt;br /&gt;
L&#039;outils principal pour étudier le bytecode python est le module &amp;lt;tt&amp;gt;dis&amp;lt;/tt&amp;gt; (comme &amp;lt;tt&amp;gt;dis&amp;lt;/tt&amp;gt;assembler) de la version usuelle de Python (CPython).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre la différence entre les langages compilé et interprétés&lt;br /&gt;
* comprendre globalement le mécanisme de transformation d&#039;un programme Python en bytecode&lt;br /&gt;
* étudier le bytecode produit sur des exemples particuliers et pertinents (&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;, concaténation, &amp;lt;tt&amp;gt;append&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== [[Peut-on calculer(efficacement) une transformation de Fourier Rapide sur GPU ]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Mouloud Kessar &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039;&lt;br /&gt;
En traitement du signal, ainsi que pour les simulations numériques, les transformations de Fourier rapides sont extrêmement répandues. L&#039;algorithme de Cooley-Tukey publié en 1965 réduit la complexité du calcul d&#039;une transformée de Fourier discrète à 0(nlog(n)), contre O(n2) pour une implémentation native. Sur CPU, la librairie la plus répandue est FFTW (Fastest Fourier Transform in the West). De nombreuses librairies existent sur GPU pour le calcul des FFT. Malgré tout, pour les simulations numériques en mécanique des fluides, ce sont les transformations de Fourier qui peuvent rendre délicat le portage de codes sur GPU.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* De comprendre les différences de la programmation sur GPU par rapport au CPU.&lt;br /&gt;
* Faire un travail bibliographique pour donner des perspectives d’améliorations dans le cas des FFT.&lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, on essaiera:&lt;br /&gt;
* de Paralléliser un code( c++) déjà existant à l&#039;aide d&#039;OpenMP&lt;br /&gt;
* de porter un code( c++) déjà existant sur GPU à l&#039;aide d&#039;OpenMP GPU&lt;br /&gt;
* de déterminer s&#039;il y a des contextes dans lesquels le code est plus efficace sur GPU ou CPU.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références:&#039;&#039;&#039;&lt;br /&gt;
* La page wikipedia des FFT https://fr.wikipedia.org/wiki/Transformation_de_Fourier_rapide&lt;br /&gt;
* les supports de cours de l&#039;IDRIS  http://www.idris.fr/formations/supports_de_cours.html&lt;br /&gt;
&lt;br /&gt;
== sujets 2024-2025 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes de colorations de graphes]] ===&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; Un [https://fr.wikipedia.org/wiki/Th%C3%A9orie_des_graphes graphe] est un ensemble de sommets et un ensemble d’arêtes sur ces sommets. Une [https://fr.wikipedia.org/wiki/Coloration_de_graphe coloration propre] d&#039;un graphe est une assignation de couleurs à chaque sommet du graphe telle que chaque paire de sommets reliée par une arête a des couleurs différentes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Graph.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Coloration.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Impropre.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Une coloration propre de ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Une coloration impropre du graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Connaître le nombre minimum de couleurs permettant de colorer proprement un graphe est un problème NP-difficile. Cependant, il existe des algorithmes de coloration de graphe permettant de trouver une coloration propre en fonction du nombre de voisins maximums d&#039;un sommet. L&#039;objectif de ce sujet est d&#039;implémenter certains de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter l&#039;algorithme de coloration glouton d&#039;un graphe&lt;br /&gt;
# implémenter l&#039;amélioration de cet algorithme en utilisant la dégénérescence du graphe&lt;br /&gt;
# implémenter l&#039;algorithme issus du théorème de Brooks&lt;br /&gt;
# éventuellement, implémenter un algorithme de coloration d&#039;arêtes&lt;br /&gt;
# éventuellement, implémenter un algorithme de transformation du problème SAT en problème de coloration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de Ukkonen / algorithme SA-IS]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; L&#039;arbre des suffixes est une structure de données qui permet de répondre très rapidement à de nombreuses requêtes du style &amp;quot;est-ce que la chaine &#039;&#039;p&#039;&#039; apparait dans la chaine &#039;&#039;S&#039;&#039; ?&amp;quot; La chaine &#039;&#039;p&#039;&#039; pourrait être une &amp;quot;petite&amp;quot; chaine de quelques milliers de caractères, alors que la chaine &#039;&#039;S&#039;&#039; pourrait être une &amp;quot;grosse&amp;quot; chaine de plusieurs milliard de caractères. Lorsque la chaine &#039;&#039;S&#039;&#039; est fixe, cette recherche se fait en un temps proportionnel à la taille de &#039;&#039;p&#039;&#039;, indépendamment de la taille de &#039;&#039;S&#039;&#039; ! Ce qui rend ceci possible est le précalcul de l&#039;arbre des suffixes de &#039;&#039;S&#039;&#039;, une fois pour toute. Si on fait ce précalcul de manière naïve, il prend un temps proportionnel à la taille de &#039;&#039;S&#039;&#039; &#039;&#039;&#039;au carré&#039;&#039;&#039;. Lorsque &#039;&#039;S&#039;&#039; contient des milliards de caractéres, ceci n&#039;est pas raisonnable.&lt;br /&gt;
&lt;br /&gt;
L&#039;algorithme de Ukkonen permet de calculer l&#039;arbre des suffixes en un temps proportionnel à la taille de &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# comprendre la structure d&#039;arbre des suffixes&lt;br /&gt;
# coder une version naïve du calcul de l&#039;arbre des suffixes&lt;br /&gt;
# comprendre et coder une version de l&#039;algorithme de Ukkonen, et comparer les temps de calcul&lt;br /&gt;
# si le temps le permet, comprendre l&#039;algorithme SA-IS qui permet de construite le tableau des suffixes en un temps proportionnel à la taille de &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# les [https://www.youtube.com/playlist?list=PL2mpR0RYFQsDFNyRsTNcWkFTHTkxWREeb vidéos de Ben Langmead] sur les arbres de suffixes (vidéos 1 -- 9)&lt;br /&gt;
# description de l&#039;algoritme de Ukkonen dans Dan Gusfield, &#039;&#039;Algorithms on Strings, Trees and Sequences&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Approximations d&#039;Euler et Runge-Kutta pour la modélisation du problème à 3 corps===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
en astronomie, la modélisation du problème à N corp est un enjeu majeur. Il est indispensable pour l&#039;exploration spatiale, notamment pour l&#039;envoie de sonde sur Mars, ou&lt;br /&gt;
Titan (Lune de Jupiter).&lt;br /&gt;
&lt;br /&gt;
Les équations décrivant le problème à N corps existent depuis de nombreuses années, mais les mathématiciens et les physiciens ne savent pas les résoudre analytiquement.&lt;br /&gt;
&lt;br /&gt;
Des codes de calcul existent pour réaliser des simulations du système solaire.&lt;br /&gt;
&lt;br /&gt;
D&#039;un point de vue algorithmique, le point clef se situe dans l&#039;approximation choisie pour les dérivées en temps.&lt;br /&gt;
&lt;br /&gt;
Une approximation à l&#039;aide d&#039;une méthode type Euler ou Runge-Kutta va avoir un ordre de précision prédéfini.&lt;br /&gt;
&lt;br /&gt;
Toutes ces approximations ne se valent pas, et une analyse rigoureuse de la fiabilité de ces méthodes est nécessaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; il n&#039;est pas nécessaire de connaître les méthodes numériques au préalables car elles seront introduites et développées dans un cadre simple au fur et à mesure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre le fonctionnement de l&#039;approximation d&#039;une dérivée par une méthode numérique (type Euler et Runge-Kutta d&#039;ordre 2)&lt;br /&gt;
* Développer  un programme permettant de  prédire les mouvements des corps suivants: Jupiter, La Terre, et Le Soleil&lt;br /&gt;
* Mesurer l&#039;ordre de précision des deux méthodes numériques implémentées, et comparer à l&#039;ordre théorique.&lt;br /&gt;
* Si le temps le permet:&lt;br /&gt;
** Ajouter les schémas  Runge-Kutta 4 et 6&lt;br /&gt;
** modifier le code pour inclure Mars, Venus et Mercure&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
# La formulation générale du problème à N-corp est donnée ici: https://en.wikipedia.org/wiki/N-body_problem&lt;br /&gt;
# Ce type d&#039;étude peut devenir autrement plus complexe que la version présentée ici. Dans le film &amp;quot;The Martian&amp;quot; , un astronaute est piégé sur Mars, et son équipe qui était en route pour la terre doit venir le récupérer. Le centre de calcul &amp;quot;Pléiades&amp;quot; de la NASA est présenté, et utilisé pour déterminer s&#039;il est possible de renvoyer le vaisseau spatial récupérer l&#039;astronaute, notamment à l&#039;aide d&#039;une fronde gravitationnelle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Programmation graphique sur GPU]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé et objectifs :&#039;&#039;&#039; les cartes graphiques modernes permettent l&#039;affichage de millions de polygones avec des rendus presque réalistes en temps réel.&lt;br /&gt;
L&#039;objectif de ce sujet est de découvrir la modélisation 3D, puis les programmations spécifiques des vertex et fragment shaders pour réaliser certains types d&#039;effet (camera,&lt;br /&gt;
transformations géométriques, illumination, textures, halos, stylisations, incrustations).&lt;br /&gt;
Le pipeline OpenGL sera étudié, et accédé via WebGL/javascript/three.js. Dans une 2eme partie, certains shaders de shadertoy.com seront étudiés plus en détails, afin de&lt;br /&gt;
comprendre les nombreuses astuces utilisées par les experts du domaine pour faire des effets impressionnants en temps réel.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque :&#039;&#039;&#039; sujet discuté avec Vetea Stoll&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Magic Numbers et Jeux Vidéo]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé et objectifs :&#039;&#039;&#039; les magic numbers sont souvent considérés comme une mauvaise pratique en&lt;br /&gt;
programmation. Cependant, l&#039;algorithme emblématique de la racine carrée inverse rapide,&lt;br /&gt;
utilisé dans les moteurs de jeux vidéo comme Quake III Arena, justifie&lt;br /&gt;
l&#039;utilisation du fameux 0x5f3759df.&lt;br /&gt;
Ce sujet propose d&#039;étudier cet algorithme, ainsi que des sujets connexes.&lt;br /&gt;
&lt;br /&gt;
Travail à réaliser :&lt;br /&gt;
* Expliquer le fonctionnement détaillé de l&#039;algorithme.&lt;br /&gt;
* Comparer avec la méthode de Newton-Raphson&lt;br /&gt;
* Expliquer les applications pratiques&lt;br /&gt;
* Comparer les performances en temps d&#039;exécution et en mémoire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Indexation dans les Bases de Données]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sujet :&#039;&#039;&#039; en bases de données, les index sont essentiels pour accélérer les requêtes,&lt;br /&gt;
mais ils impliquent des compromis entre performance, espace et coût de&lt;br /&gt;
maintenance.&lt;br /&gt;
Dans ce sujet, vous étudierez les types d&#039;index (B-tree, Hash, etc.), leur&lt;br /&gt;
impact sur les requêtes et les modifications (``INSERT``, ``UPDATE``, ``DELETE``).&lt;br /&gt;
&lt;br /&gt;
Travail à réaliser :&lt;br /&gt;
* Expliquer les structures d’index (B-tree, Hash).&lt;br /&gt;
* Expliquer les différents cas d&#039;usage&lt;br /&gt;
* Expliquer l’impact des index sur les performances des requêtes (``SELECT WHERE``).&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ressource pour commencer :&#039;&#039;&#039;&lt;br /&gt;
# &amp;quot;Bases de données : concepts, utilisation et développement&amp;quot;, Jean-Luc Hainaut, chapitre 4 (disponible à la BU)&lt;br /&gt;
&lt;br /&gt;
== sujets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Génération de labyrinthes &amp;quot;organiques&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; la génération de labyrinthes est un problème classique, notamment abordé dans les cours d&#039;algorithmes de graphes. Ces méthodes permettent de générer des labyrinthes sur des &#039;&#039;grilles&#039;&#039;, typiquement carrées :&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze_grid.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
La création de labyrinthe &amp;quot;organiques&amp;quot;, du style&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
utilise une méthode très différente. Les détails sont décrits dans un article publié en  2006: http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf. La description peut sembler très abstraite, mais l&#039;idée initiale est assez simple : une courbe initiale est, petit à petit, déformée aléatoirement.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; comprendre la méthode de base, et l&#039;implémenter pour générer des labyrinthes organiques. La première version pourra être codée en Python, mais comme la méthode nécessite une &#039;&#039;grosse&#039;&#039; quantité de calculs, il pourra être intéressant de coder une seconde version en utilisant un langage compilé si l&#039;on souhaite obtenir de &amp;quot;gros&amp;quot; labyrinthes. De nombreuses améliorations sont décrites dans l&#039;article de H. Pedersen et K. Singh, et il serait intéressant de d&#039;en implémenter certaines, soient en Python (en les testant sur de petits labyrinthes) soit dans un autre langage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039; Hans Pedersen et Karan Singh, &#039;&#039;Organic Labyrinths and Mazes&#039;&#039;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== Tramage artistique d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le tramage d&#039;une image (en anglais *dithering* ou *half-toning*) consiste à esquisser une image en niveaux de gris ou en couleur à l&#039;aide de très peu d&#039;encres ou couleurs différentes. Historiquement, l&#039;utilisation la plus courante est en impression: un fax ne dispose que d&#039;une encre noire (donc 2 couleurs noir et blanc pour transférer une image), les imprimantes n&#039;ont que 4 encres (et donc cinq couleurs jaune, cyan, magenta, noir et le blanc du papier). Les premiers ordinateurs avaient des écrans avec très peu de couleurs, donc les photos étaient approchées avec 8 ou 16 couleurs. &lt;br /&gt;
&lt;br /&gt;
En informatique, les algorithmes de tramage par diffusion d&#039;erreur [https://fr.wikipedia.org/wiki/Algorithme_de_Floyd-Steinberg#:~:text=L%27algorithme%20de%20Floyd%2DSteinberg,un%20pixel%20à%20ses%20voisins. Floyd-Steinberg] sont faciles à implémenter et rapide, donc très utilisés.&lt;br /&gt;
&lt;br /&gt;
Néanmoins, il existe des algorithmes qui donnent des résultats beaucoup plus jolis, notamment celui proposé par Ostromoukhov et Hersch (1999). Nous proposons de l&#039;étudier et de l&#039;implémenter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-david.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-photo.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Floyd-Steinberg&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Ostromoukhov-Hersch&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre les principes du tramage, éventuellement coder en python/opencv l&#039;algorithme basique. Comprendre ensuite l&#039;algorithme d&#039;Ostromoukhov et Hersch (1999), et l&#039;implémenter en python, d&#039;abord en noir et blanc, et si le temps le permet, en couleur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://dl.acm.org/doi/pdf/10.1145/311535.311605 Ostromoukhov et Hersch, Multi-Color and Artistic Dithering, ACM SIGGRAPH 1999]&lt;br /&gt;
* [https://opencv.org OpenCV], pratique pour lire une image, l&#039;afficher, faire des traitements.&lt;br /&gt;
&lt;br /&gt;
=== Rendu réaliste de scènes 3D par lancer de rayons ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note : &#039;&#039;&#039; Sujet demandé par Lukas Rey.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le rendu réaliste de scène 3D a été (et reste) un des objectifs majeurs de l&#039;informatique graphique, notamment grâce à ses nombreuses applications dans différents domaines : le cinéma (effets spéciaux), mais aussi le marketing, la publicité, l&#039;architecture, ou l&#039;art. L&#039;algorithme le plus utilisé est appelé &amp;quot;lancer de rayons&amp;quot;, avec un objectif de simuler le trajet des rayons lumineux dans une scène 3D afin de déterminer les couleurs perçues par un observateur. Plutôt que de calculer tous les rayons lumineux d&#039;une scène, cet algorithme calcule seulement le trajet inverse des rayons lumineux qui arrivent dans l&#039;oeil de l&#039;observateur, ce qui est beaucoup plus économique. On verra que cet algorithme permet de simuler des matériaux réfléchissants ou (semi-)transparents, de calculer des ombres portées, de simuler du brouillard...&lt;br /&gt;
&lt;br /&gt;
[[file:ray-tracing.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Il s&#039;agit de comprendre d&#039;où vient la couleur perçue d&#039;un objet, d&#039;implémenter l&#039;algorithme récursif classique du lancé de rayons, au moins avec des objets simples (sphères, tétraèdres), et de voir comment optimiser les calculs (car ça devient vite coûteux). On pourra s&#039;appuyer sur ce [https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html TP] pour l&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://en.wikipedia.org/wiki/Ray_tracing_(graphics)&lt;br /&gt;
* https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html&lt;br /&gt;
&lt;br /&gt;
=== Rendu temps réel avec OpenGL ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Colin Weill-Duflos&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; On cherche à utiliser une API graphique (OpenGL) afin de faire du rendu de scène 3d en utilisant la carte graphique. Cela permet d&#039;utiliser les techniques de rendu 3d en temps réel (rastérisation) et de les faire effectivement fonctionner en temps réel, permettant d&#039;afficher une scène avec laquelle on peut intéragir : en déplaçant la caméré, en bougeant des éléments...&lt;br /&gt;
Ces techniques ont déjà été utilisée dans des années précédentes, sans utiliser la carte graphique (le résultat était assez lent). Grâce à OpenGL, la plupart de ces opérations peuvent s&#039;effectuer sur la carte graphique, ce qui permet de ne pas avoir à en recoder une partie (grâce à des composants capables de faire uniquement ces opérations) et d&#039;être plus rapide.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre les techniques de raterisation&lt;br /&gt;
* comprendre la pipeline OpenGL&lt;br /&gt;
* implémenter une scène avec un objet et une caméra controlable&lt;br /&gt;
* rajouter des shaders pour simuler la lumière (Phong shading), variantes stylisées (Toon shading)&lt;br /&gt;
* rajouter des textures sur la scène&lt;br /&gt;
* faire des shadow maps pour les ombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [Travaux précédents](http://os-vps418.infomaniak.ch:1250/mediawiki/images/0/0d/Gossin-2023.pdf)&lt;br /&gt;
* [Pipeline OpenGL](https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview)&lt;br /&gt;
* [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
* [Toon shading](https://fr.wikipedia.org/wiki/Ombrage_de_cellulo%C3%AFd)&lt;br /&gt;
* [Shadow maps](https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping)&lt;br /&gt;
&lt;br /&gt;
=== Problèmes indécidables ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Quand on a un calcul à faire, on peut se demander de la meilleure implémentation pour faire faire ce calcul par un ordinateur. On pense généralement moins à la question - pourtant primordiale - de savoir si ce calcul peut être effectué par l’ordinateur. Pourtant, on sait depuis l’origine de l’informatique qu’il existe des fonctions que l’on ne peut pas calculer à l’aide d’un ordinateur.  On cherchera à comprendre ce que serait un programme qui résoudrait le problème de l’arrêt et pourquoi, il ne marchera pas. On pourra se demander alors s’il y a un lien entre les différents problèmes non-calculables : avec une librairie qui résout le problème de l’arrêt, peut-on écrire un problème qui résout le problème de correspondance de Post ? Peut-on imaginer un problème qu’on ne pourrait pas résoudre même si on avait une fonction qui résolvait le problème de l’arrêt ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de fonction calculable (et donc de fonction non-calculable). Donner des exemples. &amp;quot;Coder&amp;quot; l’argument diagonal de la non-calculabilité de l’arrêt. Coder une réduction entre deux problèmes non-calculables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Th%C3%A9orie_de_la_calculabilit%C3%A9 Wikipédia - Théorie de la calculabilité]&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_l%27arr%C3%AAt Wikipédia - Problème de l&#039;arrêt]&lt;br /&gt;
* [https://ludovicpatey.com/courses/comp-thy-2023/cr11-fr.pdf Livre récent en français sur la théorie de la calculabilité]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Réseaux de neurones et apprentissage ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; sujet demandé par Elliot Moiroud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
# se familiariser avec les concepts utilisés en apprentissage,&lt;br /&gt;
# essayer d&#039;implémenter une version ultra simple de la procédure d&#039;apprentissage,&lt;br /&gt;
# utiliser une bibliothèque existante sur quelques exemples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
# http://neuralnetworksanddeeplearning.com/&lt;br /&gt;
&lt;br /&gt;
=== Synchronisation dans les Systèmes Distribués ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; l&#039;algorithme de Lamport joue un rôle crucial dans la synchronisation des horloges dans un réseau de machines qui ne sont pas nécessairement précises ou synchronisées entre elles. Il permet de créer un consensus sur l&#039;ordre des événements dans un système distribué, où la communication peut être retardée ou désordonnée. Cette capacité est fondamentale pour assurer la cohérence et la fiabilité des opérations dans des environnements distribués, tels que les bases de données distribuées, les systèmes de fichiers en réseau et les applications de blockchain. Après avoir maîtrisé l&#039;algorithme de Lamport, l&#039;étudiant pourra les fautes byzantines pour comprendre comment les systèmes distribués gèrent les informations contradictoires ou erronées transmises par différents nœuds du réseau.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Analyser et comprendre l&#039;algorithme de Lamport pour la synchronisation des horloges.&lt;br /&gt;
# (Examiner les fautes byzantines et leur influence sur la stabilité des systèmes distribués.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Time, Clocks, and the Ordering of Events in a Distributed System.&lt;br /&gt;
https://lamport.azurewebsites.net/pubs/time-clocks.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation dynamique et complexité ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; La programmation dynamique est sans doute une des techniques de programmation qui porte le plus mal son nom.  Elle s&#039;applique lorsqu&#039;un problème peut se décomposer en sous-problèmes, dont les solutions peuvent être combinées. Dans le cas relativement simples où les sous-problèmes sont toujours disjoint, on utilise une approche de type &amp;quot;diviser pour rêgner&amp;quot;. Lorsque ce n&#039;est pas le cas, il faut faire attention à ne pas dupliquer les calculs. Les deux approches habituelles sont :&lt;br /&gt;
# la &amp;quot;mémoization&amp;quot;, qui consiste à sauvegarder toutes les solutions trouvées pour éviter de les recalculer,&lt;br /&gt;
# la &amp;quot;programmation dynamique&amp;quot; qui consiste à faire les solutions dans le &amp;quot;bon ordre&amp;quot; afin de ne jamais avoir besoin d&#039;une solution qui n&#039;aurait pas été calculée.&lt;br /&gt;
&lt;br /&gt;
Ces techniques permettent en général d&#039;obtenir un algorithme beaucoup plus rapide que la version naïve.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# étudier les méthodes de &amp;quot;mémoization&amp;quot; et &amp;quot;programmation dynamique&amp;quot; sur plusieurs exemples et les comparer&lt;br /&gt;
# mettre en évidence les complexités &amp;quot;pratiques&amp;quot; de ces algorithmes au moyen de benchmarks pertinents&lt;br /&gt;
# comprendre les calculs &amp;quot;théoriques&amp;quot; de la complexité de ces algorithmes pour vérifier que les prédictions correspondent à la pratique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;Introduction à l&#039;algorithmique&amp;quot;, T. Cormen, C. Leiserson, R. Rivest, C. Stein&lt;br /&gt;
# la page wikipedia française : https://fr.wikipedia.org/wiki/Programmation_dynamique&lt;br /&gt;
&lt;br /&gt;
== sujets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
=== algorithmes de recherche de chaines ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : rechercher si une chaine &#039;&#039;s1&#039;&#039; apparait à l&#039;intérieur d&#039;une chaine &#039;&#039;s2&#039;&#039; est assez simple, mais l&#039;algorithme naïf n&#039;est pas très rapide. L&#039;objectif de ce sujet est de s&#039;intéresser à certains algorithmes de recherche de sous-chaines plus efficaces. Le plus simple est probablement l&#039;algorithme KMP (du noms de ses inventeurs : Knuth, Morris et Pratt) qui évite des comparaisons inutiles de l&#039;algorithme naïf. L&#039;algorithme de Boyer-Moore utilise des idées similaires mais considère la sous-chaine (&#039;&#039;s1&#039;&#039;) à l&#039;envers, ce qui lui permet d&#039;aller en général plus vite. Ces algorithmes restent assez lents lorsque la chaine &#039;&#039;s2&#039;&#039; est très grande. C&#039;est par exemple le cas en bio-informatique lorsque l&#039;on doit rechercher des chaines dans le génome. Dans ce cas, la chaine &#039;&#039;s2&#039;&#039; est fixe et on rercherche de nombreuses sous-chaines &#039;&#039;s1&#039;&#039;. Il est alors possible de faire un &#039;&#039;pré-traitement&#039;&#039; pour faire une recherche beaucoup plus rapide qui ne dépend pas de la taille de &#039;&#039;s2&#039;&#039; !&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de quelques uns de ces algorithmes&lt;br /&gt;
*# les implémenter (par exemple en Python)&lt;br /&gt;
*# essayer de les comparer&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
# https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm&lt;br /&gt;
# transformé de Burrows-Wheeler et recherche de sous-chaines https://www.youtube.com/watch?v=P3ORBMon8aw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== génération de labyrinthes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : il existe de nombreuses méthodes algorithmiques pour générer des labyrinthes aléatoires. La plupart de ces méthodes sont expliquées sur des grilles carrées mais il est possible de les implémenter sur d&#039;autres types de grilles. Il est possible des les adapter par exemple pour générer des labyrinthes circulaires, cylindriques, ou sphériques ; ou bien des labyrinthes en plusieurs parties (de grandes pièces contenant des labyrinthes, reliées par des couloirs formant un autre labyrinthe).&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de plusieurs algorithmes de génération de labyrinthes&lt;br /&gt;
*# les étendres à des grilles plus intéressantes&lt;br /&gt;
*# &#039;&#039;expérimenter et chercher des manières simples de générer un labyrinthe &amp;quot;continu&amp;quot;&#039;&#039; (La solution décrite dans &amp;quot;How to Generate Perfect Mazes?&amp;quot; est probablement un peu trop complexe.)&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** le livre &amp;quot;Mazes for programmers&amp;quot;, https://pragprog.com/titles/jbmaze/mazes-for-programmers/&lt;br /&gt;
** l&#039;article &amp;quot;How to Generate Perfect Mazes?&amp;quot;, https://hal.uca.fr/hal-03174952/file/article-journal-2020.pdf&lt;br /&gt;
** l&#039;article &amp;quot;Organic Labyrinths and Mazes&amp;quot;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== L’infâme GOTO ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : L’instruction goto n’a aujourd’hui plus la côte parmi les informaticiens, et est souvent considérée comme une instruction à bannir. L&#039;idée est d&#039;explorer ce que permet cette instruction, et comment a évolué son utilisation.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# remplacer des structures de contrôles simples simples par des goto&lt;br /&gt;
*# faire un programme plus complexe utilisant un maximum de goto&lt;br /&gt;
*# expliquer l&#039;évolution de l&#039;utilisation du goto&lt;br /&gt;
*# avantages/inconvénients de son utilisation&lt;br /&gt;
*# comparaison des langages prenant en charge ou non cette instruction et pourquoi&lt;br /&gt;
*# utilisation actuelle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Blockchains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : les blockchains sont de plus en plus populaires, utilisées initialement pour les cryptomonnaies, elles peuvent être utilisées pour stocker des données, gérer les contrats intelligents, etc.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre le fonctionnement des blockchains (par exemple avec l&#039;article de Satoshi Nakamoto)&lt;br /&gt;
*# implémenter une blockchaine&lt;br /&gt;
*# ...&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de reconstruction de surfaces à partir d&#039;images 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les images 3D sont devenues courantes avec les outils d&#039;acquisition comme les scanners X ou les scanners IRM. On peut aussi modéliser des objets 3D sous forme de volumes, pour ensuite en extraire des surfaces (e.g. modélisation de fluides, de feu ou de fumées). Un enjeu est de pouvoir construire des surfaces qui représentent le bord d&#039;objets d&#039;intérêt dans ces données volumiques. Les algorithmes les plus classiques reconstruisent une surface composée de triangles qui approchent un niveau de gris donné dans le volume 3D :  c&#039;est une iso-surface, comparable à une courbe d&#039;iso-altitude dans une carte topographique, mais en 3D ! On  s&#039;intéreressera à deux algorithmes particulièrement : le marching-tetrahedra et le marching-cubes.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre ce qu&#039;est une iso-surface dans une image 3D ou dans une fonction implicite.&lt;br /&gt;
*# Comprendre les points communs et différences des algorithmes Marching Tetrahedra et Marching Cubes&lt;br /&gt;
*# Implémenter un des deux algorithmes. On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python. &lt;br /&gt;
*# On lira des fichiers .vol pour les images 3D, qui vous seront fournies.&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_tetrahedra Marching Tetrahedra sur wikipedia]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_cubes Marching Cubes sur wikipedia]&lt;br /&gt;
** [https://dl.acm.org/doi/pdf/10.1145/37402.37422 Lorensen, Cline, Marching cubes: a high resolutions 3D surface construction algorithm, Computer Graphics, 21(4), 1987]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-slices.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-isosurface.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Coupes dans une image 3D &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Isosurface dans cette image &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Invitation à la complexité algorithmique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
* Résumé : on abordera le thème de la complexité algorithmique : étant donné un programme implémentant une fonction, peut-on borner son temps de calcul en fonction de la taille de ses entrées. On procédera par l&#039;exemple, en tentant de confirmer la théorie par des expériences concrets de petits programmes (par exemple en Python). Comme point d&#039;entrée, on pourra par exemple examiner les différences de complexité entre quelques algorithmes de tri.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre l&#039;intérêt de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;,&lt;br /&gt;
*# se familiariser avec les notions et notations utilisées pour décrire la complexité en temps de calcul (ou en mémoire) des algorithmes,&lt;br /&gt;
*# apprendre à vers de &amp;quot;benchmarks&amp;quot; pour évaluer l&#039;efficacité réelle d&#039;une fonction dans un langage de programmation,&lt;br /&gt;
*# comprendre les limites de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== sujets 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
===Rust et la notion d&#039;appartenance (&amp;quot;ownership&amp;quot;)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Théo Connetable : [[Fichier:VISI401-2022-Connetable.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : dans la plupart des langages &amp;quot;haut niveau&amp;quot; (Python, Java, Javascript, ...), la mémoire est gérée automatiquement. Par exemple, Python détecte qu&#039;une liste ne sert plus à rien pour libérer la mémoire qu&#039;elle occupait. Dans les langages &amp;quot;bas niveau&amp;quot; (C), c&#039;est au programmeur de libérer explicitement la mémoire qu&#039;il utilise. (S&#039;il ne le fait pas, son programme risque d&#039;avoir des &amp;quot;fuites de mémoire&amp;quot;.) Rust est un nouveau (première version en 2010) langage de programmation. Un des objectifs de Rust est d&#039;offrir des garanties de sécurité sur la mémoire avec la notion d&#039;appartenance. Ces garanties sont testées à la compilation et ne dégradent donc pas l&#039;efficacité du programme final.&lt;br /&gt;
* Objectifs : l&#039;objectif, après s&#039;être familiarisé avec le langage Rust, est de comprendre à quoi correspond la notion de &amp;quot;ownership&amp;quot; (&amp;quot;appartenance&amp;quot;) et de l&#039;illustrer sur quelques exemples. Si l&#039;étudiant ne les connait pas, les notions de pointeurs (en C), d&#039;allocation sur la pile, sur le tas, et le concept de &amp;quot;ramasse miettes&amp;quot; (garbage collector&amp;quot; en anglais) seront des étapes préliminaires importantes.&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# The Rust Programming Language https://doc.rust-lang.org/book/title-page.html, avec en particulier la section 4, &amp;quot;Understanding Ownership&amp;quot;&lt;br /&gt;
*# Safe Systems Programming in Rust https://cacm.acm.org/magazines/2021/4/251364-safe-systems-programming-in-rust/fulltext&lt;br /&gt;
*# Rust Ownership by Example https://depth-first.com/articles/2020/01/27/rust-ownership-by-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Bitcoin &amp;amp; blockchain===&lt;br /&gt;
* Présentation : Baptiste Griva [[Fichier:VISI401-2022-Griva.pdf]]&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Les blockchain sont de plus en plus populaires. Avec l&#039;article de Satoshi Nakamoto, l&#039;étudiant devra comprendre son fonctionnement. On pourra dans un second temps s&#039;intéresser aux attaques habituelles face à une blockchain.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre le fonctionnement de la blockchain bitcoin&lt;br /&gt;
*# S&#039;intéresser à ses vulnérabilités (51% attack,...)&lt;br /&gt;
* Références: pour commencer https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
===Débruitage d&#039;image===&lt;br /&gt;
* Présentation : Lucas Policastro [[Fichier:VISI401-2022-Policastro.pdf]]&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La plupart des procédés d&#039;acquisition d&#039;image (typiquement capteurs CCD ou CMOS des caméras ou téléphones) ne sont pas parfaits et introduisent du bruit (des perturbations) dans les images résultantes. Ce bruit ressemble en général à une perturbation aléatoire locale par capteur, indépendante de ce  qui se passe sur un capteur proche. Peut-on alors améliorer la qualité visuelle d&#039;une photo dégradée par un tel bruit (typiquement gaussien) ? On regardera notamment les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
*# On pourra s&#039;appuyer sur les démos IPOL en ligne de ces algorithmes et leur description. http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
*# L&#039;algorithme des moyennes non locales est implémentable relativement facilement (même en numpy).&lt;br /&gt;
* Références:&lt;br /&gt;
** http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
** Le site https://www.ipol.im contient plein d&#039;algos de restauration d&#039;image (suivre Enhancement &amp;amp; Restoration, puis Denoising).&lt;br /&gt;
&lt;br /&gt;
===Sécurité des cartes RFID : le cas Mifare===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Paul Aubry [[Fichier:VISI401-2022-Aubry.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : les cartes RFID (Radio Frequency IDentification) sont des cartes à puce qui peuvent communiquer avec un lecteur distant (mais proche). De nombreuses cartes de transport en commun ou d&#039;ouverture de portes utilisent cette technologie. La carte Mifare classic, très répandue, utilise un protocole cryptographique pour éviter les &amp;quot;replay attacks&amp;quot; (enregistrer un échange pour le réutiliser) et le clonage de la carte. Le détails du protocole est longtemps resté un secret industriel, mais ceci n&#039;a pas empéché la découverte de *grosses* failles. Il est maintenant possible de cloner une carte Mifare en quelques secondes avec du matériel grand public.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre fonctionne la protection contre les &amp;quot;replay attacks&amp;quot; à partir de challenges cryptographiques&lt;br /&gt;
*# comprendre le protocole Mifare classic&lt;br /&gt;
*# comprendre les attaques sur le protocole&lt;br /&gt;
*# expérimenter avec des puces RFID existante *(facultatif)*&lt;br /&gt;
*# regarder les évolutions du protocole pour se protéger de ces attaques&lt;br /&gt;
* Référence : F. D. Garcia, P. van Rossum, R. Verdult, R. Wichers Schreur : &amp;quot;Wirelessly Pickpocketing a Mifare Classic Card&amp;quot; https://www.cs.ru.nl/~flaviog/publications/Pickpocketing.Mifare.pdf&lt;br /&gt;
&lt;br /&gt;
===Ingénierie Dirigée par les Modèles (IDM)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Alexandre Desbos [[Fichier:VISI-401-2022-Desbos.pdf]]&lt;br /&gt;
* Tuteur : Philippe Pernelle&lt;br /&gt;
* Résumé : l&#039;ingénierie dirigée par les modèles (ou MDE Model Driven Engineering) est une approche de conception basée sur la transformation de modèle sur des niveaux d&#039;abstraction différents (modèle, méta-modèle, méta-méta-modèle ...). l&#039;OMG propose une approche MDE basée sur 3 niveaux  d&#039;abstraction (CIM,PIM, PSM)  permettant de bâtir une application  en partant du niveaux d&#039;abstraction le plus haut (CIM) et en procédant par transformation / raffinement pour arriver au PSM puis à la génération de code. Il existe par ailleurs différents langages  (ATL, OCL) qui vont faciliter la transformation de modèle. A noter que la fondation Eclipse propose un environnement spécifique pour manipuler des modèles avec des implémentations d&#039;ATL et d&#039;OCL&lt;br /&gt;
* Objectifs :  L&#039;objectif est d&#039;étudier ces mécanismes de transformation / raffinement par l&#039;implémentation d&#039;un cas d&#039;étude dans eclipse en utilisant les langages ATL et OCL. Après une étude bibliographique des principes de MDA, l&#039;idée est de mettre en oeuvre dans Eclipse des extrait des modèles CIM, PIM et PSM proposés par les articles ci-dessous puis d&#039;essayer de construire des OCL et des scripts ATL afin de faciliter la transformation (sans aller jusqu&#039;à la génération de code)&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# These : https://hal.archives-ouvertes.fr/tel-01247610 (uniquement les pages 35 à 47)&lt;br /&gt;
*# Models and Mechanisms for implementing playful scenarios https://hal.archives-ouvertes.fr/hal-01372311&lt;br /&gt;
*# Digital Twin and Ecological Transition Integration in Training Process https://hal.archives-ouvertes.fr/hal-03375508&lt;br /&gt;
*# Eclipse Modeling Tools https://www.eclipse.org/downloads/packages/release/2021-12/r/eclipse-modeling-tools&lt;br /&gt;
&lt;br /&gt;
===[[Couvrir un polygone rectilinéaire avec des rectangles]]===&lt;br /&gt;
* Présentation : Maxent Bernier [[Fichier:VISI401-2022-Bernier.pdf]]&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Un polygone est dit rectilinéaire si les seuls angles qui apparaissent sont des angles droits. On considérera des polygones simples (i.e., sans trous et qui ne s&#039;auto-intersectent pas). Un tel polygone peut donc être recouvert par des carrés ou par des rectangles. On cherchera à écrire un algorithme qui trouve une couverture minimale (i.e., avec le moins de carrés/rectangles possibles). Dans le cas des carrés, on va pouvoir trouver un algorithme efficace pour ce problème. Malheureusement, le cas de la couverture minimale par les rectangles est NP-complète. &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme de recouvrement par des carrés&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet et le lien avec la couverture par les rectangles&lt;br /&gt;
*# Contourner la difficulté de la NP-complétude (heuristique ou cas des polygones orthogonalement convexes)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polygon_covering#cite_note-cr88-4  Couvertures de polygones (Wikipedia)]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/NP-completeness NP-complétude (Wikipedia)]]&lt;br /&gt;
** [[http://webdocs.cs.ualberta.ca/~joe/Preprints/Cover/paper.ps La couverture par rectangles est NP-complète]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires ===&lt;br /&gt;
&lt;br /&gt;
*Présentation : Emilien Boitouzet [[Fichier:VISI401-2022-Boitouzet.pdf]]&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
[[Fichier:automate_1.png]] [[Fichier:automate_2.jpeg]]&lt;br /&gt;
* Sujet : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser des calculs. Cependant les réalisations pratiques manquent, ce sujet se propose d’étudier l’utilisation des automates cellulaires dans les domaines suivant par exemple :&lt;br /&gt;
*# Modélisation des systèmes complexes (propagation des feux de forêt, processus de percolation, écoulement du sable ...)&lt;br /&gt;
*# Modélisation du comportement d&#039;un gaz&lt;br /&gt;
*# Système dynamique discret alternatif au modèle physique des équations aux dérivées partielles&lt;br /&gt;
*# Modélisation de la croissance de tissus cellulaires en biologie&lt;br /&gt;
*# Simulation de la croissance des cristaux&lt;br /&gt;
*# Correction automatique d’erreurs en imagerie&lt;br /&gt;
* Référence: https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
&lt;br /&gt;
=== Programmation bare-metal ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Andrien Montmayeur [[Fichier:VISI401-2022-Montmayeur.pdf]]&lt;br /&gt;
* Tuteur : Colin Weill-Duflos&lt;br /&gt;
* Sujet : l&#039;execution d&#039;un programme compilé peut parfois paraître un peu magique: on ne comprend pas forcément tout ce que fait le compilateur, et le système d&#039;exploitation fournit des abstractions bien pratiques. Comment se débrouille-t-on dans un contexte où il n&#039;y a pas de système d&#039;exploitation, comme certaines applications embarquées ou bien le système d&#039;exploitation lui-même?&lt;br /&gt;
* Objectifs : comprendre en détails la chaîne de compilation du C, l&#039;architecture d&#039;un executable et comment ce dernier est executé par une machine pour parvenir à faire executer un programme directement par un microprocesseur arm et interagir avec des périphériques simples.&lt;br /&gt;
* Référence:&lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Executable_and_Linkable_Format Architecture d&#039;un executable]&lt;br /&gt;
*#[https://aticleworld.com/c-compilation-process/ les étapes de compilation du C] (regarder notamment le linkage)&lt;br /&gt;
*# [https://azeria-labs.com/arm-data-types-and-registers-part-2/ débuter avec l&#039;assembleur arm]&lt;br /&gt;
&lt;br /&gt;
===GeoGebra et algèbre géométrique ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Nolann Sanmarti [[Fichier:VISI401-2022-Sanmarti.pdf]]&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Sujet : l&#039;algèbre géométrique émerge récemment comme un outil prometteur pour la synthèse d&#039;images : avec des points de contrôle, un produit, il est possible de représenter et de manipuler de manière efficace un ensemble d&#039;objets géométriques. Récemment, des bibliothèques c++ ont été développées. Ces bibliothèques autorisent une utilisation générique de l&#039;algèbre géométrique mais sont encore limitées par le manque d&#039;outils intéractifs adaptés. Par ailleurs, le logiciel de visualisation GeoGebra est un outil particulièrement utile pour la visualisation et la résolution de problèmes géométriques. Le but de ce projet serait de travailler un binding entre l&#039;algèbre géométrique et GeoGebra.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# se familiariser avec l&#039;algèbre géométrique, et l&#039;applet Javascript de GeoGebra,&lt;br /&gt;
*# identifier les objets et les opérations géométriques intéressantes à visualiser avec l&#039;algèbre géométrique,&lt;br /&gt;
*# implantations d&#039;une méthode générique permettant de générer des scripts dans l&#039;applet Javascript de GeoGebra.&lt;br /&gt;
* Références :&lt;br /&gt;
*# Projective geometric algebra: A new framework for doing euclidean geometry, Charles G. Gunn, 2019&lt;br /&gt;
*# [http://www.geogebra.org geogebra]&lt;br /&gt;
&lt;br /&gt;
== sujets 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
=== Comment Facebook gère ses données ?  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Pour une base de données, il est impossible d&#039;être cohérent, disponible tout le temps et partitionné. C&#039;est le fameux théorème CAP. Pour autant, les données de Facebook sont cohérentes, disponibles tout le temps, et réparties à travers le monde !? Impossible. Pour l&#039;étudiant, il faudra comprendre pourquoi c&#039;est impossible, et comment Facebook fait en pratique pour gérer ce problème.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le CAP théorème, et sa démonstration&lt;br /&gt;
*# Comprendre comment Facebook gère ce problème, et ses données d&#039;une manière générale&lt;br /&gt;
*# À définir, selon les questions que se pose l&#039;étudiant.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Théorème CAP :&lt;br /&gt;
*## https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_CAP&lt;br /&gt;
*## Brewer&#039;s Conjeture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services (https://awoc.wolski.fi/dlib/big-data/GiLy02-CAP.pdf)&lt;br /&gt;
*# Facebook Social Graph :&lt;br /&gt;
*## TAO : The power of the graph (https://engineering.fb.com/2013/06/25/core-data/tao-the-power-of-the-graph/)&lt;br /&gt;
*## TAO: Facebook’s Distributed Data Store for the Social Graph (https://www.usenix.org/system/files/conference/atc13/atc13-bronson.pdf)&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de calcul de l&#039;enveloppe convexe  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les ensembles convexes ont beaucoup de propriétés géométriques intéressantes, par exemple détecter la collision de deux ensembles convexes est &amp;quot;facile&amp;quot; algorithmiquement. Une étape fréquente dans beaucoup d&#039;algorithmes de traitements de données 2D/3D/nD est donc de calculer l&#039;enveloppe convexe d&#039;un nuage de points, c&#039;est-à-dire le plus petit ensemble convexe contenant ces points. Il existe de nombreux algorithmes de calcul d&#039;enveloppe convexe en 2D (Graham scan, Melkman, balayage de ligne (sweep-line), division-fusion, Chan&#039;s algorithm, Quickhull) et 3D (Chan&#039;s algorithm, Quickhull) et même nD (Quickhull notamment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
|Enveloppe convexe des points à coordonnées entières inclus dans une boule de diamètre 25&lt;br /&gt;
|----&lt;br /&gt;
[[Fichier:Qhull-25.png|300px]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Objectifs: il s&#039;agira de regarder quelques uns de ces algorithmes, d&#039;identifier leurs principales différences ainsi que leurs complexités théoriques et pratiques. On pourra aussi regarder plus précisément l&#039;algorithme Quickhull, dont l&#039;implémentation 2D est facile, et 3D accessible.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Barber, C. B., Dobkin, D. P., &amp;amp; Huhdanpaa, H. (1996). The quickhull algorithm for convex hulls. ACM Transactions on Mathematical Software (TOMS), 22(4), 469-483 [[https://www.researchgate.net/profile/Hannu_Huhdanpaa/publication/242414606_The_Quickhull_Algorithm_for_Convex_Hulls/links/54e5f6970cf2bff5a4f1e7db.pdf (PDF)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Graham_scan Algorithme de Graham (Wikipedia)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Convex_hull_algorithms Convex hull algorithms (Wikipedia)]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes autour des polyominos ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Un polyomino est une forme (sans trou) obtenue en collant des petits carrés de taille 1 par leurs bords. Des exemples connus sont par exemples les pièces du jeu tetris : il s&#039;agit de &amp;quot;tétramino&amp;quot;, c&#039;est à dire de polyomino formés de 4 carrés. Voici également les pentaminos, composés de 5 carrés :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:polyominos.png]]&lt;br /&gt;
&lt;br /&gt;
Une question récurrente est celle de la pavabilité : peut-on (en utilisant certains types de polyominos) paver un domaine donné.&lt;br /&gt;
Lorsque le domaine est fini, on peut utiliser une recherche exhaustive, mais lorsqu&#039;on veut paver tout le plan, le problème devient indécidable en général.&lt;br /&gt;
Nous nous intéresserons au cas le plus simple : est-il possible de paver le plan tout entier en utilisant des polyominos tous identiques, et en utilisant uniquement des translations.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pavages.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les définitions et notions de bases des polyominos, et en particulier leur représentation comme mot de contour&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance de polyominos en Python&lt;br /&gt;
*# comprendre la caractérisation des polyominos &amp;quot;exacts&amp;quot;, càd ceux qui pavent le plan&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance des polyominos exacts en Python&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Bibliographie initiale&lt;br /&gt;
*# [http://www.xprov.org/doc/these-XProvencal.pdf &amp;quot;Combinatoire des mots, géométrie discrète et pavages&amp;quot;], Xavier Provencal (chapitres 1 et 2)&lt;br /&gt;
*# [https://www.lama.univ-smb.fr/pagesmembres/vuillon/IanRAIRO.pdf &amp;quot;An algorithm for deciding if a polyomino tiles the plane by translation&amp;quot;], Ian Gambini et Laurent Vuillon&lt;br /&gt;
&lt;br /&gt;
=== Version algorithmique du lemme local de Lovász  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons un problème standard sur le routage de paquets dans des réseaux. Donnés un réseau et une collection de paquets, chacun venant avec un chemin dans le réseau (de la source vers la destination), le but est d’établir un planning qui minimise le temps pour que tous les paquets atteignent leur destination. Il est naturel de mesurer la qualité d’un tel planning en fonction de deux paramètres : la congestion c qui est le nombre maximum de paquets qui doivent emprunter une même arête du réseau et la dilatation d qui est le nombre maximum d’arêtes d’un chemin. En effet, il est facile de trouver un planning en temps c*d, et tout planning doit prendre comme temps au moins max(c,d). &lt;br /&gt;
&lt;br /&gt;
En 1994, Leighton, Maggsand et Rao ont montré qu’il existait toujours un planning en temps O(c+d). Malheureusement, ce résultat est basé sur le lemme local de Lovász. Il s’agit d’un résultat classique de combinatoire dont la preuve était à l’époque non constructive. Le problème précédent du routage de paquets n’est qu’une application de ce lemme parmi tant d’autres. En 2010, Moser et Tardos donnèrent un algorithme (en plus assez simple et efficace) pour le lemme local de Lovász.&lt;br /&gt;
&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le lemme local de Lovász et certaines de ses applications&lt;br /&gt;
*# Coder la version algorithmique de Moser et Tardos&lt;br /&gt;
*# Coder des applications du lemme (comme par exemple le routage de paquets)&lt;br /&gt;
* Bibliographie initiale : &lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Algorithmic_Lov%C3%A1sz_local_lemma Page wikipedia de la version algorithmique du lemme local de Lovász]&lt;br /&gt;
*# [http://www.scs.cmu.edu/afs/cs.cmu.edu/project/phrensy/pub/papers/LeightonMR94.pdf Application aux routage de paquets par Leighton, Maagsand et Rao]&lt;br /&gt;
*# [https://arxiv.org/pdf/0903.0544.pdf La version algorithmique du lemme local de Lovász par Moser et Tardos]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* Crypto-système de Merkle-Hellman et algorithme de Shamir, Ewan Rakotoanosy (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Reconstruction de surfaces à partir de nuages de points et de normales, Yohan Thépaut (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Algorithmes de super-résolution par apprentissage, Romain Théodet (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Autour de la question de la sensibilité des fonctions Booléennes, Christophe Carmagnac (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Structures de données purement fonctionnelles]], Loïc Dornel (Tuteur : Tom Hirschowitz)&lt;br /&gt;
* Automates cellulaires et décidabilité, Lucas Chardonnet (Tuteur : François Boussion)&lt;br /&gt;
&lt;br /&gt;
== sujets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
=== Crypto-système de Merkle-Hellman et algorithme de Shamir ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Le système de Merkle-Hellman est un système cryptographique de type &amp;quot;clé publique / clé privée&amp;quot;. Il a été inventé juste en 1978, après le système RSA (encore utilisé). Ce système a l&#039;avantage d&#039;être un peu plus simple, mais le **gros** désavantage d&#039;avoir été craqué par A. Shamir en 1984. L&#039;objectif est de comprendre le système, et la faille qu&#039;il contenait. Cela permettra de comprendre l&#039;algorithme de Shamir...&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Shamir, Adi (1984). &amp;quot;A polynomial-time algorithm for breaking the  basic Merkle - Hellman cryptosystem&amp;quot;. IEEE Transactions on Information  Theory. 30 (5): 699–704. doi:10.1109/SFCS.1982.5 [[http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.123.5840&amp;amp;rep=rep1&amp;amp;type=pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Reconstruction de surfaces à partir de nuages de points et de normales ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les lasers d&#039;acquisition de données 3d permettent de fabriquer des données qui approchent le bord d&#039;un objet 3D. Ces données sont souvent sous la forme d&#039;un nuage de points, doublé d&#039;un vecteur associé à chaque point et qui indique la direction normale à la surface de l&#039;objet. On parle de données de Hermite. Il existe des algorithmes dédiés, très efficaces et robustes, pour reconstruire une surface qui passe par ces points. L&#039;objectif est de comprendre les deux principales méthodes, l&#039;une appelée reconstruction de Poisson, l&#039;autre relié à la notion d&#039;indice (ou winding number), leurs qualités et leur défaut.&lt;br /&gt;
* Bibliographie initiale:&lt;br /&gt;
** KAZHDAN, Michael, BOLITHO, Matthew, et HOPPE, Hugues. Poisson surface reconstruction. In : Proceedings of the fourth Eurographics symposium on Geometry processing. 2006 [[http://faculty.cs.tamu.edu/schaefer/teaching/689_Fall2006/poissonrecon.pdf PDF]]&lt;br /&gt;
** BARILL, Gavin, DICKSON, Neil G., SCHMIDT, Ryan, et al. Fast winding numbers for soups and clouds. ACM Transactions on Graphics (TOG), 2018, vol. 37, no 4, p. 43. [[http://www.dgp.toronto.edu/projects/fast-winding-numbers/fast-winding-numbers-for-soups-and-clouds-siggraph-2018-compressed-barill-et-al.pdf]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de super-résolution par apprentissage ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La super-résolution consiste à, étant donné une image M x N, de fabriquer une image &amp;quot;zoomée&amp;quot; de taille kM x kN, où l&#039;information inventée est &amp;quot;crédible&amp;quot;. Le problème est évidemment mal posé mathématiquement, et du coup on rajoute de l&#039;information a priori : continuité des couleurs, continuité des structures géométriques, modèles probabilistes, moyennes non-locales (auto-similarités), etc. Avec l&#039;avènement du deep learning, des méthodes à base d&#039;apprentissage ont vu le jour. En gros, un réseau de neurones (CNN) apprend sur plein d&#039;images en &amp;quot;dézoomant&amp;quot; les images en entrées (facile, on sous-échantillonne), puis on utilise la fonction construite pour faire la super-résolution.&lt;br /&gt;
* L&#039;objectif est de regarder les méthodes de super-résolution, notamment celles par apprentissage et de voir leurs qualités et défauts. On pourra aussi les comparer avec des méthodes purement géométriques de super-résolution, ou des méthodes de moyennes non-locales.&lt;br /&gt;
* Ce sujet a été discuté avec Romain Théodet et conduit à un stage au LAMA pour combiner méthode géométrique et méthode par deep learning pour la super-résolution.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** SHI, Wenzhe, CABALLERO, Jose, HUSZÁR, Ferenc, et al. Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network. In : Proceedings of the IEEE conference on computer vision and pattern recognition. 2016. p. 1874-1883 [[https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf PDF]]?&lt;br /&gt;
** Lachaud, J.-O. and Kerautret, B., Geometric Total Variation for image vectorization, zooming and pixel art depixelizing, In : Proceedings of 5th Asian Conference on Pattern Recognition, 2019 [[Fichier:Paper-GTV.pdf]]&lt;br /&gt;
** [[https://github.com/kerautret/GTVimageVect Démos en ligne d&#039;algorithmes de super-résolution]]&lt;br /&gt;
&lt;br /&gt;
=== Autour de la question de la sensibilité des fonctions Booléennes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : On souhaite s’intéresser aux problèmes résolus par des algorithmes qui répondent par Vrai/Faux. Ces problèmes ont des entrées dans {0,1}^n (entrées codées en binaire) et une sortie dans {0,1) (Vrai ou Faux). Il est donc naturel de s’intéresser aux propriétés de ces fonctions Booléennes. Un certain nombre de paramètres intéressants ont été identifiés, comme la complexité du certificat (nombre minimal de bits nécessaires pour connaître la valeur de sortie), le degré (degré d’un polynôme qui correspond à la fonction sur les entrées Booléennes), la sensibilité (lnombre de bits qui, s’ils sont modifiés, impliquent une modification de la sortie), et bien d’autres (taille d’un arbre de décision, complexité en requêtes classiques ou quantiques, taille des coefficients de Fourier,…). En 1992, Nisan et Szegedy ont montré que tous ces paramètres sont reliés entre eux : si on connait l’un d’eux, par exemple le degré, on sait alors que n’importe quel autre de ces paramètres, par exemple la taille de l’arbre de décision, est limité à un certain intervalle de valeurs. Tous, sauf un : la sensibilité. Aucune méthode de preuve semblait impliquer que ce paramètre ne pouvait pas être beaucoup plus petit que les autres. Nisan et Szegedy posèrent alors la question de savoir si la sensibilité d’une fonction Bolléenne était reliée ou non aux autres paramètres classiques.&lt;br /&gt;
* Cet été, en 2019, un chercheur, Hao Huang, a montré dans une preuve de deux pages que la sensibilité ne pouvait pas être significativement plus petite que les autres paramètres, résolvant le problème posé 27 ans auparavant. Cette &amp;quot;sensitivity&amp;quot; conjecture a été attaquée en vain par de nombreux chercheurs renommés. Or, la nouvelle preuve est si simple qu’un chercheur l’a résumé en un [[https://twitter.com/BooleanAnalysis/status/1145837576487612416 tweet]].&lt;br /&gt;
* L&#039;objectif est de comprendre quels sont les paramètres classiques des fonctions Booléennes et des liens entre eux avant de s&#039;intéresser à la preuve de la conjecture. On pourra essayer de construire des fonctions extrémales (ie, avec des paramètres extrémaux dans leur plage de valeurs).&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** Le papier original où la question a été posée : N. Nisan, M. Szegedy. [[https://www.researchgate.net/profile/Mario_Szegedy/publication/2508255_On_the_Degree_of_Boolean_Functions_as_Real_Polynomials/links/09e41514878e7ef890000000.pdf On the degree of Boolean functions as real polynomials.]] Comput. Complexity, 4 (1992), 462–467.&lt;br /&gt;
** Une référence sur l&#039;analyse des fonctions Booléennes : Ryan O’Donnell. [[http://www.cs.tau.ac.il/~amnon/Classes/2016-PRG/Analysis-Of-Boolean-Functions.pdf Analysis of Boolean Functions]], Cambridge University Press, 2014  &lt;br /&gt;
** La preuve de la conjecture : Hao Huang. [[https://arxiv.org/abs/1907.00847 Induced subgraphs of hypercubes and a proof of the Sensitivity Conjecture]]. Annals of Mathematics, 190 (2019), 949-955&lt;br /&gt;
&lt;br /&gt;
=== Structures de données purement fonctionnelles ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;algorithmique est souvent enseignée sur des langages principalement impératifs tels que C. Les structures de données utilisées ne sont pas toujours évidentes à traduire vers les langages fonctionnels tels que OCaml. L&#039;étudiant s&#039;initiera aux structures de données fonctionnelles et aux concepts liés tels que la persistence, en suivant le livre « Purely functional data structures » d&#039;Okasaki.&lt;br /&gt;
* Liens&lt;br /&gt;
** [[https://www.cs.cmu.edu/~rwh/theses/okasaki.pdf La thèse d&#039;Okasaki (PDF)]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires et décidabilité ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Un automate cellulaire est un modèle de calcul discret, utilisé en dans différentes sciences (informatique, mathématiques, physique, biologie, etc;). Le jeu de la vie est l&#039;exemple emblématique d&#039;automate cellulaire. Les règles de calcul d&#039;un automate cellulaire, et de son évolution au cours du temps sont assez simples, mais mènent cependant à des problèmes complexes dont certains indécidables. Par exemple, déterminer si, étant donné des règles, on arrivera forcément, en un nombre fini d&#039;étapes, dans une configuration donné, quelque soit la configuration initiale (problème de nilopotence).&lt;br /&gt;
* L&#039;objectif est de s&#039;intéresser à ces problèmes indécidables dans les automates cellulaires et de produire un mini-cours sur le sujet.&lt;br /&gt;
* Références &lt;br /&gt;
** K. JARKKO, The nilpotency problem of one-dimensional cellular automata, SIAM J. Comput., Vol. 21, No. 3, pp. 571-586, June 1992.&lt;br /&gt;
** K. CULIK II, J. PACHL, S. Yu, On the limit sets ofcellular automata, SIAM J. Comput., 18 (1989), pp.831-842.&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le &amp;lt;b&amp;gt;lundi 27 mai&amp;lt;/b&amp;gt; de 9h à 11h en salle 115 du chablais.&lt;br /&gt;
Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Tristan_Porteries Tristan Porteries (PDF)]: problèmes avec mémoire restreinte, tuteur S. Tavenas&lt;br /&gt;
* R. Wagner: Reconstruction de surfaces à partir de nuages de points, tuteur J.-O. Lachaud&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Nils_Ruet Nils Ruet (PDF)]: LISP, tuteur P. Hyvernat&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Remy_Bouvier Rémy Bouvier (PDF)]: dancing links, tuteur P. Hyvernat&lt;br /&gt;
&lt;br /&gt;
== sujets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les sujets 1-3 sont encadrés par J.-O. Lachaud, les sujets 4-5 par P. Hyvernat, le sujet 6 par S. Tavenas.&lt;br /&gt;
Un encadrant encadre au max 2 étudiants.&lt;br /&gt;
&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;br /&gt;
# Une question naturelle est de savoir quels sont les problèmes qui peuvent être résolus avec un espace mémoire restreint. Plus formellement, on notera L l&#039;ensemble des problèmes que l&#039;on peut résoudre en utilisant seulement un espace mémoire logarithmique. On s&#039;intéresse à cette classe de problèmes, et plus particulièrement aux problèmes de connectivité dans un graphe.&lt;br /&gt;
#* [https://www.irif.fr/~sperifel/complexite.pdf Sylvain Périfel Complexité algorithmique] : Un livre récent qui survole une grosse partie de la complexité algorithmique. Le chapitre 4 concerne la complexité en espace.&lt;br /&gt;
#* [https://omereingold.files.wordpress.com/2014/10/sl.pdf Omer Reingold Undirected Connectivity in Log-Space]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le vendredi 25 mai 2018, à 9h. Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* ray-tracing au path-tracing, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Raphael_Tournafond.pdf Raphael Tournafond (PDF)]&lt;br /&gt;
* &amp;quot;dancing links&amp;quot; et NP complétude, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Ambroise_Decouttere.pdf Ambroise Decouttere (PDF)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
# Du ray-tracing au path-tracing: il s&#039;agit de comprendre l&#039;évolution des algorithmes de rendu (dits &amp;quot;réalistes&amp;quot;) et de mettre en avant les principales évolutions.&lt;br /&gt;
#* An introduction to ray tracing AS Glassner - 1989 - books.google.com&lt;br /&gt;
#* Energy redistribution path tracing, D Cline, J Talbot, P Egbert - ACM Transactions on Graphics (TOG), 2005 - dl.acm.org&lt;br /&gt;
#* et pour une introduction douce au ray-tracing: TP2 de http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO805/Tests/html/index.html&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; et NP complétude : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
#* [https://arxiv.org/pdf/1203.1895.pdf Classic Nintendo Games are (Computationally) Hard] : preuve que Super Mario et d&#039;autres jeux video classiques sont NP-complets &#039;&#039;Theoretical Computer Science, volume 586, 2015, pages 135–160.&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Imagequilting.gif&amp;diff=16166</id>
		<title>Fichier:Imagequilting.gif</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Imagequilting.gif&amp;diff=16166"/>
		<updated>2026-01-07T16:02:37Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=16165</id>
		<title>VISI401 CMI : bibliographie scientifique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=16165"/>
		<updated>2026-01-07T16:00:48Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Synthèse de texture et transfert de texture par matelassage d&amp;#039;images */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable:&lt;br /&gt;
* 2017--2021 : Jacques-Olivier Lachaud&lt;br /&gt;
* 2022-- : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
Ce module amène l&#039;étudiant à effectuer des recherches bibliographiques sur un sujet donné, et à synthétiser ses résultats sous la forme d&#039;un exposé construit.&lt;br /&gt;
&lt;br /&gt;
L&#039;étudiant, à partir d&#039;un sujet et d&#039;un ou plusieurs articles initiaux, doit approfondir le sujet, appréhender son historique, ses évolutions, et son état actuel. &lt;br /&gt;
&lt;br /&gt;
A côté des ressources fournies par les bibliothèques, quelques pointeurs très utiles pour faire des recherches bibliographiques:&lt;br /&gt;
* [https://scholar.google.fr Scholar Google] (libre)&lt;br /&gt;
* [https://researchgate.net ResearchGate] (libre)&lt;br /&gt;
* [https://mathscinet.ams.org/mathscinet/ MashSciNet] (plus math)&lt;br /&gt;
* [https://www.springerlink.com  Springer] (accès via USMB)&lt;br /&gt;
* [https://www.sciencedirect.com Elsevier Sciencedirect] (accès via USMB)&lt;br /&gt;
* SciHub lorsqu&#039;on ne trouve pas&lt;br /&gt;
&lt;br /&gt;
La synthèse bibliographique se fait en interaction avec le tuteur par des visites régulières et/ou des compte-rendus d&#039;avancement par email. La synthèse finale fait l&#039;objet d&#039;un exposé final (15-20 minutes + questions) et d&#039;un document de présentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2025-2026 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Synthèse de texture et transfert de texture par matelassage d&#039;images]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; La synthèse de texture est le procédé qui vise à générer une nouvelle image à partir d&#039;une ou plusieurs (petites) images modèles, en donnant l&#039;impression que cette nouvelle image suit les propriétés structurelles, colorimétriques et statistiques de l&#039;image originelle. C&#039;est très utilisé en synthèse d&#039;image pour générer de grandes textures à partir de petits échantillons. On se propose d&#039;étudier et d&#039;implémenter un algorithme assez simple mais assez efficace appelé &amp;lt;i&amp;gt;image quilting&amp;lt;/i&amp;gt; pour faire de la génération de texture. Il se base sur de simples recherches de sous-images dans l&#039;image original, en superposant au mieux les sous-images. L&#039;algorithme peut même servir à du transfert de textures. Le langage de développement est au choix.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre la méthode d&#039;image quilting, voir le papier d&#039;Efros et Freeman, Siggraph&#039;2001&lt;br /&gt;
* implémenter dans un premier temps la méthode simple qui parcourt l&#039;image en scan-line et recherche la meilleure sous-image avec un overlap choisi.&lt;br /&gt;
* dans un 2e temps, implémenter la méthode de découpe optimale entre 2 sous-images superposées&lt;br /&gt;
* dans un 3e temps, implémenter le transfert de texture&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;References&#039;&#039;&#039;&lt;br /&gt;
* [[http://graphics.cs.cmu.edu/people/efros/research/quilting.html Efros et Freeman, Siggraph&#039;2001]]&lt;br /&gt;
&lt;br /&gt;
=== [[le bytecode Python]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; Python est un langage &amp;quot;interprété&amp;quot;. Un programme Python n&#039;est jamais directement transformé en suite d&#039;instructions pour le processeur sur lequel il doit s&#039;exécuter. C&#039;est l&#039;interpréteur qui va, lors de l&#039;exécution, regarder les instructions Python pour les exécuter. Pour éviter que le passage par cet intermédiaire prenne trop de temps, le programme Python est d&#039;abord transformé en un &amp;quot;langage intermédiaire&amp;quot; appelé &amp;quot;bytecode&amp;quot;. Ce langage est une espèce de langage d&#039;assemblage propre à Python. Les instructions sont beaucoup plus simples à exécuter que les instructions &amp;quot;haut niveau&amp;quot; et sont identiques pour tous les processeurs.&lt;br /&gt;
&lt;br /&gt;
L&#039;outils principal pour étudier le bytecode python est le module &amp;lt;tt&amp;gt;dis&amp;lt;/tt&amp;gt; (comme &amp;lt;tt&amp;gt;dis&amp;lt;/tt&amp;gt;assembler) de la version usuelle de Python (CPython).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre la différence entre les langages compilé et interprétés&lt;br /&gt;
* comprendre globalement le mécanisme de transformation d&#039;un programme Python en bytecode&lt;br /&gt;
* étudier le bytecode produit sur des exemples particuliers et pertinents (&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;, concaténation, &amp;lt;tt&amp;gt;append&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== [[Peut-on calculer(efficacement) une transformation de Fourier Rapide sur GPU ]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Mouloud Kessar &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039;&lt;br /&gt;
En traitement du signal, ainsi que pour les simulations numériques, les transformations de Fourier rapides sont extrêmement répandues. L&#039;algorithme de Cooley-Tukey publié en 1965 réduit la complexité du calcul d&#039;une transformée de Fourier discrète à 0(nlog(n)), contre O(n2) pour une implémentation native. Sur CPU, la librairie la plus répandue est FFTW (Fastest Fourier Transform in the West). De nombreuses librairies existent sur GPU pour le calcul des FFT. Malgré tout, pour les simulations numériques en mécanique des fluides, ce sont les transformations de Fourier qui peuvent rendre délicat le portage de codes sur GPU.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* De comprendre les différences de la programmation sur GPU par rapport au CPU.&lt;br /&gt;
* Faire un travail bibliographique pour donner des perspectives d’améliorations dans le cas des FFT.&lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, on essaiera:&lt;br /&gt;
* de Paralléliser un code( c++) déjà existant à l&#039;aide d&#039;OpenMP&lt;br /&gt;
* de porter un code( c++) déjà existant sur GPU à l&#039;aide d&#039;OpenMP GPU&lt;br /&gt;
* de déterminer s&#039;il y a des contextes dans lesquels le code est plus efficace sur GPU ou CPU.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références:&#039;&#039;&#039;&lt;br /&gt;
* La page wikipedia des FFT https://fr.wikipedia.org/wiki/Transformation_de_Fourier_rapide&lt;br /&gt;
* les supports de cours de l&#039;IDRIS  http://www.idris.fr/formations/supports_de_cours.html&lt;br /&gt;
&lt;br /&gt;
== sujets 2024-2025 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes de colorations de graphes]] ===&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; Un [https://fr.wikipedia.org/wiki/Th%C3%A9orie_des_graphes graphe] est un ensemble de sommets et un ensemble d’arêtes sur ces sommets. Une [https://fr.wikipedia.org/wiki/Coloration_de_graphe coloration propre] d&#039;un graphe est une assignation de couleurs à chaque sommet du graphe telle que chaque paire de sommets reliée par une arête a des couleurs différentes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Graph.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Coloration.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Impropre.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Une coloration propre de ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Une coloration impropre du graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Connaître le nombre minimum de couleurs permettant de colorer proprement un graphe est un problème NP-difficile. Cependant, il existe des algorithmes de coloration de graphe permettant de trouver une coloration propre en fonction du nombre de voisins maximums d&#039;un sommet. L&#039;objectif de ce sujet est d&#039;implémenter certains de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter l&#039;algorithme de coloration glouton d&#039;un graphe&lt;br /&gt;
# implémenter l&#039;amélioration de cet algorithme en utilisant la dégénérescence du graphe&lt;br /&gt;
# implémenter l&#039;algorithme issus du théorème de Brooks&lt;br /&gt;
# éventuellement, implémenter un algorithme de coloration d&#039;arêtes&lt;br /&gt;
# éventuellement, implémenter un algorithme de transformation du problème SAT en problème de coloration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de Ukkonen / algorithme SA-IS]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; L&#039;arbre des suffixes est une structure de données qui permet de répondre très rapidement à de nombreuses requêtes du style &amp;quot;est-ce que la chaine &#039;&#039;p&#039;&#039; apparait dans la chaine &#039;&#039;S&#039;&#039; ?&amp;quot; La chaine &#039;&#039;p&#039;&#039; pourrait être une &amp;quot;petite&amp;quot; chaine de quelques milliers de caractères, alors que la chaine &#039;&#039;S&#039;&#039; pourrait être une &amp;quot;grosse&amp;quot; chaine de plusieurs milliard de caractères. Lorsque la chaine &#039;&#039;S&#039;&#039; est fixe, cette recherche se fait en un temps proportionnel à la taille de &#039;&#039;p&#039;&#039;, indépendamment de la taille de &#039;&#039;S&#039;&#039; ! Ce qui rend ceci possible est le précalcul de l&#039;arbre des suffixes de &#039;&#039;S&#039;&#039;, une fois pour toute. Si on fait ce précalcul de manière naïve, il prend un temps proportionnel à la taille de &#039;&#039;S&#039;&#039; &#039;&#039;&#039;au carré&#039;&#039;&#039;. Lorsque &#039;&#039;S&#039;&#039; contient des milliards de caractéres, ceci n&#039;est pas raisonnable.&lt;br /&gt;
&lt;br /&gt;
L&#039;algorithme de Ukkonen permet de calculer l&#039;arbre des suffixes en un temps proportionnel à la taille de &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# comprendre la structure d&#039;arbre des suffixes&lt;br /&gt;
# coder une version naïve du calcul de l&#039;arbre des suffixes&lt;br /&gt;
# comprendre et coder une version de l&#039;algorithme de Ukkonen, et comparer les temps de calcul&lt;br /&gt;
# si le temps le permet, comprendre l&#039;algorithme SA-IS qui permet de construite le tableau des suffixes en un temps proportionnel à la taille de &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# les [https://www.youtube.com/playlist?list=PL2mpR0RYFQsDFNyRsTNcWkFTHTkxWREeb vidéos de Ben Langmead] sur les arbres de suffixes (vidéos 1 -- 9)&lt;br /&gt;
# description de l&#039;algoritme de Ukkonen dans Dan Gusfield, &#039;&#039;Algorithms on Strings, Trees and Sequences&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Approximations d&#039;Euler et Runge-Kutta pour la modélisation du problème à 3 corps===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
en astronomie, la modélisation du problème à N corp est un enjeu majeur. Il est indispensable pour l&#039;exploration spatiale, notamment pour l&#039;envoie de sonde sur Mars, ou&lt;br /&gt;
Titan (Lune de Jupiter).&lt;br /&gt;
&lt;br /&gt;
Les équations décrivant le problème à N corps existent depuis de nombreuses années, mais les mathématiciens et les physiciens ne savent pas les résoudre analytiquement.&lt;br /&gt;
&lt;br /&gt;
Des codes de calcul existent pour réaliser des simulations du système solaire.&lt;br /&gt;
&lt;br /&gt;
D&#039;un point de vue algorithmique, le point clef se situe dans l&#039;approximation choisie pour les dérivées en temps.&lt;br /&gt;
&lt;br /&gt;
Une approximation à l&#039;aide d&#039;une méthode type Euler ou Runge-Kutta va avoir un ordre de précision prédéfini.&lt;br /&gt;
&lt;br /&gt;
Toutes ces approximations ne se valent pas, et une analyse rigoureuse de la fiabilité de ces méthodes est nécessaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; il n&#039;est pas nécessaire de connaître les méthodes numériques au préalables car elles seront introduites et développées dans un cadre simple au fur et à mesure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre le fonctionnement de l&#039;approximation d&#039;une dérivée par une méthode numérique (type Euler et Runge-Kutta d&#039;ordre 2)&lt;br /&gt;
* Développer  un programme permettant de  prédire les mouvements des corps suivants: Jupiter, La Terre, et Le Soleil&lt;br /&gt;
* Mesurer l&#039;ordre de précision des deux méthodes numériques implémentées, et comparer à l&#039;ordre théorique.&lt;br /&gt;
* Si le temps le permet:&lt;br /&gt;
** Ajouter les schémas  Runge-Kutta 4 et 6&lt;br /&gt;
** modifier le code pour inclure Mars, Venus et Mercure&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
# La formulation générale du problème à N-corp est donnée ici: https://en.wikipedia.org/wiki/N-body_problem&lt;br /&gt;
# Ce type d&#039;étude peut devenir autrement plus complexe que la version présentée ici. Dans le film &amp;quot;The Martian&amp;quot; , un astronaute est piégé sur Mars, et son équipe qui était en route pour la terre doit venir le récupérer. Le centre de calcul &amp;quot;Pléiades&amp;quot; de la NASA est présenté, et utilisé pour déterminer s&#039;il est possible de renvoyer le vaisseau spatial récupérer l&#039;astronaute, notamment à l&#039;aide d&#039;une fronde gravitationnelle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Programmation graphique sur GPU]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé et objectifs :&#039;&#039;&#039; les cartes graphiques modernes permettent l&#039;affichage de millions de polygones avec des rendus presque réalistes en temps réel.&lt;br /&gt;
L&#039;objectif de ce sujet est de découvrir la modélisation 3D, puis les programmations spécifiques des vertex et fragment shaders pour réaliser certains types d&#039;effet (camera,&lt;br /&gt;
transformations géométriques, illumination, textures, halos, stylisations, incrustations).&lt;br /&gt;
Le pipeline OpenGL sera étudié, et accédé via WebGL/javascript/three.js. Dans une 2eme partie, certains shaders de shadertoy.com seront étudiés plus en détails, afin de&lt;br /&gt;
comprendre les nombreuses astuces utilisées par les experts du domaine pour faire des effets impressionnants en temps réel.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque :&#039;&#039;&#039; sujet discuté avec Vetea Stoll&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Magic Numbers et Jeux Vidéo]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé et objectifs :&#039;&#039;&#039; les magic numbers sont souvent considérés comme une mauvaise pratique en&lt;br /&gt;
programmation. Cependant, l&#039;algorithme emblématique de la racine carrée inverse rapide,&lt;br /&gt;
utilisé dans les moteurs de jeux vidéo comme Quake III Arena, justifie&lt;br /&gt;
l&#039;utilisation du fameux 0x5f3759df.&lt;br /&gt;
Ce sujet propose d&#039;étudier cet algorithme, ainsi que des sujets connexes.&lt;br /&gt;
&lt;br /&gt;
Travail à réaliser :&lt;br /&gt;
* Expliquer le fonctionnement détaillé de l&#039;algorithme.&lt;br /&gt;
* Comparer avec la méthode de Newton-Raphson&lt;br /&gt;
* Expliquer les applications pratiques&lt;br /&gt;
* Comparer les performances en temps d&#039;exécution et en mémoire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Indexation dans les Bases de Données]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sujet :&#039;&#039;&#039; en bases de données, les index sont essentiels pour accélérer les requêtes,&lt;br /&gt;
mais ils impliquent des compromis entre performance, espace et coût de&lt;br /&gt;
maintenance.&lt;br /&gt;
Dans ce sujet, vous étudierez les types d&#039;index (B-tree, Hash, etc.), leur&lt;br /&gt;
impact sur les requêtes et les modifications (``INSERT``, ``UPDATE``, ``DELETE``).&lt;br /&gt;
&lt;br /&gt;
Travail à réaliser :&lt;br /&gt;
* Expliquer les structures d’index (B-tree, Hash).&lt;br /&gt;
* Expliquer les différents cas d&#039;usage&lt;br /&gt;
* Expliquer l’impact des index sur les performances des requêtes (``SELECT WHERE``).&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ressource pour commencer :&#039;&#039;&#039;&lt;br /&gt;
# &amp;quot;Bases de données : concepts, utilisation et développement&amp;quot;, Jean-Luc Hainaut, chapitre 4 (disponible à la BU)&lt;br /&gt;
&lt;br /&gt;
== sujets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Génération de labyrinthes &amp;quot;organiques&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; la génération de labyrinthes est un problème classique, notamment abordé dans les cours d&#039;algorithmes de graphes. Ces méthodes permettent de générer des labyrinthes sur des &#039;&#039;grilles&#039;&#039;, typiquement carrées :&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze_grid.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
La création de labyrinthe &amp;quot;organiques&amp;quot;, du style&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
utilise une méthode très différente. Les détails sont décrits dans un article publié en  2006: http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf. La description peut sembler très abstraite, mais l&#039;idée initiale est assez simple : une courbe initiale est, petit à petit, déformée aléatoirement.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; comprendre la méthode de base, et l&#039;implémenter pour générer des labyrinthes organiques. La première version pourra être codée en Python, mais comme la méthode nécessite une &#039;&#039;grosse&#039;&#039; quantité de calculs, il pourra être intéressant de coder une seconde version en utilisant un langage compilé si l&#039;on souhaite obtenir de &amp;quot;gros&amp;quot; labyrinthes. De nombreuses améliorations sont décrites dans l&#039;article de H. Pedersen et K. Singh, et il serait intéressant de d&#039;en implémenter certaines, soient en Python (en les testant sur de petits labyrinthes) soit dans un autre langage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039; Hans Pedersen et Karan Singh, &#039;&#039;Organic Labyrinths and Mazes&#039;&#039;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== Tramage artistique d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le tramage d&#039;une image (en anglais *dithering* ou *half-toning*) consiste à esquisser une image en niveaux de gris ou en couleur à l&#039;aide de très peu d&#039;encres ou couleurs différentes. Historiquement, l&#039;utilisation la plus courante est en impression: un fax ne dispose que d&#039;une encre noire (donc 2 couleurs noir et blanc pour transférer une image), les imprimantes n&#039;ont que 4 encres (et donc cinq couleurs jaune, cyan, magenta, noir et le blanc du papier). Les premiers ordinateurs avaient des écrans avec très peu de couleurs, donc les photos étaient approchées avec 8 ou 16 couleurs. &lt;br /&gt;
&lt;br /&gt;
En informatique, les algorithmes de tramage par diffusion d&#039;erreur [https://fr.wikipedia.org/wiki/Algorithme_de_Floyd-Steinberg#:~:text=L%27algorithme%20de%20Floyd%2DSteinberg,un%20pixel%20à%20ses%20voisins. Floyd-Steinberg] sont faciles à implémenter et rapide, donc très utilisés.&lt;br /&gt;
&lt;br /&gt;
Néanmoins, il existe des algorithmes qui donnent des résultats beaucoup plus jolis, notamment celui proposé par Ostromoukhov et Hersch (1999). Nous proposons de l&#039;étudier et de l&#039;implémenter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-david.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-photo.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Floyd-Steinberg&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Ostromoukhov-Hersch&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre les principes du tramage, éventuellement coder en python/opencv l&#039;algorithme basique. Comprendre ensuite l&#039;algorithme d&#039;Ostromoukhov et Hersch (1999), et l&#039;implémenter en python, d&#039;abord en noir et blanc, et si le temps le permet, en couleur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://dl.acm.org/doi/pdf/10.1145/311535.311605 Ostromoukhov et Hersch, Multi-Color and Artistic Dithering, ACM SIGGRAPH 1999]&lt;br /&gt;
* [https://opencv.org OpenCV], pratique pour lire une image, l&#039;afficher, faire des traitements.&lt;br /&gt;
&lt;br /&gt;
=== Rendu réaliste de scènes 3D par lancer de rayons ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note : &#039;&#039;&#039; Sujet demandé par Lukas Rey.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le rendu réaliste de scène 3D a été (et reste) un des objectifs majeurs de l&#039;informatique graphique, notamment grâce à ses nombreuses applications dans différents domaines : le cinéma (effets spéciaux), mais aussi le marketing, la publicité, l&#039;architecture, ou l&#039;art. L&#039;algorithme le plus utilisé est appelé &amp;quot;lancer de rayons&amp;quot;, avec un objectif de simuler le trajet des rayons lumineux dans une scène 3D afin de déterminer les couleurs perçues par un observateur. Plutôt que de calculer tous les rayons lumineux d&#039;une scène, cet algorithme calcule seulement le trajet inverse des rayons lumineux qui arrivent dans l&#039;oeil de l&#039;observateur, ce qui est beaucoup plus économique. On verra que cet algorithme permet de simuler des matériaux réfléchissants ou (semi-)transparents, de calculer des ombres portées, de simuler du brouillard...&lt;br /&gt;
&lt;br /&gt;
[[file:ray-tracing.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Il s&#039;agit de comprendre d&#039;où vient la couleur perçue d&#039;un objet, d&#039;implémenter l&#039;algorithme récursif classique du lancé de rayons, au moins avec des objets simples (sphères, tétraèdres), et de voir comment optimiser les calculs (car ça devient vite coûteux). On pourra s&#039;appuyer sur ce [https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html TP] pour l&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://en.wikipedia.org/wiki/Ray_tracing_(graphics)&lt;br /&gt;
* https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html&lt;br /&gt;
&lt;br /&gt;
=== Rendu temps réel avec OpenGL ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Colin Weill-Duflos&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; On cherche à utiliser une API graphique (OpenGL) afin de faire du rendu de scène 3d en utilisant la carte graphique. Cela permet d&#039;utiliser les techniques de rendu 3d en temps réel (rastérisation) et de les faire effectivement fonctionner en temps réel, permettant d&#039;afficher une scène avec laquelle on peut intéragir : en déplaçant la caméré, en bougeant des éléments...&lt;br /&gt;
Ces techniques ont déjà été utilisée dans des années précédentes, sans utiliser la carte graphique (le résultat était assez lent). Grâce à OpenGL, la plupart de ces opérations peuvent s&#039;effectuer sur la carte graphique, ce qui permet de ne pas avoir à en recoder une partie (grâce à des composants capables de faire uniquement ces opérations) et d&#039;être plus rapide.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre les techniques de raterisation&lt;br /&gt;
* comprendre la pipeline OpenGL&lt;br /&gt;
* implémenter une scène avec un objet et une caméra controlable&lt;br /&gt;
* rajouter des shaders pour simuler la lumière (Phong shading), variantes stylisées (Toon shading)&lt;br /&gt;
* rajouter des textures sur la scène&lt;br /&gt;
* faire des shadow maps pour les ombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [Travaux précédents](http://os-vps418.infomaniak.ch:1250/mediawiki/images/0/0d/Gossin-2023.pdf)&lt;br /&gt;
* [Pipeline OpenGL](https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview)&lt;br /&gt;
* [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
* [Toon shading](https://fr.wikipedia.org/wiki/Ombrage_de_cellulo%C3%AFd)&lt;br /&gt;
* [Shadow maps](https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping)&lt;br /&gt;
&lt;br /&gt;
=== Problèmes indécidables ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Quand on a un calcul à faire, on peut se demander de la meilleure implémentation pour faire faire ce calcul par un ordinateur. On pense généralement moins à la question - pourtant primordiale - de savoir si ce calcul peut être effectué par l’ordinateur. Pourtant, on sait depuis l’origine de l’informatique qu’il existe des fonctions que l’on ne peut pas calculer à l’aide d’un ordinateur.  On cherchera à comprendre ce que serait un programme qui résoudrait le problème de l’arrêt et pourquoi, il ne marchera pas. On pourra se demander alors s’il y a un lien entre les différents problèmes non-calculables : avec une librairie qui résout le problème de l’arrêt, peut-on écrire un problème qui résout le problème de correspondance de Post ? Peut-on imaginer un problème qu’on ne pourrait pas résoudre même si on avait une fonction qui résolvait le problème de l’arrêt ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de fonction calculable (et donc de fonction non-calculable). Donner des exemples. &amp;quot;Coder&amp;quot; l’argument diagonal de la non-calculabilité de l’arrêt. Coder une réduction entre deux problèmes non-calculables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Th%C3%A9orie_de_la_calculabilit%C3%A9 Wikipédia - Théorie de la calculabilité]&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_l%27arr%C3%AAt Wikipédia - Problème de l&#039;arrêt]&lt;br /&gt;
* [https://ludovicpatey.com/courses/comp-thy-2023/cr11-fr.pdf Livre récent en français sur la théorie de la calculabilité]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Réseaux de neurones et apprentissage ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; sujet demandé par Elliot Moiroud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
# se familiariser avec les concepts utilisés en apprentissage,&lt;br /&gt;
# essayer d&#039;implémenter une version ultra simple de la procédure d&#039;apprentissage,&lt;br /&gt;
# utiliser une bibliothèque existante sur quelques exemples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
# http://neuralnetworksanddeeplearning.com/&lt;br /&gt;
&lt;br /&gt;
=== Synchronisation dans les Systèmes Distribués ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; l&#039;algorithme de Lamport joue un rôle crucial dans la synchronisation des horloges dans un réseau de machines qui ne sont pas nécessairement précises ou synchronisées entre elles. Il permet de créer un consensus sur l&#039;ordre des événements dans un système distribué, où la communication peut être retardée ou désordonnée. Cette capacité est fondamentale pour assurer la cohérence et la fiabilité des opérations dans des environnements distribués, tels que les bases de données distribuées, les systèmes de fichiers en réseau et les applications de blockchain. Après avoir maîtrisé l&#039;algorithme de Lamport, l&#039;étudiant pourra les fautes byzantines pour comprendre comment les systèmes distribués gèrent les informations contradictoires ou erronées transmises par différents nœuds du réseau.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Analyser et comprendre l&#039;algorithme de Lamport pour la synchronisation des horloges.&lt;br /&gt;
# (Examiner les fautes byzantines et leur influence sur la stabilité des systèmes distribués.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Time, Clocks, and the Ordering of Events in a Distributed System.&lt;br /&gt;
https://lamport.azurewebsites.net/pubs/time-clocks.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation dynamique et complexité ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; La programmation dynamique est sans doute une des techniques de programmation qui porte le plus mal son nom.  Elle s&#039;applique lorsqu&#039;un problème peut se décomposer en sous-problèmes, dont les solutions peuvent être combinées. Dans le cas relativement simples où les sous-problèmes sont toujours disjoint, on utilise une approche de type &amp;quot;diviser pour rêgner&amp;quot;. Lorsque ce n&#039;est pas le cas, il faut faire attention à ne pas dupliquer les calculs. Les deux approches habituelles sont :&lt;br /&gt;
# la &amp;quot;mémoization&amp;quot;, qui consiste à sauvegarder toutes les solutions trouvées pour éviter de les recalculer,&lt;br /&gt;
# la &amp;quot;programmation dynamique&amp;quot; qui consiste à faire les solutions dans le &amp;quot;bon ordre&amp;quot; afin de ne jamais avoir besoin d&#039;une solution qui n&#039;aurait pas été calculée.&lt;br /&gt;
&lt;br /&gt;
Ces techniques permettent en général d&#039;obtenir un algorithme beaucoup plus rapide que la version naïve.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# étudier les méthodes de &amp;quot;mémoization&amp;quot; et &amp;quot;programmation dynamique&amp;quot; sur plusieurs exemples et les comparer&lt;br /&gt;
# mettre en évidence les complexités &amp;quot;pratiques&amp;quot; de ces algorithmes au moyen de benchmarks pertinents&lt;br /&gt;
# comprendre les calculs &amp;quot;théoriques&amp;quot; de la complexité de ces algorithmes pour vérifier que les prédictions correspondent à la pratique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;Introduction à l&#039;algorithmique&amp;quot;, T. Cormen, C. Leiserson, R. Rivest, C. Stein&lt;br /&gt;
# la page wikipedia française : https://fr.wikipedia.org/wiki/Programmation_dynamique&lt;br /&gt;
&lt;br /&gt;
== sujets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
=== algorithmes de recherche de chaines ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : rechercher si une chaine &#039;&#039;s1&#039;&#039; apparait à l&#039;intérieur d&#039;une chaine &#039;&#039;s2&#039;&#039; est assez simple, mais l&#039;algorithme naïf n&#039;est pas très rapide. L&#039;objectif de ce sujet est de s&#039;intéresser à certains algorithmes de recherche de sous-chaines plus efficaces. Le plus simple est probablement l&#039;algorithme KMP (du noms de ses inventeurs : Knuth, Morris et Pratt) qui évite des comparaisons inutiles de l&#039;algorithme naïf. L&#039;algorithme de Boyer-Moore utilise des idées similaires mais considère la sous-chaine (&#039;&#039;s1&#039;&#039;) à l&#039;envers, ce qui lui permet d&#039;aller en général plus vite. Ces algorithmes restent assez lents lorsque la chaine &#039;&#039;s2&#039;&#039; est très grande. C&#039;est par exemple le cas en bio-informatique lorsque l&#039;on doit rechercher des chaines dans le génome. Dans ce cas, la chaine &#039;&#039;s2&#039;&#039; est fixe et on rercherche de nombreuses sous-chaines &#039;&#039;s1&#039;&#039;. Il est alors possible de faire un &#039;&#039;pré-traitement&#039;&#039; pour faire une recherche beaucoup plus rapide qui ne dépend pas de la taille de &#039;&#039;s2&#039;&#039; !&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de quelques uns de ces algorithmes&lt;br /&gt;
*# les implémenter (par exemple en Python)&lt;br /&gt;
*# essayer de les comparer&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
# https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm&lt;br /&gt;
# transformé de Burrows-Wheeler et recherche de sous-chaines https://www.youtube.com/watch?v=P3ORBMon8aw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== génération de labyrinthes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : il existe de nombreuses méthodes algorithmiques pour générer des labyrinthes aléatoires. La plupart de ces méthodes sont expliquées sur des grilles carrées mais il est possible de les implémenter sur d&#039;autres types de grilles. Il est possible des les adapter par exemple pour générer des labyrinthes circulaires, cylindriques, ou sphériques ; ou bien des labyrinthes en plusieurs parties (de grandes pièces contenant des labyrinthes, reliées par des couloirs formant un autre labyrinthe).&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de plusieurs algorithmes de génération de labyrinthes&lt;br /&gt;
*# les étendres à des grilles plus intéressantes&lt;br /&gt;
*# &#039;&#039;expérimenter et chercher des manières simples de générer un labyrinthe &amp;quot;continu&amp;quot;&#039;&#039; (La solution décrite dans &amp;quot;How to Generate Perfect Mazes?&amp;quot; est probablement un peu trop complexe.)&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** le livre &amp;quot;Mazes for programmers&amp;quot;, https://pragprog.com/titles/jbmaze/mazes-for-programmers/&lt;br /&gt;
** l&#039;article &amp;quot;How to Generate Perfect Mazes?&amp;quot;, https://hal.uca.fr/hal-03174952/file/article-journal-2020.pdf&lt;br /&gt;
** l&#039;article &amp;quot;Organic Labyrinths and Mazes&amp;quot;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== L’infâme GOTO ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : L’instruction goto n’a aujourd’hui plus la côte parmi les informaticiens, et est souvent considérée comme une instruction à bannir. L&#039;idée est d&#039;explorer ce que permet cette instruction, et comment a évolué son utilisation.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# remplacer des structures de contrôles simples simples par des goto&lt;br /&gt;
*# faire un programme plus complexe utilisant un maximum de goto&lt;br /&gt;
*# expliquer l&#039;évolution de l&#039;utilisation du goto&lt;br /&gt;
*# avantages/inconvénients de son utilisation&lt;br /&gt;
*# comparaison des langages prenant en charge ou non cette instruction et pourquoi&lt;br /&gt;
*# utilisation actuelle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Blockchains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : les blockchains sont de plus en plus populaires, utilisées initialement pour les cryptomonnaies, elles peuvent être utilisées pour stocker des données, gérer les contrats intelligents, etc.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre le fonctionnement des blockchains (par exemple avec l&#039;article de Satoshi Nakamoto)&lt;br /&gt;
*# implémenter une blockchaine&lt;br /&gt;
*# ...&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de reconstruction de surfaces à partir d&#039;images 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les images 3D sont devenues courantes avec les outils d&#039;acquisition comme les scanners X ou les scanners IRM. On peut aussi modéliser des objets 3D sous forme de volumes, pour ensuite en extraire des surfaces (e.g. modélisation de fluides, de feu ou de fumées). Un enjeu est de pouvoir construire des surfaces qui représentent le bord d&#039;objets d&#039;intérêt dans ces données volumiques. Les algorithmes les plus classiques reconstruisent une surface composée de triangles qui approchent un niveau de gris donné dans le volume 3D :  c&#039;est une iso-surface, comparable à une courbe d&#039;iso-altitude dans une carte topographique, mais en 3D ! On  s&#039;intéreressera à deux algorithmes particulièrement : le marching-tetrahedra et le marching-cubes.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre ce qu&#039;est une iso-surface dans une image 3D ou dans une fonction implicite.&lt;br /&gt;
*# Comprendre les points communs et différences des algorithmes Marching Tetrahedra et Marching Cubes&lt;br /&gt;
*# Implémenter un des deux algorithmes. On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python. &lt;br /&gt;
*# On lira des fichiers .vol pour les images 3D, qui vous seront fournies.&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_tetrahedra Marching Tetrahedra sur wikipedia]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_cubes Marching Cubes sur wikipedia]&lt;br /&gt;
** [https://dl.acm.org/doi/pdf/10.1145/37402.37422 Lorensen, Cline, Marching cubes: a high resolutions 3D surface construction algorithm, Computer Graphics, 21(4), 1987]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-slices.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-isosurface.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Coupes dans une image 3D &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Isosurface dans cette image &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Invitation à la complexité algorithmique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
* Résumé : on abordera le thème de la complexité algorithmique : étant donné un programme implémentant une fonction, peut-on borner son temps de calcul en fonction de la taille de ses entrées. On procédera par l&#039;exemple, en tentant de confirmer la théorie par des expériences concrets de petits programmes (par exemple en Python). Comme point d&#039;entrée, on pourra par exemple examiner les différences de complexité entre quelques algorithmes de tri.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre l&#039;intérêt de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;,&lt;br /&gt;
*# se familiariser avec les notions et notations utilisées pour décrire la complexité en temps de calcul (ou en mémoire) des algorithmes,&lt;br /&gt;
*# apprendre à vers de &amp;quot;benchmarks&amp;quot; pour évaluer l&#039;efficacité réelle d&#039;une fonction dans un langage de programmation,&lt;br /&gt;
*# comprendre les limites de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== sujets 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
===Rust et la notion d&#039;appartenance (&amp;quot;ownership&amp;quot;)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Théo Connetable : [[Fichier:VISI401-2022-Connetable.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : dans la plupart des langages &amp;quot;haut niveau&amp;quot; (Python, Java, Javascript, ...), la mémoire est gérée automatiquement. Par exemple, Python détecte qu&#039;une liste ne sert plus à rien pour libérer la mémoire qu&#039;elle occupait. Dans les langages &amp;quot;bas niveau&amp;quot; (C), c&#039;est au programmeur de libérer explicitement la mémoire qu&#039;il utilise. (S&#039;il ne le fait pas, son programme risque d&#039;avoir des &amp;quot;fuites de mémoire&amp;quot;.) Rust est un nouveau (première version en 2010) langage de programmation. Un des objectifs de Rust est d&#039;offrir des garanties de sécurité sur la mémoire avec la notion d&#039;appartenance. Ces garanties sont testées à la compilation et ne dégradent donc pas l&#039;efficacité du programme final.&lt;br /&gt;
* Objectifs : l&#039;objectif, après s&#039;être familiarisé avec le langage Rust, est de comprendre à quoi correspond la notion de &amp;quot;ownership&amp;quot; (&amp;quot;appartenance&amp;quot;) et de l&#039;illustrer sur quelques exemples. Si l&#039;étudiant ne les connait pas, les notions de pointeurs (en C), d&#039;allocation sur la pile, sur le tas, et le concept de &amp;quot;ramasse miettes&amp;quot; (garbage collector&amp;quot; en anglais) seront des étapes préliminaires importantes.&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# The Rust Programming Language https://doc.rust-lang.org/book/title-page.html, avec en particulier la section 4, &amp;quot;Understanding Ownership&amp;quot;&lt;br /&gt;
*# Safe Systems Programming in Rust https://cacm.acm.org/magazines/2021/4/251364-safe-systems-programming-in-rust/fulltext&lt;br /&gt;
*# Rust Ownership by Example https://depth-first.com/articles/2020/01/27/rust-ownership-by-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Bitcoin &amp;amp; blockchain===&lt;br /&gt;
* Présentation : Baptiste Griva [[Fichier:VISI401-2022-Griva.pdf]]&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Les blockchain sont de plus en plus populaires. Avec l&#039;article de Satoshi Nakamoto, l&#039;étudiant devra comprendre son fonctionnement. On pourra dans un second temps s&#039;intéresser aux attaques habituelles face à une blockchain.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre le fonctionnement de la blockchain bitcoin&lt;br /&gt;
*# S&#039;intéresser à ses vulnérabilités (51% attack,...)&lt;br /&gt;
* Références: pour commencer https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
===Débruitage d&#039;image===&lt;br /&gt;
* Présentation : Lucas Policastro [[Fichier:VISI401-2022-Policastro.pdf]]&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La plupart des procédés d&#039;acquisition d&#039;image (typiquement capteurs CCD ou CMOS des caméras ou téléphones) ne sont pas parfaits et introduisent du bruit (des perturbations) dans les images résultantes. Ce bruit ressemble en général à une perturbation aléatoire locale par capteur, indépendante de ce  qui se passe sur un capteur proche. Peut-on alors améliorer la qualité visuelle d&#039;une photo dégradée par un tel bruit (typiquement gaussien) ? On regardera notamment les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
*# On pourra s&#039;appuyer sur les démos IPOL en ligne de ces algorithmes et leur description. http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
*# L&#039;algorithme des moyennes non locales est implémentable relativement facilement (même en numpy).&lt;br /&gt;
* Références:&lt;br /&gt;
** http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
** Le site https://www.ipol.im contient plein d&#039;algos de restauration d&#039;image (suivre Enhancement &amp;amp; Restoration, puis Denoising).&lt;br /&gt;
&lt;br /&gt;
===Sécurité des cartes RFID : le cas Mifare===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Paul Aubry [[Fichier:VISI401-2022-Aubry.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : les cartes RFID (Radio Frequency IDentification) sont des cartes à puce qui peuvent communiquer avec un lecteur distant (mais proche). De nombreuses cartes de transport en commun ou d&#039;ouverture de portes utilisent cette technologie. La carte Mifare classic, très répandue, utilise un protocole cryptographique pour éviter les &amp;quot;replay attacks&amp;quot; (enregistrer un échange pour le réutiliser) et le clonage de la carte. Le détails du protocole est longtemps resté un secret industriel, mais ceci n&#039;a pas empéché la découverte de *grosses* failles. Il est maintenant possible de cloner une carte Mifare en quelques secondes avec du matériel grand public.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre fonctionne la protection contre les &amp;quot;replay attacks&amp;quot; à partir de challenges cryptographiques&lt;br /&gt;
*# comprendre le protocole Mifare classic&lt;br /&gt;
*# comprendre les attaques sur le protocole&lt;br /&gt;
*# expérimenter avec des puces RFID existante *(facultatif)*&lt;br /&gt;
*# regarder les évolutions du protocole pour se protéger de ces attaques&lt;br /&gt;
* Référence : F. D. Garcia, P. van Rossum, R. Verdult, R. Wichers Schreur : &amp;quot;Wirelessly Pickpocketing a Mifare Classic Card&amp;quot; https://www.cs.ru.nl/~flaviog/publications/Pickpocketing.Mifare.pdf&lt;br /&gt;
&lt;br /&gt;
===Ingénierie Dirigée par les Modèles (IDM)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Alexandre Desbos [[Fichier:VISI-401-2022-Desbos.pdf]]&lt;br /&gt;
* Tuteur : Philippe Pernelle&lt;br /&gt;
* Résumé : l&#039;ingénierie dirigée par les modèles (ou MDE Model Driven Engineering) est une approche de conception basée sur la transformation de modèle sur des niveaux d&#039;abstraction différents (modèle, méta-modèle, méta-méta-modèle ...). l&#039;OMG propose une approche MDE basée sur 3 niveaux  d&#039;abstraction (CIM,PIM, PSM)  permettant de bâtir une application  en partant du niveaux d&#039;abstraction le plus haut (CIM) et en procédant par transformation / raffinement pour arriver au PSM puis à la génération de code. Il existe par ailleurs différents langages  (ATL, OCL) qui vont faciliter la transformation de modèle. A noter que la fondation Eclipse propose un environnement spécifique pour manipuler des modèles avec des implémentations d&#039;ATL et d&#039;OCL&lt;br /&gt;
* Objectifs :  L&#039;objectif est d&#039;étudier ces mécanismes de transformation / raffinement par l&#039;implémentation d&#039;un cas d&#039;étude dans eclipse en utilisant les langages ATL et OCL. Après une étude bibliographique des principes de MDA, l&#039;idée est de mettre en oeuvre dans Eclipse des extrait des modèles CIM, PIM et PSM proposés par les articles ci-dessous puis d&#039;essayer de construire des OCL et des scripts ATL afin de faciliter la transformation (sans aller jusqu&#039;à la génération de code)&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# These : https://hal.archives-ouvertes.fr/tel-01247610 (uniquement les pages 35 à 47)&lt;br /&gt;
*# Models and Mechanisms for implementing playful scenarios https://hal.archives-ouvertes.fr/hal-01372311&lt;br /&gt;
*# Digital Twin and Ecological Transition Integration in Training Process https://hal.archives-ouvertes.fr/hal-03375508&lt;br /&gt;
*# Eclipse Modeling Tools https://www.eclipse.org/downloads/packages/release/2021-12/r/eclipse-modeling-tools&lt;br /&gt;
&lt;br /&gt;
===[[Couvrir un polygone rectilinéaire avec des rectangles]]===&lt;br /&gt;
* Présentation : Maxent Bernier [[Fichier:VISI401-2022-Bernier.pdf]]&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Un polygone est dit rectilinéaire si les seuls angles qui apparaissent sont des angles droits. On considérera des polygones simples (i.e., sans trous et qui ne s&#039;auto-intersectent pas). Un tel polygone peut donc être recouvert par des carrés ou par des rectangles. On cherchera à écrire un algorithme qui trouve une couverture minimale (i.e., avec le moins de carrés/rectangles possibles). Dans le cas des carrés, on va pouvoir trouver un algorithme efficace pour ce problème. Malheureusement, le cas de la couverture minimale par les rectangles est NP-complète. &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme de recouvrement par des carrés&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet et le lien avec la couverture par les rectangles&lt;br /&gt;
*# Contourner la difficulté de la NP-complétude (heuristique ou cas des polygones orthogonalement convexes)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polygon_covering#cite_note-cr88-4  Couvertures de polygones (Wikipedia)]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/NP-completeness NP-complétude (Wikipedia)]]&lt;br /&gt;
** [[http://webdocs.cs.ualberta.ca/~joe/Preprints/Cover/paper.ps La couverture par rectangles est NP-complète]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires ===&lt;br /&gt;
&lt;br /&gt;
*Présentation : Emilien Boitouzet [[Fichier:VISI401-2022-Boitouzet.pdf]]&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
[[Fichier:automate_1.png]] [[Fichier:automate_2.jpeg]]&lt;br /&gt;
* Sujet : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser des calculs. Cependant les réalisations pratiques manquent, ce sujet se propose d’étudier l’utilisation des automates cellulaires dans les domaines suivant par exemple :&lt;br /&gt;
*# Modélisation des systèmes complexes (propagation des feux de forêt, processus de percolation, écoulement du sable ...)&lt;br /&gt;
*# Modélisation du comportement d&#039;un gaz&lt;br /&gt;
*# Système dynamique discret alternatif au modèle physique des équations aux dérivées partielles&lt;br /&gt;
*# Modélisation de la croissance de tissus cellulaires en biologie&lt;br /&gt;
*# Simulation de la croissance des cristaux&lt;br /&gt;
*# Correction automatique d’erreurs en imagerie&lt;br /&gt;
* Référence: https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
&lt;br /&gt;
=== Programmation bare-metal ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Andrien Montmayeur [[Fichier:VISI401-2022-Montmayeur.pdf]]&lt;br /&gt;
* Tuteur : Colin Weill-Duflos&lt;br /&gt;
* Sujet : l&#039;execution d&#039;un programme compilé peut parfois paraître un peu magique: on ne comprend pas forcément tout ce que fait le compilateur, et le système d&#039;exploitation fournit des abstractions bien pratiques. Comment se débrouille-t-on dans un contexte où il n&#039;y a pas de système d&#039;exploitation, comme certaines applications embarquées ou bien le système d&#039;exploitation lui-même?&lt;br /&gt;
* Objectifs : comprendre en détails la chaîne de compilation du C, l&#039;architecture d&#039;un executable et comment ce dernier est executé par une machine pour parvenir à faire executer un programme directement par un microprocesseur arm et interagir avec des périphériques simples.&lt;br /&gt;
* Référence:&lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Executable_and_Linkable_Format Architecture d&#039;un executable]&lt;br /&gt;
*#[https://aticleworld.com/c-compilation-process/ les étapes de compilation du C] (regarder notamment le linkage)&lt;br /&gt;
*# [https://azeria-labs.com/arm-data-types-and-registers-part-2/ débuter avec l&#039;assembleur arm]&lt;br /&gt;
&lt;br /&gt;
===GeoGebra et algèbre géométrique ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Nolann Sanmarti [[Fichier:VISI401-2022-Sanmarti.pdf]]&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Sujet : l&#039;algèbre géométrique émerge récemment comme un outil prometteur pour la synthèse d&#039;images : avec des points de contrôle, un produit, il est possible de représenter et de manipuler de manière efficace un ensemble d&#039;objets géométriques. Récemment, des bibliothèques c++ ont été développées. Ces bibliothèques autorisent une utilisation générique de l&#039;algèbre géométrique mais sont encore limitées par le manque d&#039;outils intéractifs adaptés. Par ailleurs, le logiciel de visualisation GeoGebra est un outil particulièrement utile pour la visualisation et la résolution de problèmes géométriques. Le but de ce projet serait de travailler un binding entre l&#039;algèbre géométrique et GeoGebra.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# se familiariser avec l&#039;algèbre géométrique, et l&#039;applet Javascript de GeoGebra,&lt;br /&gt;
*# identifier les objets et les opérations géométriques intéressantes à visualiser avec l&#039;algèbre géométrique,&lt;br /&gt;
*# implantations d&#039;une méthode générique permettant de générer des scripts dans l&#039;applet Javascript de GeoGebra.&lt;br /&gt;
* Références :&lt;br /&gt;
*# Projective geometric algebra: A new framework for doing euclidean geometry, Charles G. Gunn, 2019&lt;br /&gt;
*# [http://www.geogebra.org geogebra]&lt;br /&gt;
&lt;br /&gt;
== sujets 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
=== Comment Facebook gère ses données ?  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Pour une base de données, il est impossible d&#039;être cohérent, disponible tout le temps et partitionné. C&#039;est le fameux théorème CAP. Pour autant, les données de Facebook sont cohérentes, disponibles tout le temps, et réparties à travers le monde !? Impossible. Pour l&#039;étudiant, il faudra comprendre pourquoi c&#039;est impossible, et comment Facebook fait en pratique pour gérer ce problème.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le CAP théorème, et sa démonstration&lt;br /&gt;
*# Comprendre comment Facebook gère ce problème, et ses données d&#039;une manière générale&lt;br /&gt;
*# À définir, selon les questions que se pose l&#039;étudiant.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Théorème CAP :&lt;br /&gt;
*## https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_CAP&lt;br /&gt;
*## Brewer&#039;s Conjeture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services (https://awoc.wolski.fi/dlib/big-data/GiLy02-CAP.pdf)&lt;br /&gt;
*# Facebook Social Graph :&lt;br /&gt;
*## TAO : The power of the graph (https://engineering.fb.com/2013/06/25/core-data/tao-the-power-of-the-graph/)&lt;br /&gt;
*## TAO: Facebook’s Distributed Data Store for the Social Graph (https://www.usenix.org/system/files/conference/atc13/atc13-bronson.pdf)&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de calcul de l&#039;enveloppe convexe  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les ensembles convexes ont beaucoup de propriétés géométriques intéressantes, par exemple détecter la collision de deux ensembles convexes est &amp;quot;facile&amp;quot; algorithmiquement. Une étape fréquente dans beaucoup d&#039;algorithmes de traitements de données 2D/3D/nD est donc de calculer l&#039;enveloppe convexe d&#039;un nuage de points, c&#039;est-à-dire le plus petit ensemble convexe contenant ces points. Il existe de nombreux algorithmes de calcul d&#039;enveloppe convexe en 2D (Graham scan, Melkman, balayage de ligne (sweep-line), division-fusion, Chan&#039;s algorithm, Quickhull) et 3D (Chan&#039;s algorithm, Quickhull) et même nD (Quickhull notamment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
|Enveloppe convexe des points à coordonnées entières inclus dans une boule de diamètre 25&lt;br /&gt;
|----&lt;br /&gt;
[[Fichier:Qhull-25.png|300px]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Objectifs: il s&#039;agira de regarder quelques uns de ces algorithmes, d&#039;identifier leurs principales différences ainsi que leurs complexités théoriques et pratiques. On pourra aussi regarder plus précisément l&#039;algorithme Quickhull, dont l&#039;implémentation 2D est facile, et 3D accessible.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Barber, C. B., Dobkin, D. P., &amp;amp; Huhdanpaa, H. (1996). The quickhull algorithm for convex hulls. ACM Transactions on Mathematical Software (TOMS), 22(4), 469-483 [[https://www.researchgate.net/profile/Hannu_Huhdanpaa/publication/242414606_The_Quickhull_Algorithm_for_Convex_Hulls/links/54e5f6970cf2bff5a4f1e7db.pdf (PDF)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Graham_scan Algorithme de Graham (Wikipedia)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Convex_hull_algorithms Convex hull algorithms (Wikipedia)]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes autour des polyominos ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Un polyomino est une forme (sans trou) obtenue en collant des petits carrés de taille 1 par leurs bords. Des exemples connus sont par exemples les pièces du jeu tetris : il s&#039;agit de &amp;quot;tétramino&amp;quot;, c&#039;est à dire de polyomino formés de 4 carrés. Voici également les pentaminos, composés de 5 carrés :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:polyominos.png]]&lt;br /&gt;
&lt;br /&gt;
Une question récurrente est celle de la pavabilité : peut-on (en utilisant certains types de polyominos) paver un domaine donné.&lt;br /&gt;
Lorsque le domaine est fini, on peut utiliser une recherche exhaustive, mais lorsqu&#039;on veut paver tout le plan, le problème devient indécidable en général.&lt;br /&gt;
Nous nous intéresserons au cas le plus simple : est-il possible de paver le plan tout entier en utilisant des polyominos tous identiques, et en utilisant uniquement des translations.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pavages.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les définitions et notions de bases des polyominos, et en particulier leur représentation comme mot de contour&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance de polyominos en Python&lt;br /&gt;
*# comprendre la caractérisation des polyominos &amp;quot;exacts&amp;quot;, càd ceux qui pavent le plan&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance des polyominos exacts en Python&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Bibliographie initiale&lt;br /&gt;
*# [http://www.xprov.org/doc/these-XProvencal.pdf &amp;quot;Combinatoire des mots, géométrie discrète et pavages&amp;quot;], Xavier Provencal (chapitres 1 et 2)&lt;br /&gt;
*# [https://www.lama.univ-smb.fr/pagesmembres/vuillon/IanRAIRO.pdf &amp;quot;An algorithm for deciding if a polyomino tiles the plane by translation&amp;quot;], Ian Gambini et Laurent Vuillon&lt;br /&gt;
&lt;br /&gt;
=== Version algorithmique du lemme local de Lovász  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons un problème standard sur le routage de paquets dans des réseaux. Donnés un réseau et une collection de paquets, chacun venant avec un chemin dans le réseau (de la source vers la destination), le but est d’établir un planning qui minimise le temps pour que tous les paquets atteignent leur destination. Il est naturel de mesurer la qualité d’un tel planning en fonction de deux paramètres : la congestion c qui est le nombre maximum de paquets qui doivent emprunter une même arête du réseau et la dilatation d qui est le nombre maximum d’arêtes d’un chemin. En effet, il est facile de trouver un planning en temps c*d, et tout planning doit prendre comme temps au moins max(c,d). &lt;br /&gt;
&lt;br /&gt;
En 1994, Leighton, Maggsand et Rao ont montré qu’il existait toujours un planning en temps O(c+d). Malheureusement, ce résultat est basé sur le lemme local de Lovász. Il s’agit d’un résultat classique de combinatoire dont la preuve était à l’époque non constructive. Le problème précédent du routage de paquets n’est qu’une application de ce lemme parmi tant d’autres. En 2010, Moser et Tardos donnèrent un algorithme (en plus assez simple et efficace) pour le lemme local de Lovász.&lt;br /&gt;
&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le lemme local de Lovász et certaines de ses applications&lt;br /&gt;
*# Coder la version algorithmique de Moser et Tardos&lt;br /&gt;
*# Coder des applications du lemme (comme par exemple le routage de paquets)&lt;br /&gt;
* Bibliographie initiale : &lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Algorithmic_Lov%C3%A1sz_local_lemma Page wikipedia de la version algorithmique du lemme local de Lovász]&lt;br /&gt;
*# [http://www.scs.cmu.edu/afs/cs.cmu.edu/project/phrensy/pub/papers/LeightonMR94.pdf Application aux routage de paquets par Leighton, Maagsand et Rao]&lt;br /&gt;
*# [https://arxiv.org/pdf/0903.0544.pdf La version algorithmique du lemme local de Lovász par Moser et Tardos]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* Crypto-système de Merkle-Hellman et algorithme de Shamir, Ewan Rakotoanosy (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Reconstruction de surfaces à partir de nuages de points et de normales, Yohan Thépaut (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Algorithmes de super-résolution par apprentissage, Romain Théodet (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Autour de la question de la sensibilité des fonctions Booléennes, Christophe Carmagnac (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Structures de données purement fonctionnelles]], Loïc Dornel (Tuteur : Tom Hirschowitz)&lt;br /&gt;
* Automates cellulaires et décidabilité, Lucas Chardonnet (Tuteur : François Boussion)&lt;br /&gt;
&lt;br /&gt;
== sujets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
=== Crypto-système de Merkle-Hellman et algorithme de Shamir ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Le système de Merkle-Hellman est un système cryptographique de type &amp;quot;clé publique / clé privée&amp;quot;. Il a été inventé juste en 1978, après le système RSA (encore utilisé). Ce système a l&#039;avantage d&#039;être un peu plus simple, mais le **gros** désavantage d&#039;avoir été craqué par A. Shamir en 1984. L&#039;objectif est de comprendre le système, et la faille qu&#039;il contenait. Cela permettra de comprendre l&#039;algorithme de Shamir...&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Shamir, Adi (1984). &amp;quot;A polynomial-time algorithm for breaking the  basic Merkle - Hellman cryptosystem&amp;quot;. IEEE Transactions on Information  Theory. 30 (5): 699–704. doi:10.1109/SFCS.1982.5 [[http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.123.5840&amp;amp;rep=rep1&amp;amp;type=pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Reconstruction de surfaces à partir de nuages de points et de normales ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les lasers d&#039;acquisition de données 3d permettent de fabriquer des données qui approchent le bord d&#039;un objet 3D. Ces données sont souvent sous la forme d&#039;un nuage de points, doublé d&#039;un vecteur associé à chaque point et qui indique la direction normale à la surface de l&#039;objet. On parle de données de Hermite. Il existe des algorithmes dédiés, très efficaces et robustes, pour reconstruire une surface qui passe par ces points. L&#039;objectif est de comprendre les deux principales méthodes, l&#039;une appelée reconstruction de Poisson, l&#039;autre relié à la notion d&#039;indice (ou winding number), leurs qualités et leur défaut.&lt;br /&gt;
* Bibliographie initiale:&lt;br /&gt;
** KAZHDAN, Michael, BOLITHO, Matthew, et HOPPE, Hugues. Poisson surface reconstruction. In : Proceedings of the fourth Eurographics symposium on Geometry processing. 2006 [[http://faculty.cs.tamu.edu/schaefer/teaching/689_Fall2006/poissonrecon.pdf PDF]]&lt;br /&gt;
** BARILL, Gavin, DICKSON, Neil G., SCHMIDT, Ryan, et al. Fast winding numbers for soups and clouds. ACM Transactions on Graphics (TOG), 2018, vol. 37, no 4, p. 43. [[http://www.dgp.toronto.edu/projects/fast-winding-numbers/fast-winding-numbers-for-soups-and-clouds-siggraph-2018-compressed-barill-et-al.pdf]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de super-résolution par apprentissage ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La super-résolution consiste à, étant donné une image M x N, de fabriquer une image &amp;quot;zoomée&amp;quot; de taille kM x kN, où l&#039;information inventée est &amp;quot;crédible&amp;quot;. Le problème est évidemment mal posé mathématiquement, et du coup on rajoute de l&#039;information a priori : continuité des couleurs, continuité des structures géométriques, modèles probabilistes, moyennes non-locales (auto-similarités), etc. Avec l&#039;avènement du deep learning, des méthodes à base d&#039;apprentissage ont vu le jour. En gros, un réseau de neurones (CNN) apprend sur plein d&#039;images en &amp;quot;dézoomant&amp;quot; les images en entrées (facile, on sous-échantillonne), puis on utilise la fonction construite pour faire la super-résolution.&lt;br /&gt;
* L&#039;objectif est de regarder les méthodes de super-résolution, notamment celles par apprentissage et de voir leurs qualités et défauts. On pourra aussi les comparer avec des méthodes purement géométriques de super-résolution, ou des méthodes de moyennes non-locales.&lt;br /&gt;
* Ce sujet a été discuté avec Romain Théodet et conduit à un stage au LAMA pour combiner méthode géométrique et méthode par deep learning pour la super-résolution.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** SHI, Wenzhe, CABALLERO, Jose, HUSZÁR, Ferenc, et al. Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network. In : Proceedings of the IEEE conference on computer vision and pattern recognition. 2016. p. 1874-1883 [[https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf PDF]]?&lt;br /&gt;
** Lachaud, J.-O. and Kerautret, B., Geometric Total Variation for image vectorization, zooming and pixel art depixelizing, In : Proceedings of 5th Asian Conference on Pattern Recognition, 2019 [[Fichier:Paper-GTV.pdf]]&lt;br /&gt;
** [[https://github.com/kerautret/GTVimageVect Démos en ligne d&#039;algorithmes de super-résolution]]&lt;br /&gt;
&lt;br /&gt;
=== Autour de la question de la sensibilité des fonctions Booléennes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : On souhaite s’intéresser aux problèmes résolus par des algorithmes qui répondent par Vrai/Faux. Ces problèmes ont des entrées dans {0,1}^n (entrées codées en binaire) et une sortie dans {0,1) (Vrai ou Faux). Il est donc naturel de s’intéresser aux propriétés de ces fonctions Booléennes. Un certain nombre de paramètres intéressants ont été identifiés, comme la complexité du certificat (nombre minimal de bits nécessaires pour connaître la valeur de sortie), le degré (degré d’un polynôme qui correspond à la fonction sur les entrées Booléennes), la sensibilité (lnombre de bits qui, s’ils sont modifiés, impliquent une modification de la sortie), et bien d’autres (taille d’un arbre de décision, complexité en requêtes classiques ou quantiques, taille des coefficients de Fourier,…). En 1992, Nisan et Szegedy ont montré que tous ces paramètres sont reliés entre eux : si on connait l’un d’eux, par exemple le degré, on sait alors que n’importe quel autre de ces paramètres, par exemple la taille de l’arbre de décision, est limité à un certain intervalle de valeurs. Tous, sauf un : la sensibilité. Aucune méthode de preuve semblait impliquer que ce paramètre ne pouvait pas être beaucoup plus petit que les autres. Nisan et Szegedy posèrent alors la question de savoir si la sensibilité d’une fonction Bolléenne était reliée ou non aux autres paramètres classiques.&lt;br /&gt;
* Cet été, en 2019, un chercheur, Hao Huang, a montré dans une preuve de deux pages que la sensibilité ne pouvait pas être significativement plus petite que les autres paramètres, résolvant le problème posé 27 ans auparavant. Cette &amp;quot;sensitivity&amp;quot; conjecture a été attaquée en vain par de nombreux chercheurs renommés. Or, la nouvelle preuve est si simple qu’un chercheur l’a résumé en un [[https://twitter.com/BooleanAnalysis/status/1145837576487612416 tweet]].&lt;br /&gt;
* L&#039;objectif est de comprendre quels sont les paramètres classiques des fonctions Booléennes et des liens entre eux avant de s&#039;intéresser à la preuve de la conjecture. On pourra essayer de construire des fonctions extrémales (ie, avec des paramètres extrémaux dans leur plage de valeurs).&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** Le papier original où la question a été posée : N. Nisan, M. Szegedy. [[https://www.researchgate.net/profile/Mario_Szegedy/publication/2508255_On_the_Degree_of_Boolean_Functions_as_Real_Polynomials/links/09e41514878e7ef890000000.pdf On the degree of Boolean functions as real polynomials.]] Comput. Complexity, 4 (1992), 462–467.&lt;br /&gt;
** Une référence sur l&#039;analyse des fonctions Booléennes : Ryan O’Donnell. [[http://www.cs.tau.ac.il/~amnon/Classes/2016-PRG/Analysis-Of-Boolean-Functions.pdf Analysis of Boolean Functions]], Cambridge University Press, 2014  &lt;br /&gt;
** La preuve de la conjecture : Hao Huang. [[https://arxiv.org/abs/1907.00847 Induced subgraphs of hypercubes and a proof of the Sensitivity Conjecture]]. Annals of Mathematics, 190 (2019), 949-955&lt;br /&gt;
&lt;br /&gt;
=== Structures de données purement fonctionnelles ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;algorithmique est souvent enseignée sur des langages principalement impératifs tels que C. Les structures de données utilisées ne sont pas toujours évidentes à traduire vers les langages fonctionnels tels que OCaml. L&#039;étudiant s&#039;initiera aux structures de données fonctionnelles et aux concepts liés tels que la persistence, en suivant le livre « Purely functional data structures » d&#039;Okasaki.&lt;br /&gt;
* Liens&lt;br /&gt;
** [[https://www.cs.cmu.edu/~rwh/theses/okasaki.pdf La thèse d&#039;Okasaki (PDF)]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires et décidabilité ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Un automate cellulaire est un modèle de calcul discret, utilisé en dans différentes sciences (informatique, mathématiques, physique, biologie, etc;). Le jeu de la vie est l&#039;exemple emblématique d&#039;automate cellulaire. Les règles de calcul d&#039;un automate cellulaire, et de son évolution au cours du temps sont assez simples, mais mènent cependant à des problèmes complexes dont certains indécidables. Par exemple, déterminer si, étant donné des règles, on arrivera forcément, en un nombre fini d&#039;étapes, dans une configuration donné, quelque soit la configuration initiale (problème de nilopotence).&lt;br /&gt;
* L&#039;objectif est de s&#039;intéresser à ces problèmes indécidables dans les automates cellulaires et de produire un mini-cours sur le sujet.&lt;br /&gt;
* Références &lt;br /&gt;
** K. JARKKO, The nilpotency problem of one-dimensional cellular automata, SIAM J. Comput., Vol. 21, No. 3, pp. 571-586, June 1992.&lt;br /&gt;
** K. CULIK II, J. PACHL, S. Yu, On the limit sets ofcellular automata, SIAM J. Comput., 18 (1989), pp.831-842.&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le &amp;lt;b&amp;gt;lundi 27 mai&amp;lt;/b&amp;gt; de 9h à 11h en salle 115 du chablais.&lt;br /&gt;
Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Tristan_Porteries Tristan Porteries (PDF)]: problèmes avec mémoire restreinte, tuteur S. Tavenas&lt;br /&gt;
* R. Wagner: Reconstruction de surfaces à partir de nuages de points, tuteur J.-O. Lachaud&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Nils_Ruet Nils Ruet (PDF)]: LISP, tuteur P. Hyvernat&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Remy_Bouvier Rémy Bouvier (PDF)]: dancing links, tuteur P. Hyvernat&lt;br /&gt;
&lt;br /&gt;
== sujets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les sujets 1-3 sont encadrés par J.-O. Lachaud, les sujets 4-5 par P. Hyvernat, le sujet 6 par S. Tavenas.&lt;br /&gt;
Un encadrant encadre au max 2 étudiants.&lt;br /&gt;
&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;br /&gt;
# Une question naturelle est de savoir quels sont les problèmes qui peuvent être résolus avec un espace mémoire restreint. Plus formellement, on notera L l&#039;ensemble des problèmes que l&#039;on peut résoudre en utilisant seulement un espace mémoire logarithmique. On s&#039;intéresse à cette classe de problèmes, et plus particulièrement aux problèmes de connectivité dans un graphe.&lt;br /&gt;
#* [https://www.irif.fr/~sperifel/complexite.pdf Sylvain Périfel Complexité algorithmique] : Un livre récent qui survole une grosse partie de la complexité algorithmique. Le chapitre 4 concerne la complexité en espace.&lt;br /&gt;
#* [https://omereingold.files.wordpress.com/2014/10/sl.pdf Omer Reingold Undirected Connectivity in Log-Space]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le vendredi 25 mai 2018, à 9h. Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* ray-tracing au path-tracing, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Raphael_Tournafond.pdf Raphael Tournafond (PDF)]&lt;br /&gt;
* &amp;quot;dancing links&amp;quot; et NP complétude, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Ambroise_Decouttere.pdf Ambroise Decouttere (PDF)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
# Du ray-tracing au path-tracing: il s&#039;agit de comprendre l&#039;évolution des algorithmes de rendu (dits &amp;quot;réalistes&amp;quot;) et de mettre en avant les principales évolutions.&lt;br /&gt;
#* An introduction to ray tracing AS Glassner - 1989 - books.google.com&lt;br /&gt;
#* Energy redistribution path tracing, D Cline, J Talbot, P Egbert - ACM Transactions on Graphics (TOG), 2005 - dl.acm.org&lt;br /&gt;
#* et pour une introduction douce au ray-tracing: TP2 de http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO805/Tests/html/index.html&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; et NP complétude : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
#* [https://arxiv.org/pdf/1203.1895.pdf Classic Nintendo Games are (Computationally) Hard] : preuve que Super Mario et d&#039;autres jeux video classiques sont NP-complets &#039;&#039;Theoretical Computer Science, volume 586, 2015, pages 135–160.&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=16164</id>
		<title>VISI401 CMI : bibliographie scientifique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=16164"/>
		<updated>2026-01-07T16:00:27Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Synthèse de texture et transfert de texture par matelassage d&amp;#039;images */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable:&lt;br /&gt;
* 2017--2021 : Jacques-Olivier Lachaud&lt;br /&gt;
* 2022-- : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
Ce module amène l&#039;étudiant à effectuer des recherches bibliographiques sur un sujet donné, et à synthétiser ses résultats sous la forme d&#039;un exposé construit.&lt;br /&gt;
&lt;br /&gt;
L&#039;étudiant, à partir d&#039;un sujet et d&#039;un ou plusieurs articles initiaux, doit approfondir le sujet, appréhender son historique, ses évolutions, et son état actuel. &lt;br /&gt;
&lt;br /&gt;
A côté des ressources fournies par les bibliothèques, quelques pointeurs très utiles pour faire des recherches bibliographiques:&lt;br /&gt;
* [https://scholar.google.fr Scholar Google] (libre)&lt;br /&gt;
* [https://researchgate.net ResearchGate] (libre)&lt;br /&gt;
* [https://mathscinet.ams.org/mathscinet/ MashSciNet] (plus math)&lt;br /&gt;
* [https://www.springerlink.com  Springer] (accès via USMB)&lt;br /&gt;
* [https://www.sciencedirect.com Elsevier Sciencedirect] (accès via USMB)&lt;br /&gt;
* SciHub lorsqu&#039;on ne trouve pas&lt;br /&gt;
&lt;br /&gt;
La synthèse bibliographique se fait en interaction avec le tuteur par des visites régulières et/ou des compte-rendus d&#039;avancement par email. La synthèse finale fait l&#039;objet d&#039;un exposé final (15-20 minutes + questions) et d&#039;un document de présentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2025-2026 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Synthèse de texture et transfert de texture par matelassage d&#039;images]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; La synthèse de texture est le procédé qui vise à générer une nouvelle image à partir d&#039;une ou plusieurs (petites) images modèles, en donnant l&#039;impression que cette nouvelle image suit les propriétés structurelles, colorimétriques et statistiques de l&#039;image originelle. C&#039;est très utilisé en synthèse d&#039;image pour générer de grandes textures à partir de petits échantillons. On se propose d&#039;étudier et d&#039;implémenter un algorithme assez simple mais assez efficace appelé &amp;lt;i&amp;gt;image quilting&amp;lt;/i&amp;gt; pour faire de la génération de texture. Il se base sur de simples recherches de sous-images dans l&#039;image original, en superposant au mieux les sous-images. L&#039;algorithme peut même servir à du transfert de textures. Le langage de développement est au choix.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre la méthode d&#039;image quilting, voir le papier d&#039;Efros et Freeman, Siggraph&#039;2001&lt;br /&gt;
* implémenter dans un premier temps la méthode simple qui parcourt l&#039;image en scan-line et recherche la meilleure sous-image avec un overlap choisi.&lt;br /&gt;
* dans un 2e temps, implémenter la méthode de découpe optimale entre 2 sous-images superposées&lt;br /&gt;
* dans un 3e temps, implémenter le transfert de texture&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;References&#039;&#039;&#039;&lt;br /&gt;
* [[Efros et Freeman, Siggraph&#039;2001 http://graphics.cs.cmu.edu/people/efros/research/quilting.html]]&lt;br /&gt;
&lt;br /&gt;
=== [[le bytecode Python]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; Python est un langage &amp;quot;interprété&amp;quot;. Un programme Python n&#039;est jamais directement transformé en suite d&#039;instructions pour le processeur sur lequel il doit s&#039;exécuter. C&#039;est l&#039;interpréteur qui va, lors de l&#039;exécution, regarder les instructions Python pour les exécuter. Pour éviter que le passage par cet intermédiaire prenne trop de temps, le programme Python est d&#039;abord transformé en un &amp;quot;langage intermédiaire&amp;quot; appelé &amp;quot;bytecode&amp;quot;. Ce langage est une espèce de langage d&#039;assemblage propre à Python. Les instructions sont beaucoup plus simples à exécuter que les instructions &amp;quot;haut niveau&amp;quot; et sont identiques pour tous les processeurs.&lt;br /&gt;
&lt;br /&gt;
L&#039;outils principal pour étudier le bytecode python est le module &amp;lt;tt&amp;gt;dis&amp;lt;/tt&amp;gt; (comme &amp;lt;tt&amp;gt;dis&amp;lt;/tt&amp;gt;assembler) de la version usuelle de Python (CPython).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre la différence entre les langages compilé et interprétés&lt;br /&gt;
* comprendre globalement le mécanisme de transformation d&#039;un programme Python en bytecode&lt;br /&gt;
* étudier le bytecode produit sur des exemples particuliers et pertinents (&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;, concaténation, &amp;lt;tt&amp;gt;append&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== [[Peut-on calculer(efficacement) une transformation de Fourier Rapide sur GPU ]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Mouloud Kessar &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039;&lt;br /&gt;
En traitement du signal, ainsi que pour les simulations numériques, les transformations de Fourier rapides sont extrêmement répandues. L&#039;algorithme de Cooley-Tukey publié en 1965 réduit la complexité du calcul d&#039;une transformée de Fourier discrète à 0(nlog(n)), contre O(n2) pour une implémentation native. Sur CPU, la librairie la plus répandue est FFTW (Fastest Fourier Transform in the West). De nombreuses librairies existent sur GPU pour le calcul des FFT. Malgré tout, pour les simulations numériques en mécanique des fluides, ce sont les transformations de Fourier qui peuvent rendre délicat le portage de codes sur GPU.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* De comprendre les différences de la programmation sur GPU par rapport au CPU.&lt;br /&gt;
* Faire un travail bibliographique pour donner des perspectives d’améliorations dans le cas des FFT.&lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, on essaiera:&lt;br /&gt;
* de Paralléliser un code( c++) déjà existant à l&#039;aide d&#039;OpenMP&lt;br /&gt;
* de porter un code( c++) déjà existant sur GPU à l&#039;aide d&#039;OpenMP GPU&lt;br /&gt;
* de déterminer s&#039;il y a des contextes dans lesquels le code est plus efficace sur GPU ou CPU.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références:&#039;&#039;&#039;&lt;br /&gt;
* La page wikipedia des FFT https://fr.wikipedia.org/wiki/Transformation_de_Fourier_rapide&lt;br /&gt;
* les supports de cours de l&#039;IDRIS  http://www.idris.fr/formations/supports_de_cours.html&lt;br /&gt;
&lt;br /&gt;
== sujets 2024-2025 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes de colorations de graphes]] ===&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; Un [https://fr.wikipedia.org/wiki/Th%C3%A9orie_des_graphes graphe] est un ensemble de sommets et un ensemble d’arêtes sur ces sommets. Une [https://fr.wikipedia.org/wiki/Coloration_de_graphe coloration propre] d&#039;un graphe est une assignation de couleurs à chaque sommet du graphe telle que chaque paire de sommets reliée par une arête a des couleurs différentes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Graph.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Coloration.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Impropre.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Une coloration propre de ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Une coloration impropre du graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Connaître le nombre minimum de couleurs permettant de colorer proprement un graphe est un problème NP-difficile. Cependant, il existe des algorithmes de coloration de graphe permettant de trouver une coloration propre en fonction du nombre de voisins maximums d&#039;un sommet. L&#039;objectif de ce sujet est d&#039;implémenter certains de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter l&#039;algorithme de coloration glouton d&#039;un graphe&lt;br /&gt;
# implémenter l&#039;amélioration de cet algorithme en utilisant la dégénérescence du graphe&lt;br /&gt;
# implémenter l&#039;algorithme issus du théorème de Brooks&lt;br /&gt;
# éventuellement, implémenter un algorithme de coloration d&#039;arêtes&lt;br /&gt;
# éventuellement, implémenter un algorithme de transformation du problème SAT en problème de coloration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de Ukkonen / algorithme SA-IS]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; L&#039;arbre des suffixes est une structure de données qui permet de répondre très rapidement à de nombreuses requêtes du style &amp;quot;est-ce que la chaine &#039;&#039;p&#039;&#039; apparait dans la chaine &#039;&#039;S&#039;&#039; ?&amp;quot; La chaine &#039;&#039;p&#039;&#039; pourrait être une &amp;quot;petite&amp;quot; chaine de quelques milliers de caractères, alors que la chaine &#039;&#039;S&#039;&#039; pourrait être une &amp;quot;grosse&amp;quot; chaine de plusieurs milliard de caractères. Lorsque la chaine &#039;&#039;S&#039;&#039; est fixe, cette recherche se fait en un temps proportionnel à la taille de &#039;&#039;p&#039;&#039;, indépendamment de la taille de &#039;&#039;S&#039;&#039; ! Ce qui rend ceci possible est le précalcul de l&#039;arbre des suffixes de &#039;&#039;S&#039;&#039;, une fois pour toute. Si on fait ce précalcul de manière naïve, il prend un temps proportionnel à la taille de &#039;&#039;S&#039;&#039; &#039;&#039;&#039;au carré&#039;&#039;&#039;. Lorsque &#039;&#039;S&#039;&#039; contient des milliards de caractéres, ceci n&#039;est pas raisonnable.&lt;br /&gt;
&lt;br /&gt;
L&#039;algorithme de Ukkonen permet de calculer l&#039;arbre des suffixes en un temps proportionnel à la taille de &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# comprendre la structure d&#039;arbre des suffixes&lt;br /&gt;
# coder une version naïve du calcul de l&#039;arbre des suffixes&lt;br /&gt;
# comprendre et coder une version de l&#039;algorithme de Ukkonen, et comparer les temps de calcul&lt;br /&gt;
# si le temps le permet, comprendre l&#039;algorithme SA-IS qui permet de construite le tableau des suffixes en un temps proportionnel à la taille de &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# les [https://www.youtube.com/playlist?list=PL2mpR0RYFQsDFNyRsTNcWkFTHTkxWREeb vidéos de Ben Langmead] sur les arbres de suffixes (vidéos 1 -- 9)&lt;br /&gt;
# description de l&#039;algoritme de Ukkonen dans Dan Gusfield, &#039;&#039;Algorithms on Strings, Trees and Sequences&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Approximations d&#039;Euler et Runge-Kutta pour la modélisation du problème à 3 corps===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
en astronomie, la modélisation du problème à N corp est un enjeu majeur. Il est indispensable pour l&#039;exploration spatiale, notamment pour l&#039;envoie de sonde sur Mars, ou&lt;br /&gt;
Titan (Lune de Jupiter).&lt;br /&gt;
&lt;br /&gt;
Les équations décrivant le problème à N corps existent depuis de nombreuses années, mais les mathématiciens et les physiciens ne savent pas les résoudre analytiquement.&lt;br /&gt;
&lt;br /&gt;
Des codes de calcul existent pour réaliser des simulations du système solaire.&lt;br /&gt;
&lt;br /&gt;
D&#039;un point de vue algorithmique, le point clef se situe dans l&#039;approximation choisie pour les dérivées en temps.&lt;br /&gt;
&lt;br /&gt;
Une approximation à l&#039;aide d&#039;une méthode type Euler ou Runge-Kutta va avoir un ordre de précision prédéfini.&lt;br /&gt;
&lt;br /&gt;
Toutes ces approximations ne se valent pas, et une analyse rigoureuse de la fiabilité de ces méthodes est nécessaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; il n&#039;est pas nécessaire de connaître les méthodes numériques au préalables car elles seront introduites et développées dans un cadre simple au fur et à mesure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre le fonctionnement de l&#039;approximation d&#039;une dérivée par une méthode numérique (type Euler et Runge-Kutta d&#039;ordre 2)&lt;br /&gt;
* Développer  un programme permettant de  prédire les mouvements des corps suivants: Jupiter, La Terre, et Le Soleil&lt;br /&gt;
* Mesurer l&#039;ordre de précision des deux méthodes numériques implémentées, et comparer à l&#039;ordre théorique.&lt;br /&gt;
* Si le temps le permet:&lt;br /&gt;
** Ajouter les schémas  Runge-Kutta 4 et 6&lt;br /&gt;
** modifier le code pour inclure Mars, Venus et Mercure&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
# La formulation générale du problème à N-corp est donnée ici: https://en.wikipedia.org/wiki/N-body_problem&lt;br /&gt;
# Ce type d&#039;étude peut devenir autrement plus complexe que la version présentée ici. Dans le film &amp;quot;The Martian&amp;quot; , un astronaute est piégé sur Mars, et son équipe qui était en route pour la terre doit venir le récupérer. Le centre de calcul &amp;quot;Pléiades&amp;quot; de la NASA est présenté, et utilisé pour déterminer s&#039;il est possible de renvoyer le vaisseau spatial récupérer l&#039;astronaute, notamment à l&#039;aide d&#039;une fronde gravitationnelle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Programmation graphique sur GPU]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé et objectifs :&#039;&#039;&#039; les cartes graphiques modernes permettent l&#039;affichage de millions de polygones avec des rendus presque réalistes en temps réel.&lt;br /&gt;
L&#039;objectif de ce sujet est de découvrir la modélisation 3D, puis les programmations spécifiques des vertex et fragment shaders pour réaliser certains types d&#039;effet (camera,&lt;br /&gt;
transformations géométriques, illumination, textures, halos, stylisations, incrustations).&lt;br /&gt;
Le pipeline OpenGL sera étudié, et accédé via WebGL/javascript/three.js. Dans une 2eme partie, certains shaders de shadertoy.com seront étudiés plus en détails, afin de&lt;br /&gt;
comprendre les nombreuses astuces utilisées par les experts du domaine pour faire des effets impressionnants en temps réel.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque :&#039;&#039;&#039; sujet discuté avec Vetea Stoll&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Magic Numbers et Jeux Vidéo]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé et objectifs :&#039;&#039;&#039; les magic numbers sont souvent considérés comme une mauvaise pratique en&lt;br /&gt;
programmation. Cependant, l&#039;algorithme emblématique de la racine carrée inverse rapide,&lt;br /&gt;
utilisé dans les moteurs de jeux vidéo comme Quake III Arena, justifie&lt;br /&gt;
l&#039;utilisation du fameux 0x5f3759df.&lt;br /&gt;
Ce sujet propose d&#039;étudier cet algorithme, ainsi que des sujets connexes.&lt;br /&gt;
&lt;br /&gt;
Travail à réaliser :&lt;br /&gt;
* Expliquer le fonctionnement détaillé de l&#039;algorithme.&lt;br /&gt;
* Comparer avec la méthode de Newton-Raphson&lt;br /&gt;
* Expliquer les applications pratiques&lt;br /&gt;
* Comparer les performances en temps d&#039;exécution et en mémoire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Indexation dans les Bases de Données]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sujet :&#039;&#039;&#039; en bases de données, les index sont essentiels pour accélérer les requêtes,&lt;br /&gt;
mais ils impliquent des compromis entre performance, espace et coût de&lt;br /&gt;
maintenance.&lt;br /&gt;
Dans ce sujet, vous étudierez les types d&#039;index (B-tree, Hash, etc.), leur&lt;br /&gt;
impact sur les requêtes et les modifications (``INSERT``, ``UPDATE``, ``DELETE``).&lt;br /&gt;
&lt;br /&gt;
Travail à réaliser :&lt;br /&gt;
* Expliquer les structures d’index (B-tree, Hash).&lt;br /&gt;
* Expliquer les différents cas d&#039;usage&lt;br /&gt;
* Expliquer l’impact des index sur les performances des requêtes (``SELECT WHERE``).&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ressource pour commencer :&#039;&#039;&#039;&lt;br /&gt;
# &amp;quot;Bases de données : concepts, utilisation et développement&amp;quot;, Jean-Luc Hainaut, chapitre 4 (disponible à la BU)&lt;br /&gt;
&lt;br /&gt;
== sujets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Génération de labyrinthes &amp;quot;organiques&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; la génération de labyrinthes est un problème classique, notamment abordé dans les cours d&#039;algorithmes de graphes. Ces méthodes permettent de générer des labyrinthes sur des &#039;&#039;grilles&#039;&#039;, typiquement carrées :&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze_grid.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
La création de labyrinthe &amp;quot;organiques&amp;quot;, du style&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
utilise une méthode très différente. Les détails sont décrits dans un article publié en  2006: http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf. La description peut sembler très abstraite, mais l&#039;idée initiale est assez simple : une courbe initiale est, petit à petit, déformée aléatoirement.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; comprendre la méthode de base, et l&#039;implémenter pour générer des labyrinthes organiques. La première version pourra être codée en Python, mais comme la méthode nécessite une &#039;&#039;grosse&#039;&#039; quantité de calculs, il pourra être intéressant de coder une seconde version en utilisant un langage compilé si l&#039;on souhaite obtenir de &amp;quot;gros&amp;quot; labyrinthes. De nombreuses améliorations sont décrites dans l&#039;article de H. Pedersen et K. Singh, et il serait intéressant de d&#039;en implémenter certaines, soient en Python (en les testant sur de petits labyrinthes) soit dans un autre langage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039; Hans Pedersen et Karan Singh, &#039;&#039;Organic Labyrinths and Mazes&#039;&#039;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== Tramage artistique d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le tramage d&#039;une image (en anglais *dithering* ou *half-toning*) consiste à esquisser une image en niveaux de gris ou en couleur à l&#039;aide de très peu d&#039;encres ou couleurs différentes. Historiquement, l&#039;utilisation la plus courante est en impression: un fax ne dispose que d&#039;une encre noire (donc 2 couleurs noir et blanc pour transférer une image), les imprimantes n&#039;ont que 4 encres (et donc cinq couleurs jaune, cyan, magenta, noir et le blanc du papier). Les premiers ordinateurs avaient des écrans avec très peu de couleurs, donc les photos étaient approchées avec 8 ou 16 couleurs. &lt;br /&gt;
&lt;br /&gt;
En informatique, les algorithmes de tramage par diffusion d&#039;erreur [https://fr.wikipedia.org/wiki/Algorithme_de_Floyd-Steinberg#:~:text=L%27algorithme%20de%20Floyd%2DSteinberg,un%20pixel%20à%20ses%20voisins. Floyd-Steinberg] sont faciles à implémenter et rapide, donc très utilisés.&lt;br /&gt;
&lt;br /&gt;
Néanmoins, il existe des algorithmes qui donnent des résultats beaucoup plus jolis, notamment celui proposé par Ostromoukhov et Hersch (1999). Nous proposons de l&#039;étudier et de l&#039;implémenter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-david.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-photo.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Floyd-Steinberg&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Ostromoukhov-Hersch&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre les principes du tramage, éventuellement coder en python/opencv l&#039;algorithme basique. Comprendre ensuite l&#039;algorithme d&#039;Ostromoukhov et Hersch (1999), et l&#039;implémenter en python, d&#039;abord en noir et blanc, et si le temps le permet, en couleur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://dl.acm.org/doi/pdf/10.1145/311535.311605 Ostromoukhov et Hersch, Multi-Color and Artistic Dithering, ACM SIGGRAPH 1999]&lt;br /&gt;
* [https://opencv.org OpenCV], pratique pour lire une image, l&#039;afficher, faire des traitements.&lt;br /&gt;
&lt;br /&gt;
=== Rendu réaliste de scènes 3D par lancer de rayons ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note : &#039;&#039;&#039; Sujet demandé par Lukas Rey.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le rendu réaliste de scène 3D a été (et reste) un des objectifs majeurs de l&#039;informatique graphique, notamment grâce à ses nombreuses applications dans différents domaines : le cinéma (effets spéciaux), mais aussi le marketing, la publicité, l&#039;architecture, ou l&#039;art. L&#039;algorithme le plus utilisé est appelé &amp;quot;lancer de rayons&amp;quot;, avec un objectif de simuler le trajet des rayons lumineux dans une scène 3D afin de déterminer les couleurs perçues par un observateur. Plutôt que de calculer tous les rayons lumineux d&#039;une scène, cet algorithme calcule seulement le trajet inverse des rayons lumineux qui arrivent dans l&#039;oeil de l&#039;observateur, ce qui est beaucoup plus économique. On verra que cet algorithme permet de simuler des matériaux réfléchissants ou (semi-)transparents, de calculer des ombres portées, de simuler du brouillard...&lt;br /&gt;
&lt;br /&gt;
[[file:ray-tracing.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Il s&#039;agit de comprendre d&#039;où vient la couleur perçue d&#039;un objet, d&#039;implémenter l&#039;algorithme récursif classique du lancé de rayons, au moins avec des objets simples (sphères, tétraèdres), et de voir comment optimiser les calculs (car ça devient vite coûteux). On pourra s&#039;appuyer sur ce [https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html TP] pour l&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://en.wikipedia.org/wiki/Ray_tracing_(graphics)&lt;br /&gt;
* https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html&lt;br /&gt;
&lt;br /&gt;
=== Rendu temps réel avec OpenGL ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Colin Weill-Duflos&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; On cherche à utiliser une API graphique (OpenGL) afin de faire du rendu de scène 3d en utilisant la carte graphique. Cela permet d&#039;utiliser les techniques de rendu 3d en temps réel (rastérisation) et de les faire effectivement fonctionner en temps réel, permettant d&#039;afficher une scène avec laquelle on peut intéragir : en déplaçant la caméré, en bougeant des éléments...&lt;br /&gt;
Ces techniques ont déjà été utilisée dans des années précédentes, sans utiliser la carte graphique (le résultat était assez lent). Grâce à OpenGL, la plupart de ces opérations peuvent s&#039;effectuer sur la carte graphique, ce qui permet de ne pas avoir à en recoder une partie (grâce à des composants capables de faire uniquement ces opérations) et d&#039;être plus rapide.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre les techniques de raterisation&lt;br /&gt;
* comprendre la pipeline OpenGL&lt;br /&gt;
* implémenter une scène avec un objet et une caméra controlable&lt;br /&gt;
* rajouter des shaders pour simuler la lumière (Phong shading), variantes stylisées (Toon shading)&lt;br /&gt;
* rajouter des textures sur la scène&lt;br /&gt;
* faire des shadow maps pour les ombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [Travaux précédents](http://os-vps418.infomaniak.ch:1250/mediawiki/images/0/0d/Gossin-2023.pdf)&lt;br /&gt;
* [Pipeline OpenGL](https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview)&lt;br /&gt;
* [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
* [Toon shading](https://fr.wikipedia.org/wiki/Ombrage_de_cellulo%C3%AFd)&lt;br /&gt;
* [Shadow maps](https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping)&lt;br /&gt;
&lt;br /&gt;
=== Problèmes indécidables ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Quand on a un calcul à faire, on peut se demander de la meilleure implémentation pour faire faire ce calcul par un ordinateur. On pense généralement moins à la question - pourtant primordiale - de savoir si ce calcul peut être effectué par l’ordinateur. Pourtant, on sait depuis l’origine de l’informatique qu’il existe des fonctions que l’on ne peut pas calculer à l’aide d’un ordinateur.  On cherchera à comprendre ce que serait un programme qui résoudrait le problème de l’arrêt et pourquoi, il ne marchera pas. On pourra se demander alors s’il y a un lien entre les différents problèmes non-calculables : avec une librairie qui résout le problème de l’arrêt, peut-on écrire un problème qui résout le problème de correspondance de Post ? Peut-on imaginer un problème qu’on ne pourrait pas résoudre même si on avait une fonction qui résolvait le problème de l’arrêt ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de fonction calculable (et donc de fonction non-calculable). Donner des exemples. &amp;quot;Coder&amp;quot; l’argument diagonal de la non-calculabilité de l’arrêt. Coder une réduction entre deux problèmes non-calculables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Th%C3%A9orie_de_la_calculabilit%C3%A9 Wikipédia - Théorie de la calculabilité]&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_l%27arr%C3%AAt Wikipédia - Problème de l&#039;arrêt]&lt;br /&gt;
* [https://ludovicpatey.com/courses/comp-thy-2023/cr11-fr.pdf Livre récent en français sur la théorie de la calculabilité]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Réseaux de neurones et apprentissage ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; sujet demandé par Elliot Moiroud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
# se familiariser avec les concepts utilisés en apprentissage,&lt;br /&gt;
# essayer d&#039;implémenter une version ultra simple de la procédure d&#039;apprentissage,&lt;br /&gt;
# utiliser une bibliothèque existante sur quelques exemples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
# http://neuralnetworksanddeeplearning.com/&lt;br /&gt;
&lt;br /&gt;
=== Synchronisation dans les Systèmes Distribués ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; l&#039;algorithme de Lamport joue un rôle crucial dans la synchronisation des horloges dans un réseau de machines qui ne sont pas nécessairement précises ou synchronisées entre elles. Il permet de créer un consensus sur l&#039;ordre des événements dans un système distribué, où la communication peut être retardée ou désordonnée. Cette capacité est fondamentale pour assurer la cohérence et la fiabilité des opérations dans des environnements distribués, tels que les bases de données distribuées, les systèmes de fichiers en réseau et les applications de blockchain. Après avoir maîtrisé l&#039;algorithme de Lamport, l&#039;étudiant pourra les fautes byzantines pour comprendre comment les systèmes distribués gèrent les informations contradictoires ou erronées transmises par différents nœuds du réseau.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Analyser et comprendre l&#039;algorithme de Lamport pour la synchronisation des horloges.&lt;br /&gt;
# (Examiner les fautes byzantines et leur influence sur la stabilité des systèmes distribués.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Time, Clocks, and the Ordering of Events in a Distributed System.&lt;br /&gt;
https://lamport.azurewebsites.net/pubs/time-clocks.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation dynamique et complexité ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; La programmation dynamique est sans doute une des techniques de programmation qui porte le plus mal son nom.  Elle s&#039;applique lorsqu&#039;un problème peut se décomposer en sous-problèmes, dont les solutions peuvent être combinées. Dans le cas relativement simples où les sous-problèmes sont toujours disjoint, on utilise une approche de type &amp;quot;diviser pour rêgner&amp;quot;. Lorsque ce n&#039;est pas le cas, il faut faire attention à ne pas dupliquer les calculs. Les deux approches habituelles sont :&lt;br /&gt;
# la &amp;quot;mémoization&amp;quot;, qui consiste à sauvegarder toutes les solutions trouvées pour éviter de les recalculer,&lt;br /&gt;
# la &amp;quot;programmation dynamique&amp;quot; qui consiste à faire les solutions dans le &amp;quot;bon ordre&amp;quot; afin de ne jamais avoir besoin d&#039;une solution qui n&#039;aurait pas été calculée.&lt;br /&gt;
&lt;br /&gt;
Ces techniques permettent en général d&#039;obtenir un algorithme beaucoup plus rapide que la version naïve.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# étudier les méthodes de &amp;quot;mémoization&amp;quot; et &amp;quot;programmation dynamique&amp;quot; sur plusieurs exemples et les comparer&lt;br /&gt;
# mettre en évidence les complexités &amp;quot;pratiques&amp;quot; de ces algorithmes au moyen de benchmarks pertinents&lt;br /&gt;
# comprendre les calculs &amp;quot;théoriques&amp;quot; de la complexité de ces algorithmes pour vérifier que les prédictions correspondent à la pratique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;Introduction à l&#039;algorithmique&amp;quot;, T. Cormen, C. Leiserson, R. Rivest, C. Stein&lt;br /&gt;
# la page wikipedia française : https://fr.wikipedia.org/wiki/Programmation_dynamique&lt;br /&gt;
&lt;br /&gt;
== sujets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
=== algorithmes de recherche de chaines ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : rechercher si une chaine &#039;&#039;s1&#039;&#039; apparait à l&#039;intérieur d&#039;une chaine &#039;&#039;s2&#039;&#039; est assez simple, mais l&#039;algorithme naïf n&#039;est pas très rapide. L&#039;objectif de ce sujet est de s&#039;intéresser à certains algorithmes de recherche de sous-chaines plus efficaces. Le plus simple est probablement l&#039;algorithme KMP (du noms de ses inventeurs : Knuth, Morris et Pratt) qui évite des comparaisons inutiles de l&#039;algorithme naïf. L&#039;algorithme de Boyer-Moore utilise des idées similaires mais considère la sous-chaine (&#039;&#039;s1&#039;&#039;) à l&#039;envers, ce qui lui permet d&#039;aller en général plus vite. Ces algorithmes restent assez lents lorsque la chaine &#039;&#039;s2&#039;&#039; est très grande. C&#039;est par exemple le cas en bio-informatique lorsque l&#039;on doit rechercher des chaines dans le génome. Dans ce cas, la chaine &#039;&#039;s2&#039;&#039; est fixe et on rercherche de nombreuses sous-chaines &#039;&#039;s1&#039;&#039;. Il est alors possible de faire un &#039;&#039;pré-traitement&#039;&#039; pour faire une recherche beaucoup plus rapide qui ne dépend pas de la taille de &#039;&#039;s2&#039;&#039; !&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de quelques uns de ces algorithmes&lt;br /&gt;
*# les implémenter (par exemple en Python)&lt;br /&gt;
*# essayer de les comparer&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
# https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm&lt;br /&gt;
# transformé de Burrows-Wheeler et recherche de sous-chaines https://www.youtube.com/watch?v=P3ORBMon8aw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== génération de labyrinthes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : il existe de nombreuses méthodes algorithmiques pour générer des labyrinthes aléatoires. La plupart de ces méthodes sont expliquées sur des grilles carrées mais il est possible de les implémenter sur d&#039;autres types de grilles. Il est possible des les adapter par exemple pour générer des labyrinthes circulaires, cylindriques, ou sphériques ; ou bien des labyrinthes en plusieurs parties (de grandes pièces contenant des labyrinthes, reliées par des couloirs formant un autre labyrinthe).&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de plusieurs algorithmes de génération de labyrinthes&lt;br /&gt;
*# les étendres à des grilles plus intéressantes&lt;br /&gt;
*# &#039;&#039;expérimenter et chercher des manières simples de générer un labyrinthe &amp;quot;continu&amp;quot;&#039;&#039; (La solution décrite dans &amp;quot;How to Generate Perfect Mazes?&amp;quot; est probablement un peu trop complexe.)&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** le livre &amp;quot;Mazes for programmers&amp;quot;, https://pragprog.com/titles/jbmaze/mazes-for-programmers/&lt;br /&gt;
** l&#039;article &amp;quot;How to Generate Perfect Mazes?&amp;quot;, https://hal.uca.fr/hal-03174952/file/article-journal-2020.pdf&lt;br /&gt;
** l&#039;article &amp;quot;Organic Labyrinths and Mazes&amp;quot;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== L’infâme GOTO ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : L’instruction goto n’a aujourd’hui plus la côte parmi les informaticiens, et est souvent considérée comme une instruction à bannir. L&#039;idée est d&#039;explorer ce que permet cette instruction, et comment a évolué son utilisation.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# remplacer des structures de contrôles simples simples par des goto&lt;br /&gt;
*# faire un programme plus complexe utilisant un maximum de goto&lt;br /&gt;
*# expliquer l&#039;évolution de l&#039;utilisation du goto&lt;br /&gt;
*# avantages/inconvénients de son utilisation&lt;br /&gt;
*# comparaison des langages prenant en charge ou non cette instruction et pourquoi&lt;br /&gt;
*# utilisation actuelle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Blockchains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : les blockchains sont de plus en plus populaires, utilisées initialement pour les cryptomonnaies, elles peuvent être utilisées pour stocker des données, gérer les contrats intelligents, etc.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre le fonctionnement des blockchains (par exemple avec l&#039;article de Satoshi Nakamoto)&lt;br /&gt;
*# implémenter une blockchaine&lt;br /&gt;
*# ...&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de reconstruction de surfaces à partir d&#039;images 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les images 3D sont devenues courantes avec les outils d&#039;acquisition comme les scanners X ou les scanners IRM. On peut aussi modéliser des objets 3D sous forme de volumes, pour ensuite en extraire des surfaces (e.g. modélisation de fluides, de feu ou de fumées). Un enjeu est de pouvoir construire des surfaces qui représentent le bord d&#039;objets d&#039;intérêt dans ces données volumiques. Les algorithmes les plus classiques reconstruisent une surface composée de triangles qui approchent un niveau de gris donné dans le volume 3D :  c&#039;est une iso-surface, comparable à une courbe d&#039;iso-altitude dans une carte topographique, mais en 3D ! On  s&#039;intéreressera à deux algorithmes particulièrement : le marching-tetrahedra et le marching-cubes.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre ce qu&#039;est une iso-surface dans une image 3D ou dans une fonction implicite.&lt;br /&gt;
*# Comprendre les points communs et différences des algorithmes Marching Tetrahedra et Marching Cubes&lt;br /&gt;
*# Implémenter un des deux algorithmes. On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python. &lt;br /&gt;
*# On lira des fichiers .vol pour les images 3D, qui vous seront fournies.&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_tetrahedra Marching Tetrahedra sur wikipedia]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_cubes Marching Cubes sur wikipedia]&lt;br /&gt;
** [https://dl.acm.org/doi/pdf/10.1145/37402.37422 Lorensen, Cline, Marching cubes: a high resolutions 3D surface construction algorithm, Computer Graphics, 21(4), 1987]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-slices.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-isosurface.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Coupes dans une image 3D &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Isosurface dans cette image &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Invitation à la complexité algorithmique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
* Résumé : on abordera le thème de la complexité algorithmique : étant donné un programme implémentant une fonction, peut-on borner son temps de calcul en fonction de la taille de ses entrées. On procédera par l&#039;exemple, en tentant de confirmer la théorie par des expériences concrets de petits programmes (par exemple en Python). Comme point d&#039;entrée, on pourra par exemple examiner les différences de complexité entre quelques algorithmes de tri.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre l&#039;intérêt de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;,&lt;br /&gt;
*# se familiariser avec les notions et notations utilisées pour décrire la complexité en temps de calcul (ou en mémoire) des algorithmes,&lt;br /&gt;
*# apprendre à vers de &amp;quot;benchmarks&amp;quot; pour évaluer l&#039;efficacité réelle d&#039;une fonction dans un langage de programmation,&lt;br /&gt;
*# comprendre les limites de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== sujets 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
===Rust et la notion d&#039;appartenance (&amp;quot;ownership&amp;quot;)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Théo Connetable : [[Fichier:VISI401-2022-Connetable.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : dans la plupart des langages &amp;quot;haut niveau&amp;quot; (Python, Java, Javascript, ...), la mémoire est gérée automatiquement. Par exemple, Python détecte qu&#039;une liste ne sert plus à rien pour libérer la mémoire qu&#039;elle occupait. Dans les langages &amp;quot;bas niveau&amp;quot; (C), c&#039;est au programmeur de libérer explicitement la mémoire qu&#039;il utilise. (S&#039;il ne le fait pas, son programme risque d&#039;avoir des &amp;quot;fuites de mémoire&amp;quot;.) Rust est un nouveau (première version en 2010) langage de programmation. Un des objectifs de Rust est d&#039;offrir des garanties de sécurité sur la mémoire avec la notion d&#039;appartenance. Ces garanties sont testées à la compilation et ne dégradent donc pas l&#039;efficacité du programme final.&lt;br /&gt;
* Objectifs : l&#039;objectif, après s&#039;être familiarisé avec le langage Rust, est de comprendre à quoi correspond la notion de &amp;quot;ownership&amp;quot; (&amp;quot;appartenance&amp;quot;) et de l&#039;illustrer sur quelques exemples. Si l&#039;étudiant ne les connait pas, les notions de pointeurs (en C), d&#039;allocation sur la pile, sur le tas, et le concept de &amp;quot;ramasse miettes&amp;quot; (garbage collector&amp;quot; en anglais) seront des étapes préliminaires importantes.&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# The Rust Programming Language https://doc.rust-lang.org/book/title-page.html, avec en particulier la section 4, &amp;quot;Understanding Ownership&amp;quot;&lt;br /&gt;
*# Safe Systems Programming in Rust https://cacm.acm.org/magazines/2021/4/251364-safe-systems-programming-in-rust/fulltext&lt;br /&gt;
*# Rust Ownership by Example https://depth-first.com/articles/2020/01/27/rust-ownership-by-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Bitcoin &amp;amp; blockchain===&lt;br /&gt;
* Présentation : Baptiste Griva [[Fichier:VISI401-2022-Griva.pdf]]&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Les blockchain sont de plus en plus populaires. Avec l&#039;article de Satoshi Nakamoto, l&#039;étudiant devra comprendre son fonctionnement. On pourra dans un second temps s&#039;intéresser aux attaques habituelles face à une blockchain.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre le fonctionnement de la blockchain bitcoin&lt;br /&gt;
*# S&#039;intéresser à ses vulnérabilités (51% attack,...)&lt;br /&gt;
* Références: pour commencer https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
===Débruitage d&#039;image===&lt;br /&gt;
* Présentation : Lucas Policastro [[Fichier:VISI401-2022-Policastro.pdf]]&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La plupart des procédés d&#039;acquisition d&#039;image (typiquement capteurs CCD ou CMOS des caméras ou téléphones) ne sont pas parfaits et introduisent du bruit (des perturbations) dans les images résultantes. Ce bruit ressemble en général à une perturbation aléatoire locale par capteur, indépendante de ce  qui se passe sur un capteur proche. Peut-on alors améliorer la qualité visuelle d&#039;une photo dégradée par un tel bruit (typiquement gaussien) ? On regardera notamment les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
*# On pourra s&#039;appuyer sur les démos IPOL en ligne de ces algorithmes et leur description. http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
*# L&#039;algorithme des moyennes non locales est implémentable relativement facilement (même en numpy).&lt;br /&gt;
* Références:&lt;br /&gt;
** http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
** Le site https://www.ipol.im contient plein d&#039;algos de restauration d&#039;image (suivre Enhancement &amp;amp; Restoration, puis Denoising).&lt;br /&gt;
&lt;br /&gt;
===Sécurité des cartes RFID : le cas Mifare===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Paul Aubry [[Fichier:VISI401-2022-Aubry.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : les cartes RFID (Radio Frequency IDentification) sont des cartes à puce qui peuvent communiquer avec un lecteur distant (mais proche). De nombreuses cartes de transport en commun ou d&#039;ouverture de portes utilisent cette technologie. La carte Mifare classic, très répandue, utilise un protocole cryptographique pour éviter les &amp;quot;replay attacks&amp;quot; (enregistrer un échange pour le réutiliser) et le clonage de la carte. Le détails du protocole est longtemps resté un secret industriel, mais ceci n&#039;a pas empéché la découverte de *grosses* failles. Il est maintenant possible de cloner une carte Mifare en quelques secondes avec du matériel grand public.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre fonctionne la protection contre les &amp;quot;replay attacks&amp;quot; à partir de challenges cryptographiques&lt;br /&gt;
*# comprendre le protocole Mifare classic&lt;br /&gt;
*# comprendre les attaques sur le protocole&lt;br /&gt;
*# expérimenter avec des puces RFID existante *(facultatif)*&lt;br /&gt;
*# regarder les évolutions du protocole pour se protéger de ces attaques&lt;br /&gt;
* Référence : F. D. Garcia, P. van Rossum, R. Verdult, R. Wichers Schreur : &amp;quot;Wirelessly Pickpocketing a Mifare Classic Card&amp;quot; https://www.cs.ru.nl/~flaviog/publications/Pickpocketing.Mifare.pdf&lt;br /&gt;
&lt;br /&gt;
===Ingénierie Dirigée par les Modèles (IDM)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Alexandre Desbos [[Fichier:VISI-401-2022-Desbos.pdf]]&lt;br /&gt;
* Tuteur : Philippe Pernelle&lt;br /&gt;
* Résumé : l&#039;ingénierie dirigée par les modèles (ou MDE Model Driven Engineering) est une approche de conception basée sur la transformation de modèle sur des niveaux d&#039;abstraction différents (modèle, méta-modèle, méta-méta-modèle ...). l&#039;OMG propose une approche MDE basée sur 3 niveaux  d&#039;abstraction (CIM,PIM, PSM)  permettant de bâtir une application  en partant du niveaux d&#039;abstraction le plus haut (CIM) et en procédant par transformation / raffinement pour arriver au PSM puis à la génération de code. Il existe par ailleurs différents langages  (ATL, OCL) qui vont faciliter la transformation de modèle. A noter que la fondation Eclipse propose un environnement spécifique pour manipuler des modèles avec des implémentations d&#039;ATL et d&#039;OCL&lt;br /&gt;
* Objectifs :  L&#039;objectif est d&#039;étudier ces mécanismes de transformation / raffinement par l&#039;implémentation d&#039;un cas d&#039;étude dans eclipse en utilisant les langages ATL et OCL. Après une étude bibliographique des principes de MDA, l&#039;idée est de mettre en oeuvre dans Eclipse des extrait des modèles CIM, PIM et PSM proposés par les articles ci-dessous puis d&#039;essayer de construire des OCL et des scripts ATL afin de faciliter la transformation (sans aller jusqu&#039;à la génération de code)&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# These : https://hal.archives-ouvertes.fr/tel-01247610 (uniquement les pages 35 à 47)&lt;br /&gt;
*# Models and Mechanisms for implementing playful scenarios https://hal.archives-ouvertes.fr/hal-01372311&lt;br /&gt;
*# Digital Twin and Ecological Transition Integration in Training Process https://hal.archives-ouvertes.fr/hal-03375508&lt;br /&gt;
*# Eclipse Modeling Tools https://www.eclipse.org/downloads/packages/release/2021-12/r/eclipse-modeling-tools&lt;br /&gt;
&lt;br /&gt;
===[[Couvrir un polygone rectilinéaire avec des rectangles]]===&lt;br /&gt;
* Présentation : Maxent Bernier [[Fichier:VISI401-2022-Bernier.pdf]]&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Un polygone est dit rectilinéaire si les seuls angles qui apparaissent sont des angles droits. On considérera des polygones simples (i.e., sans trous et qui ne s&#039;auto-intersectent pas). Un tel polygone peut donc être recouvert par des carrés ou par des rectangles. On cherchera à écrire un algorithme qui trouve une couverture minimale (i.e., avec le moins de carrés/rectangles possibles). Dans le cas des carrés, on va pouvoir trouver un algorithme efficace pour ce problème. Malheureusement, le cas de la couverture minimale par les rectangles est NP-complète. &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme de recouvrement par des carrés&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet et le lien avec la couverture par les rectangles&lt;br /&gt;
*# Contourner la difficulté de la NP-complétude (heuristique ou cas des polygones orthogonalement convexes)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polygon_covering#cite_note-cr88-4  Couvertures de polygones (Wikipedia)]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/NP-completeness NP-complétude (Wikipedia)]]&lt;br /&gt;
** [[http://webdocs.cs.ualberta.ca/~joe/Preprints/Cover/paper.ps La couverture par rectangles est NP-complète]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires ===&lt;br /&gt;
&lt;br /&gt;
*Présentation : Emilien Boitouzet [[Fichier:VISI401-2022-Boitouzet.pdf]]&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
[[Fichier:automate_1.png]] [[Fichier:automate_2.jpeg]]&lt;br /&gt;
* Sujet : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser des calculs. Cependant les réalisations pratiques manquent, ce sujet se propose d’étudier l’utilisation des automates cellulaires dans les domaines suivant par exemple :&lt;br /&gt;
*# Modélisation des systèmes complexes (propagation des feux de forêt, processus de percolation, écoulement du sable ...)&lt;br /&gt;
*# Modélisation du comportement d&#039;un gaz&lt;br /&gt;
*# Système dynamique discret alternatif au modèle physique des équations aux dérivées partielles&lt;br /&gt;
*# Modélisation de la croissance de tissus cellulaires en biologie&lt;br /&gt;
*# Simulation de la croissance des cristaux&lt;br /&gt;
*# Correction automatique d’erreurs en imagerie&lt;br /&gt;
* Référence: https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
&lt;br /&gt;
=== Programmation bare-metal ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Andrien Montmayeur [[Fichier:VISI401-2022-Montmayeur.pdf]]&lt;br /&gt;
* Tuteur : Colin Weill-Duflos&lt;br /&gt;
* Sujet : l&#039;execution d&#039;un programme compilé peut parfois paraître un peu magique: on ne comprend pas forcément tout ce que fait le compilateur, et le système d&#039;exploitation fournit des abstractions bien pratiques. Comment se débrouille-t-on dans un contexte où il n&#039;y a pas de système d&#039;exploitation, comme certaines applications embarquées ou bien le système d&#039;exploitation lui-même?&lt;br /&gt;
* Objectifs : comprendre en détails la chaîne de compilation du C, l&#039;architecture d&#039;un executable et comment ce dernier est executé par une machine pour parvenir à faire executer un programme directement par un microprocesseur arm et interagir avec des périphériques simples.&lt;br /&gt;
* Référence:&lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Executable_and_Linkable_Format Architecture d&#039;un executable]&lt;br /&gt;
*#[https://aticleworld.com/c-compilation-process/ les étapes de compilation du C] (regarder notamment le linkage)&lt;br /&gt;
*# [https://azeria-labs.com/arm-data-types-and-registers-part-2/ débuter avec l&#039;assembleur arm]&lt;br /&gt;
&lt;br /&gt;
===GeoGebra et algèbre géométrique ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Nolann Sanmarti [[Fichier:VISI401-2022-Sanmarti.pdf]]&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Sujet : l&#039;algèbre géométrique émerge récemment comme un outil prometteur pour la synthèse d&#039;images : avec des points de contrôle, un produit, il est possible de représenter et de manipuler de manière efficace un ensemble d&#039;objets géométriques. Récemment, des bibliothèques c++ ont été développées. Ces bibliothèques autorisent une utilisation générique de l&#039;algèbre géométrique mais sont encore limitées par le manque d&#039;outils intéractifs adaptés. Par ailleurs, le logiciel de visualisation GeoGebra est un outil particulièrement utile pour la visualisation et la résolution de problèmes géométriques. Le but de ce projet serait de travailler un binding entre l&#039;algèbre géométrique et GeoGebra.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# se familiariser avec l&#039;algèbre géométrique, et l&#039;applet Javascript de GeoGebra,&lt;br /&gt;
*# identifier les objets et les opérations géométriques intéressantes à visualiser avec l&#039;algèbre géométrique,&lt;br /&gt;
*# implantations d&#039;une méthode générique permettant de générer des scripts dans l&#039;applet Javascript de GeoGebra.&lt;br /&gt;
* Références :&lt;br /&gt;
*# Projective geometric algebra: A new framework for doing euclidean geometry, Charles G. Gunn, 2019&lt;br /&gt;
*# [http://www.geogebra.org geogebra]&lt;br /&gt;
&lt;br /&gt;
== sujets 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
=== Comment Facebook gère ses données ?  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Pour une base de données, il est impossible d&#039;être cohérent, disponible tout le temps et partitionné. C&#039;est le fameux théorème CAP. Pour autant, les données de Facebook sont cohérentes, disponibles tout le temps, et réparties à travers le monde !? Impossible. Pour l&#039;étudiant, il faudra comprendre pourquoi c&#039;est impossible, et comment Facebook fait en pratique pour gérer ce problème.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le CAP théorème, et sa démonstration&lt;br /&gt;
*# Comprendre comment Facebook gère ce problème, et ses données d&#039;une manière générale&lt;br /&gt;
*# À définir, selon les questions que se pose l&#039;étudiant.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Théorème CAP :&lt;br /&gt;
*## https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_CAP&lt;br /&gt;
*## Brewer&#039;s Conjeture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services (https://awoc.wolski.fi/dlib/big-data/GiLy02-CAP.pdf)&lt;br /&gt;
*# Facebook Social Graph :&lt;br /&gt;
*## TAO : The power of the graph (https://engineering.fb.com/2013/06/25/core-data/tao-the-power-of-the-graph/)&lt;br /&gt;
*## TAO: Facebook’s Distributed Data Store for the Social Graph (https://www.usenix.org/system/files/conference/atc13/atc13-bronson.pdf)&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de calcul de l&#039;enveloppe convexe  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les ensembles convexes ont beaucoup de propriétés géométriques intéressantes, par exemple détecter la collision de deux ensembles convexes est &amp;quot;facile&amp;quot; algorithmiquement. Une étape fréquente dans beaucoup d&#039;algorithmes de traitements de données 2D/3D/nD est donc de calculer l&#039;enveloppe convexe d&#039;un nuage de points, c&#039;est-à-dire le plus petit ensemble convexe contenant ces points. Il existe de nombreux algorithmes de calcul d&#039;enveloppe convexe en 2D (Graham scan, Melkman, balayage de ligne (sweep-line), division-fusion, Chan&#039;s algorithm, Quickhull) et 3D (Chan&#039;s algorithm, Quickhull) et même nD (Quickhull notamment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
|Enveloppe convexe des points à coordonnées entières inclus dans une boule de diamètre 25&lt;br /&gt;
|----&lt;br /&gt;
[[Fichier:Qhull-25.png|300px]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Objectifs: il s&#039;agira de regarder quelques uns de ces algorithmes, d&#039;identifier leurs principales différences ainsi que leurs complexités théoriques et pratiques. On pourra aussi regarder plus précisément l&#039;algorithme Quickhull, dont l&#039;implémentation 2D est facile, et 3D accessible.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Barber, C. B., Dobkin, D. P., &amp;amp; Huhdanpaa, H. (1996). The quickhull algorithm for convex hulls. ACM Transactions on Mathematical Software (TOMS), 22(4), 469-483 [[https://www.researchgate.net/profile/Hannu_Huhdanpaa/publication/242414606_The_Quickhull_Algorithm_for_Convex_Hulls/links/54e5f6970cf2bff5a4f1e7db.pdf (PDF)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Graham_scan Algorithme de Graham (Wikipedia)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Convex_hull_algorithms Convex hull algorithms (Wikipedia)]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes autour des polyominos ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Un polyomino est une forme (sans trou) obtenue en collant des petits carrés de taille 1 par leurs bords. Des exemples connus sont par exemples les pièces du jeu tetris : il s&#039;agit de &amp;quot;tétramino&amp;quot;, c&#039;est à dire de polyomino formés de 4 carrés. Voici également les pentaminos, composés de 5 carrés :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:polyominos.png]]&lt;br /&gt;
&lt;br /&gt;
Une question récurrente est celle de la pavabilité : peut-on (en utilisant certains types de polyominos) paver un domaine donné.&lt;br /&gt;
Lorsque le domaine est fini, on peut utiliser une recherche exhaustive, mais lorsqu&#039;on veut paver tout le plan, le problème devient indécidable en général.&lt;br /&gt;
Nous nous intéresserons au cas le plus simple : est-il possible de paver le plan tout entier en utilisant des polyominos tous identiques, et en utilisant uniquement des translations.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pavages.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les définitions et notions de bases des polyominos, et en particulier leur représentation comme mot de contour&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance de polyominos en Python&lt;br /&gt;
*# comprendre la caractérisation des polyominos &amp;quot;exacts&amp;quot;, càd ceux qui pavent le plan&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance des polyominos exacts en Python&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Bibliographie initiale&lt;br /&gt;
*# [http://www.xprov.org/doc/these-XProvencal.pdf &amp;quot;Combinatoire des mots, géométrie discrète et pavages&amp;quot;], Xavier Provencal (chapitres 1 et 2)&lt;br /&gt;
*# [https://www.lama.univ-smb.fr/pagesmembres/vuillon/IanRAIRO.pdf &amp;quot;An algorithm for deciding if a polyomino tiles the plane by translation&amp;quot;], Ian Gambini et Laurent Vuillon&lt;br /&gt;
&lt;br /&gt;
=== Version algorithmique du lemme local de Lovász  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons un problème standard sur le routage de paquets dans des réseaux. Donnés un réseau et une collection de paquets, chacun venant avec un chemin dans le réseau (de la source vers la destination), le but est d’établir un planning qui minimise le temps pour que tous les paquets atteignent leur destination. Il est naturel de mesurer la qualité d’un tel planning en fonction de deux paramètres : la congestion c qui est le nombre maximum de paquets qui doivent emprunter une même arête du réseau et la dilatation d qui est le nombre maximum d’arêtes d’un chemin. En effet, il est facile de trouver un planning en temps c*d, et tout planning doit prendre comme temps au moins max(c,d). &lt;br /&gt;
&lt;br /&gt;
En 1994, Leighton, Maggsand et Rao ont montré qu’il existait toujours un planning en temps O(c+d). Malheureusement, ce résultat est basé sur le lemme local de Lovász. Il s’agit d’un résultat classique de combinatoire dont la preuve était à l’époque non constructive. Le problème précédent du routage de paquets n’est qu’une application de ce lemme parmi tant d’autres. En 2010, Moser et Tardos donnèrent un algorithme (en plus assez simple et efficace) pour le lemme local de Lovász.&lt;br /&gt;
&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le lemme local de Lovász et certaines de ses applications&lt;br /&gt;
*# Coder la version algorithmique de Moser et Tardos&lt;br /&gt;
*# Coder des applications du lemme (comme par exemple le routage de paquets)&lt;br /&gt;
* Bibliographie initiale : &lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Algorithmic_Lov%C3%A1sz_local_lemma Page wikipedia de la version algorithmique du lemme local de Lovász]&lt;br /&gt;
*# [http://www.scs.cmu.edu/afs/cs.cmu.edu/project/phrensy/pub/papers/LeightonMR94.pdf Application aux routage de paquets par Leighton, Maagsand et Rao]&lt;br /&gt;
*# [https://arxiv.org/pdf/0903.0544.pdf La version algorithmique du lemme local de Lovász par Moser et Tardos]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* Crypto-système de Merkle-Hellman et algorithme de Shamir, Ewan Rakotoanosy (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Reconstruction de surfaces à partir de nuages de points et de normales, Yohan Thépaut (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Algorithmes de super-résolution par apprentissage, Romain Théodet (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Autour de la question de la sensibilité des fonctions Booléennes, Christophe Carmagnac (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Structures de données purement fonctionnelles]], Loïc Dornel (Tuteur : Tom Hirschowitz)&lt;br /&gt;
* Automates cellulaires et décidabilité, Lucas Chardonnet (Tuteur : François Boussion)&lt;br /&gt;
&lt;br /&gt;
== sujets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
=== Crypto-système de Merkle-Hellman et algorithme de Shamir ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Le système de Merkle-Hellman est un système cryptographique de type &amp;quot;clé publique / clé privée&amp;quot;. Il a été inventé juste en 1978, après le système RSA (encore utilisé). Ce système a l&#039;avantage d&#039;être un peu plus simple, mais le **gros** désavantage d&#039;avoir été craqué par A. Shamir en 1984. L&#039;objectif est de comprendre le système, et la faille qu&#039;il contenait. Cela permettra de comprendre l&#039;algorithme de Shamir...&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Shamir, Adi (1984). &amp;quot;A polynomial-time algorithm for breaking the  basic Merkle - Hellman cryptosystem&amp;quot;. IEEE Transactions on Information  Theory. 30 (5): 699–704. doi:10.1109/SFCS.1982.5 [[http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.123.5840&amp;amp;rep=rep1&amp;amp;type=pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Reconstruction de surfaces à partir de nuages de points et de normales ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les lasers d&#039;acquisition de données 3d permettent de fabriquer des données qui approchent le bord d&#039;un objet 3D. Ces données sont souvent sous la forme d&#039;un nuage de points, doublé d&#039;un vecteur associé à chaque point et qui indique la direction normale à la surface de l&#039;objet. On parle de données de Hermite. Il existe des algorithmes dédiés, très efficaces et robustes, pour reconstruire une surface qui passe par ces points. L&#039;objectif est de comprendre les deux principales méthodes, l&#039;une appelée reconstruction de Poisson, l&#039;autre relié à la notion d&#039;indice (ou winding number), leurs qualités et leur défaut.&lt;br /&gt;
* Bibliographie initiale:&lt;br /&gt;
** KAZHDAN, Michael, BOLITHO, Matthew, et HOPPE, Hugues. Poisson surface reconstruction. In : Proceedings of the fourth Eurographics symposium on Geometry processing. 2006 [[http://faculty.cs.tamu.edu/schaefer/teaching/689_Fall2006/poissonrecon.pdf PDF]]&lt;br /&gt;
** BARILL, Gavin, DICKSON, Neil G., SCHMIDT, Ryan, et al. Fast winding numbers for soups and clouds. ACM Transactions on Graphics (TOG), 2018, vol. 37, no 4, p. 43. [[http://www.dgp.toronto.edu/projects/fast-winding-numbers/fast-winding-numbers-for-soups-and-clouds-siggraph-2018-compressed-barill-et-al.pdf]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de super-résolution par apprentissage ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La super-résolution consiste à, étant donné une image M x N, de fabriquer une image &amp;quot;zoomée&amp;quot; de taille kM x kN, où l&#039;information inventée est &amp;quot;crédible&amp;quot;. Le problème est évidemment mal posé mathématiquement, et du coup on rajoute de l&#039;information a priori : continuité des couleurs, continuité des structures géométriques, modèles probabilistes, moyennes non-locales (auto-similarités), etc. Avec l&#039;avènement du deep learning, des méthodes à base d&#039;apprentissage ont vu le jour. En gros, un réseau de neurones (CNN) apprend sur plein d&#039;images en &amp;quot;dézoomant&amp;quot; les images en entrées (facile, on sous-échantillonne), puis on utilise la fonction construite pour faire la super-résolution.&lt;br /&gt;
* L&#039;objectif est de regarder les méthodes de super-résolution, notamment celles par apprentissage et de voir leurs qualités et défauts. On pourra aussi les comparer avec des méthodes purement géométriques de super-résolution, ou des méthodes de moyennes non-locales.&lt;br /&gt;
* Ce sujet a été discuté avec Romain Théodet et conduit à un stage au LAMA pour combiner méthode géométrique et méthode par deep learning pour la super-résolution.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** SHI, Wenzhe, CABALLERO, Jose, HUSZÁR, Ferenc, et al. Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network. In : Proceedings of the IEEE conference on computer vision and pattern recognition. 2016. p. 1874-1883 [[https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf PDF]]?&lt;br /&gt;
** Lachaud, J.-O. and Kerautret, B., Geometric Total Variation for image vectorization, zooming and pixel art depixelizing, In : Proceedings of 5th Asian Conference on Pattern Recognition, 2019 [[Fichier:Paper-GTV.pdf]]&lt;br /&gt;
** [[https://github.com/kerautret/GTVimageVect Démos en ligne d&#039;algorithmes de super-résolution]]&lt;br /&gt;
&lt;br /&gt;
=== Autour de la question de la sensibilité des fonctions Booléennes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : On souhaite s’intéresser aux problèmes résolus par des algorithmes qui répondent par Vrai/Faux. Ces problèmes ont des entrées dans {0,1}^n (entrées codées en binaire) et une sortie dans {0,1) (Vrai ou Faux). Il est donc naturel de s’intéresser aux propriétés de ces fonctions Booléennes. Un certain nombre de paramètres intéressants ont été identifiés, comme la complexité du certificat (nombre minimal de bits nécessaires pour connaître la valeur de sortie), le degré (degré d’un polynôme qui correspond à la fonction sur les entrées Booléennes), la sensibilité (lnombre de bits qui, s’ils sont modifiés, impliquent une modification de la sortie), et bien d’autres (taille d’un arbre de décision, complexité en requêtes classiques ou quantiques, taille des coefficients de Fourier,…). En 1992, Nisan et Szegedy ont montré que tous ces paramètres sont reliés entre eux : si on connait l’un d’eux, par exemple le degré, on sait alors que n’importe quel autre de ces paramètres, par exemple la taille de l’arbre de décision, est limité à un certain intervalle de valeurs. Tous, sauf un : la sensibilité. Aucune méthode de preuve semblait impliquer que ce paramètre ne pouvait pas être beaucoup plus petit que les autres. Nisan et Szegedy posèrent alors la question de savoir si la sensibilité d’une fonction Bolléenne était reliée ou non aux autres paramètres classiques.&lt;br /&gt;
* Cet été, en 2019, un chercheur, Hao Huang, a montré dans une preuve de deux pages que la sensibilité ne pouvait pas être significativement plus petite que les autres paramètres, résolvant le problème posé 27 ans auparavant. Cette &amp;quot;sensitivity&amp;quot; conjecture a été attaquée en vain par de nombreux chercheurs renommés. Or, la nouvelle preuve est si simple qu’un chercheur l’a résumé en un [[https://twitter.com/BooleanAnalysis/status/1145837576487612416 tweet]].&lt;br /&gt;
* L&#039;objectif est de comprendre quels sont les paramètres classiques des fonctions Booléennes et des liens entre eux avant de s&#039;intéresser à la preuve de la conjecture. On pourra essayer de construire des fonctions extrémales (ie, avec des paramètres extrémaux dans leur plage de valeurs).&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** Le papier original où la question a été posée : N. Nisan, M. Szegedy. [[https://www.researchgate.net/profile/Mario_Szegedy/publication/2508255_On_the_Degree_of_Boolean_Functions_as_Real_Polynomials/links/09e41514878e7ef890000000.pdf On the degree of Boolean functions as real polynomials.]] Comput. Complexity, 4 (1992), 462–467.&lt;br /&gt;
** Une référence sur l&#039;analyse des fonctions Booléennes : Ryan O’Donnell. [[http://www.cs.tau.ac.il/~amnon/Classes/2016-PRG/Analysis-Of-Boolean-Functions.pdf Analysis of Boolean Functions]], Cambridge University Press, 2014  &lt;br /&gt;
** La preuve de la conjecture : Hao Huang. [[https://arxiv.org/abs/1907.00847 Induced subgraphs of hypercubes and a proof of the Sensitivity Conjecture]]. Annals of Mathematics, 190 (2019), 949-955&lt;br /&gt;
&lt;br /&gt;
=== Structures de données purement fonctionnelles ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;algorithmique est souvent enseignée sur des langages principalement impératifs tels que C. Les structures de données utilisées ne sont pas toujours évidentes à traduire vers les langages fonctionnels tels que OCaml. L&#039;étudiant s&#039;initiera aux structures de données fonctionnelles et aux concepts liés tels que la persistence, en suivant le livre « Purely functional data structures » d&#039;Okasaki.&lt;br /&gt;
* Liens&lt;br /&gt;
** [[https://www.cs.cmu.edu/~rwh/theses/okasaki.pdf La thèse d&#039;Okasaki (PDF)]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires et décidabilité ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Un automate cellulaire est un modèle de calcul discret, utilisé en dans différentes sciences (informatique, mathématiques, physique, biologie, etc;). Le jeu de la vie est l&#039;exemple emblématique d&#039;automate cellulaire. Les règles de calcul d&#039;un automate cellulaire, et de son évolution au cours du temps sont assez simples, mais mènent cependant à des problèmes complexes dont certains indécidables. Par exemple, déterminer si, étant donné des règles, on arrivera forcément, en un nombre fini d&#039;étapes, dans une configuration donné, quelque soit la configuration initiale (problème de nilopotence).&lt;br /&gt;
* L&#039;objectif est de s&#039;intéresser à ces problèmes indécidables dans les automates cellulaires et de produire un mini-cours sur le sujet.&lt;br /&gt;
* Références &lt;br /&gt;
** K. JARKKO, The nilpotency problem of one-dimensional cellular automata, SIAM J. Comput., Vol. 21, No. 3, pp. 571-586, June 1992.&lt;br /&gt;
** K. CULIK II, J. PACHL, S. Yu, On the limit sets ofcellular automata, SIAM J. Comput., 18 (1989), pp.831-842.&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le &amp;lt;b&amp;gt;lundi 27 mai&amp;lt;/b&amp;gt; de 9h à 11h en salle 115 du chablais.&lt;br /&gt;
Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Tristan_Porteries Tristan Porteries (PDF)]: problèmes avec mémoire restreinte, tuteur S. Tavenas&lt;br /&gt;
* R. Wagner: Reconstruction de surfaces à partir de nuages de points, tuteur J.-O. Lachaud&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Nils_Ruet Nils Ruet (PDF)]: LISP, tuteur P. Hyvernat&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Remy_Bouvier Rémy Bouvier (PDF)]: dancing links, tuteur P. Hyvernat&lt;br /&gt;
&lt;br /&gt;
== sujets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les sujets 1-3 sont encadrés par J.-O. Lachaud, les sujets 4-5 par P. Hyvernat, le sujet 6 par S. Tavenas.&lt;br /&gt;
Un encadrant encadre au max 2 étudiants.&lt;br /&gt;
&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;br /&gt;
# Une question naturelle est de savoir quels sont les problèmes qui peuvent être résolus avec un espace mémoire restreint. Plus formellement, on notera L l&#039;ensemble des problèmes que l&#039;on peut résoudre en utilisant seulement un espace mémoire logarithmique. On s&#039;intéresse à cette classe de problèmes, et plus particulièrement aux problèmes de connectivité dans un graphe.&lt;br /&gt;
#* [https://www.irif.fr/~sperifel/complexite.pdf Sylvain Périfel Complexité algorithmique] : Un livre récent qui survole une grosse partie de la complexité algorithmique. Le chapitre 4 concerne la complexité en espace.&lt;br /&gt;
#* [https://omereingold.files.wordpress.com/2014/10/sl.pdf Omer Reingold Undirected Connectivity in Log-Space]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le vendredi 25 mai 2018, à 9h. Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* ray-tracing au path-tracing, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Raphael_Tournafond.pdf Raphael Tournafond (PDF)]&lt;br /&gt;
* &amp;quot;dancing links&amp;quot; et NP complétude, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Ambroise_Decouttere.pdf Ambroise Decouttere (PDF)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
# Du ray-tracing au path-tracing: il s&#039;agit de comprendre l&#039;évolution des algorithmes de rendu (dits &amp;quot;réalistes&amp;quot;) et de mettre en avant les principales évolutions.&lt;br /&gt;
#* An introduction to ray tracing AS Glassner - 1989 - books.google.com&lt;br /&gt;
#* Energy redistribution path tracing, D Cline, J Talbot, P Egbert - ACM Transactions on Graphics (TOG), 2005 - dl.acm.org&lt;br /&gt;
#* et pour une introduction douce au ray-tracing: TP2 de http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO805/Tests/html/index.html&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; et NP complétude : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
#* [https://arxiv.org/pdf/1203.1895.pdf Classic Nintendo Games are (Computationally) Hard] : preuve que Super Mario et d&#039;autres jeux video classiques sont NP-complets &#039;&#039;Theoretical Computer Science, volume 586, 2015, pages 135–160.&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=16163</id>
		<title>VISI401 CMI : bibliographie scientifique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=16163"/>
		<updated>2026-01-07T15:57:20Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* sujets 2025-2026 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable:&lt;br /&gt;
* 2017--2021 : Jacques-Olivier Lachaud&lt;br /&gt;
* 2022-- : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
Ce module amène l&#039;étudiant à effectuer des recherches bibliographiques sur un sujet donné, et à synthétiser ses résultats sous la forme d&#039;un exposé construit.&lt;br /&gt;
&lt;br /&gt;
L&#039;étudiant, à partir d&#039;un sujet et d&#039;un ou plusieurs articles initiaux, doit approfondir le sujet, appréhender son historique, ses évolutions, et son état actuel. &lt;br /&gt;
&lt;br /&gt;
A côté des ressources fournies par les bibliothèques, quelques pointeurs très utiles pour faire des recherches bibliographiques:&lt;br /&gt;
* [https://scholar.google.fr Scholar Google] (libre)&lt;br /&gt;
* [https://researchgate.net ResearchGate] (libre)&lt;br /&gt;
* [https://mathscinet.ams.org/mathscinet/ MashSciNet] (plus math)&lt;br /&gt;
* [https://www.springerlink.com  Springer] (accès via USMB)&lt;br /&gt;
* [https://www.sciencedirect.com Elsevier Sciencedirect] (accès via USMB)&lt;br /&gt;
* SciHub lorsqu&#039;on ne trouve pas&lt;br /&gt;
&lt;br /&gt;
La synthèse bibliographique se fait en interaction avec le tuteur par des visites régulières et/ou des compte-rendus d&#039;avancement par email. La synthèse finale fait l&#039;objet d&#039;un exposé final (15-20 minutes + questions) et d&#039;un document de présentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2025-2026 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Synthèse de texture et transfert de texture par matelassage d&#039;images]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; La synthèse de texture est le procédé qui vise à générer une nouvelle image à partir d&#039;une ou plusieurs (petites) images modèles, en donnant l&#039;impression que cette nouvelle image suit les propriétés structurelles, colorimétriques et statistiques de l&#039;image originelle. C&#039;est très utilisé en synthèse d&#039;image pour générer de grandes textures à partir de petits échantillons. On se propose d&#039;étudier et d&#039;implémenter un algorithme assez simple mais assez efficace appelé &amp;lt;i&amp;gt;image quilting&amp;lt;/i&amp;gt; pour faire de la génération de texture. Il se base sur de simples recherches de sous-images dans l&#039;image original, en superposant au mieux les sous-images. L&#039;algorithme peut même servir à du transfert de textures. Le langage de développement est au choix.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre la méthode d&#039;image quilting, voir le papier d&#039;Efros et Freeman, Siggraph&#039;2001&lt;br /&gt;
* implémenter dans un premier temps la méthode simple qui parcourt l&#039;image en scan-line et recherche la meilleure sous-image avec un overlap choisi.&lt;br /&gt;
* dans un 2e temps, implémenter la méthode de découpe optimale entre 2 sous-images superposées&lt;br /&gt;
* dans un 3e temps, implémenter le transfert de texture&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[le bytecode Python]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; Python est un langage &amp;quot;interprété&amp;quot;. Un programme Python n&#039;est jamais directement transformé en suite d&#039;instructions pour le processeur sur lequel il doit s&#039;exécuter. C&#039;est l&#039;interpréteur qui va, lors de l&#039;exécution, regarder les instructions Python pour les exécuter. Pour éviter que le passage par cet intermédiaire prenne trop de temps, le programme Python est d&#039;abord transformé en un &amp;quot;langage intermédiaire&amp;quot; appelé &amp;quot;bytecode&amp;quot;. Ce langage est une espèce de langage d&#039;assemblage propre à Python. Les instructions sont beaucoup plus simples à exécuter que les instructions &amp;quot;haut niveau&amp;quot; et sont identiques pour tous les processeurs.&lt;br /&gt;
&lt;br /&gt;
L&#039;outils principal pour étudier le bytecode python est le module &amp;lt;tt&amp;gt;dis&amp;lt;/tt&amp;gt; (comme &amp;lt;tt&amp;gt;dis&amp;lt;/tt&amp;gt;assembler) de la version usuelle de Python (CPython).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre la différence entre les langages compilé et interprétés&lt;br /&gt;
* comprendre globalement le mécanisme de transformation d&#039;un programme Python en bytecode&lt;br /&gt;
* étudier le bytecode produit sur des exemples particuliers et pertinents (&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;, concaténation, &amp;lt;tt&amp;gt;append&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== [[Peut-on calculer(efficacement) une transformation de Fourier Rapide sur GPU ]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Mouloud Kessar &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039;&lt;br /&gt;
En traitement du signal, ainsi que pour les simulations numériques, les transformations de Fourier rapides sont extrêmement répandues. L&#039;algorithme de Cooley-Tukey publié en 1965 réduit la complexité du calcul d&#039;une transformée de Fourier discrète à 0(nlog(n)), contre O(n2) pour une implémentation native. Sur CPU, la librairie la plus répandue est FFTW (Fastest Fourier Transform in the West). De nombreuses librairies existent sur GPU pour le calcul des FFT. Malgré tout, pour les simulations numériques en mécanique des fluides, ce sont les transformations de Fourier qui peuvent rendre délicat le portage de codes sur GPU.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* De comprendre les différences de la programmation sur GPU par rapport au CPU.&lt;br /&gt;
* Faire un travail bibliographique pour donner des perspectives d’améliorations dans le cas des FFT.&lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, on essaiera:&lt;br /&gt;
* de Paralléliser un code( c++) déjà existant à l&#039;aide d&#039;OpenMP&lt;br /&gt;
* de porter un code( c++) déjà existant sur GPU à l&#039;aide d&#039;OpenMP GPU&lt;br /&gt;
* de déterminer s&#039;il y a des contextes dans lesquels le code est plus efficace sur GPU ou CPU.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références:&#039;&#039;&#039;&lt;br /&gt;
* La page wikipedia des FFT https://fr.wikipedia.org/wiki/Transformation_de_Fourier_rapide&lt;br /&gt;
* les supports de cours de l&#039;IDRIS  http://www.idris.fr/formations/supports_de_cours.html&lt;br /&gt;
&lt;br /&gt;
== sujets 2024-2025 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes de colorations de graphes]] ===&lt;br /&gt;
&#039;&#039;&#039; Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Résumé :&#039;&#039;&#039; Un [https://fr.wikipedia.org/wiki/Th%C3%A9orie_des_graphes graphe] est un ensemble de sommets et un ensemble d’arêtes sur ces sommets. Une [https://fr.wikipedia.org/wiki/Coloration_de_graphe coloration propre] d&#039;un graphe est une assignation de couleurs à chaque sommet du graphe telle que chaque paire de sommets reliée par une arête a des couleurs différentes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Graph.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Coloration.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Impropre.jpg|400px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Une coloration propre de ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Une coloration impropre du graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Connaître le nombre minimum de couleurs permettant de colorer proprement un graphe est un problème NP-difficile. Cependant, il existe des algorithmes de coloration de graphe permettant de trouver une coloration propre en fonction du nombre de voisins maximums d&#039;un sommet. L&#039;objectif de ce sujet est d&#039;implémenter certains de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter l&#039;algorithme de coloration glouton d&#039;un graphe&lt;br /&gt;
# implémenter l&#039;amélioration de cet algorithme en utilisant la dégénérescence du graphe&lt;br /&gt;
# implémenter l&#039;algorithme issus du théorème de Brooks&lt;br /&gt;
# éventuellement, implémenter un algorithme de coloration d&#039;arêtes&lt;br /&gt;
# éventuellement, implémenter un algorithme de transformation du problème SAT en problème de coloration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de Ukkonen / algorithme SA-IS]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; L&#039;arbre des suffixes est une structure de données qui permet de répondre très rapidement à de nombreuses requêtes du style &amp;quot;est-ce que la chaine &#039;&#039;p&#039;&#039; apparait dans la chaine &#039;&#039;S&#039;&#039; ?&amp;quot; La chaine &#039;&#039;p&#039;&#039; pourrait être une &amp;quot;petite&amp;quot; chaine de quelques milliers de caractères, alors que la chaine &#039;&#039;S&#039;&#039; pourrait être une &amp;quot;grosse&amp;quot; chaine de plusieurs milliard de caractères. Lorsque la chaine &#039;&#039;S&#039;&#039; est fixe, cette recherche se fait en un temps proportionnel à la taille de &#039;&#039;p&#039;&#039;, indépendamment de la taille de &#039;&#039;S&#039;&#039; ! Ce qui rend ceci possible est le précalcul de l&#039;arbre des suffixes de &#039;&#039;S&#039;&#039;, une fois pour toute. Si on fait ce précalcul de manière naïve, il prend un temps proportionnel à la taille de &#039;&#039;S&#039;&#039; &#039;&#039;&#039;au carré&#039;&#039;&#039;. Lorsque &#039;&#039;S&#039;&#039; contient des milliards de caractéres, ceci n&#039;est pas raisonnable.&lt;br /&gt;
&lt;br /&gt;
L&#039;algorithme de Ukkonen permet de calculer l&#039;arbre des suffixes en un temps proportionnel à la taille de &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# comprendre la structure d&#039;arbre des suffixes&lt;br /&gt;
# coder une version naïve du calcul de l&#039;arbre des suffixes&lt;br /&gt;
# comprendre et coder une version de l&#039;algorithme de Ukkonen, et comparer les temps de calcul&lt;br /&gt;
# si le temps le permet, comprendre l&#039;algorithme SA-IS qui permet de construite le tableau des suffixes en un temps proportionnel à la taille de &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# les [https://www.youtube.com/playlist?list=PL2mpR0RYFQsDFNyRsTNcWkFTHTkxWREeb vidéos de Ben Langmead] sur les arbres de suffixes (vidéos 1 -- 9)&lt;br /&gt;
# description de l&#039;algoritme de Ukkonen dans Dan Gusfield, &#039;&#039;Algorithms on Strings, Trees and Sequences&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Approximations d&#039;Euler et Runge-Kutta pour la modélisation du problème à 3 corps===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
en astronomie, la modélisation du problème à N corp est un enjeu majeur. Il est indispensable pour l&#039;exploration spatiale, notamment pour l&#039;envoie de sonde sur Mars, ou&lt;br /&gt;
Titan (Lune de Jupiter).&lt;br /&gt;
&lt;br /&gt;
Les équations décrivant le problème à N corps existent depuis de nombreuses années, mais les mathématiciens et les physiciens ne savent pas les résoudre analytiquement.&lt;br /&gt;
&lt;br /&gt;
Des codes de calcul existent pour réaliser des simulations du système solaire.&lt;br /&gt;
&lt;br /&gt;
D&#039;un point de vue algorithmique, le point clef se situe dans l&#039;approximation choisie pour les dérivées en temps.&lt;br /&gt;
&lt;br /&gt;
Une approximation à l&#039;aide d&#039;une méthode type Euler ou Runge-Kutta va avoir un ordre de précision prédéfini.&lt;br /&gt;
&lt;br /&gt;
Toutes ces approximations ne se valent pas, et une analyse rigoureuse de la fiabilité de ces méthodes est nécessaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; il n&#039;est pas nécessaire de connaître les méthodes numériques au préalables car elles seront introduites et développées dans un cadre simple au fur et à mesure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre le fonctionnement de l&#039;approximation d&#039;une dérivée par une méthode numérique (type Euler et Runge-Kutta d&#039;ordre 2)&lt;br /&gt;
* Développer  un programme permettant de  prédire les mouvements des corps suivants: Jupiter, La Terre, et Le Soleil&lt;br /&gt;
* Mesurer l&#039;ordre de précision des deux méthodes numériques implémentées, et comparer à l&#039;ordre théorique.&lt;br /&gt;
* Si le temps le permet:&lt;br /&gt;
** Ajouter les schémas  Runge-Kutta 4 et 6&lt;br /&gt;
** modifier le code pour inclure Mars, Venus et Mercure&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
# La formulation générale du problème à N-corp est donnée ici: https://en.wikipedia.org/wiki/N-body_problem&lt;br /&gt;
# Ce type d&#039;étude peut devenir autrement plus complexe que la version présentée ici. Dans le film &amp;quot;The Martian&amp;quot; , un astronaute est piégé sur Mars, et son équipe qui était en route pour la terre doit venir le récupérer. Le centre de calcul &amp;quot;Pléiades&amp;quot; de la NASA est présenté, et utilisé pour déterminer s&#039;il est possible de renvoyer le vaisseau spatial récupérer l&#039;astronaute, notamment à l&#039;aide d&#039;une fronde gravitationnelle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Programmation graphique sur GPU]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé et objectifs :&#039;&#039;&#039; les cartes graphiques modernes permettent l&#039;affichage de millions de polygones avec des rendus presque réalistes en temps réel.&lt;br /&gt;
L&#039;objectif de ce sujet est de découvrir la modélisation 3D, puis les programmations spécifiques des vertex et fragment shaders pour réaliser certains types d&#039;effet (camera,&lt;br /&gt;
transformations géométriques, illumination, textures, halos, stylisations, incrustations).&lt;br /&gt;
Le pipeline OpenGL sera étudié, et accédé via WebGL/javascript/three.js. Dans une 2eme partie, certains shaders de shadertoy.com seront étudiés plus en détails, afin de&lt;br /&gt;
comprendre les nombreuses astuces utilisées par les experts du domaine pour faire des effets impressionnants en temps réel.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque :&#039;&#039;&#039; sujet discuté avec Vetea Stoll&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Magic Numbers et Jeux Vidéo]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé et objectifs :&#039;&#039;&#039; les magic numbers sont souvent considérés comme une mauvaise pratique en&lt;br /&gt;
programmation. Cependant, l&#039;algorithme emblématique de la racine carrée inverse rapide,&lt;br /&gt;
utilisé dans les moteurs de jeux vidéo comme Quake III Arena, justifie&lt;br /&gt;
l&#039;utilisation du fameux 0x5f3759df.&lt;br /&gt;
Ce sujet propose d&#039;étudier cet algorithme, ainsi que des sujets connexes.&lt;br /&gt;
&lt;br /&gt;
Travail à réaliser :&lt;br /&gt;
* Expliquer le fonctionnement détaillé de l&#039;algorithme.&lt;br /&gt;
* Comparer avec la méthode de Newton-Raphson&lt;br /&gt;
* Expliquer les applications pratiques&lt;br /&gt;
* Comparer les performances en temps d&#039;exécution et en mémoire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Indexation dans les Bases de Données]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sujet :&#039;&#039;&#039; en bases de données, les index sont essentiels pour accélérer les requêtes,&lt;br /&gt;
mais ils impliquent des compromis entre performance, espace et coût de&lt;br /&gt;
maintenance.&lt;br /&gt;
Dans ce sujet, vous étudierez les types d&#039;index (B-tree, Hash, etc.), leur&lt;br /&gt;
impact sur les requêtes et les modifications (``INSERT``, ``UPDATE``, ``DELETE``).&lt;br /&gt;
&lt;br /&gt;
Travail à réaliser :&lt;br /&gt;
* Expliquer les structures d’index (B-tree, Hash).&lt;br /&gt;
* Expliquer les différents cas d&#039;usage&lt;br /&gt;
* Expliquer l’impact des index sur les performances des requêtes (``SELECT WHERE``).&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ressource pour commencer :&#039;&#039;&#039;&lt;br /&gt;
# &amp;quot;Bases de données : concepts, utilisation et développement&amp;quot;, Jean-Luc Hainaut, chapitre 4 (disponible à la BU)&lt;br /&gt;
&lt;br /&gt;
== sujets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Génération de labyrinthes &amp;quot;organiques&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; la génération de labyrinthes est un problème classique, notamment abordé dans les cours d&#039;algorithmes de graphes. Ces méthodes permettent de générer des labyrinthes sur des &#039;&#039;grilles&#039;&#039;, typiquement carrées :&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze_grid.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
La création de labyrinthe &amp;quot;organiques&amp;quot;, du style&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
utilise une méthode très différente. Les détails sont décrits dans un article publié en  2006: http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf. La description peut sembler très abstraite, mais l&#039;idée initiale est assez simple : une courbe initiale est, petit à petit, déformée aléatoirement.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; comprendre la méthode de base, et l&#039;implémenter pour générer des labyrinthes organiques. La première version pourra être codée en Python, mais comme la méthode nécessite une &#039;&#039;grosse&#039;&#039; quantité de calculs, il pourra être intéressant de coder une seconde version en utilisant un langage compilé si l&#039;on souhaite obtenir de &amp;quot;gros&amp;quot; labyrinthes. De nombreuses améliorations sont décrites dans l&#039;article de H. Pedersen et K. Singh, et il serait intéressant de d&#039;en implémenter certaines, soient en Python (en les testant sur de petits labyrinthes) soit dans un autre langage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039; Hans Pedersen et Karan Singh, &#039;&#039;Organic Labyrinths and Mazes&#039;&#039;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== Tramage artistique d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le tramage d&#039;une image (en anglais *dithering* ou *half-toning*) consiste à esquisser une image en niveaux de gris ou en couleur à l&#039;aide de très peu d&#039;encres ou couleurs différentes. Historiquement, l&#039;utilisation la plus courante est en impression: un fax ne dispose que d&#039;une encre noire (donc 2 couleurs noir et blanc pour transférer une image), les imprimantes n&#039;ont que 4 encres (et donc cinq couleurs jaune, cyan, magenta, noir et le blanc du papier). Les premiers ordinateurs avaient des écrans avec très peu de couleurs, donc les photos étaient approchées avec 8 ou 16 couleurs. &lt;br /&gt;
&lt;br /&gt;
En informatique, les algorithmes de tramage par diffusion d&#039;erreur [https://fr.wikipedia.org/wiki/Algorithme_de_Floyd-Steinberg#:~:text=L%27algorithme%20de%20Floyd%2DSteinberg,un%20pixel%20à%20ses%20voisins. Floyd-Steinberg] sont faciles à implémenter et rapide, donc très utilisés.&lt;br /&gt;
&lt;br /&gt;
Néanmoins, il existe des algorithmes qui donnent des résultats beaucoup plus jolis, notamment celui proposé par Ostromoukhov et Hersch (1999). Nous proposons de l&#039;étudier et de l&#039;implémenter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-david.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-photo.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Floyd-Steinberg&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Ostromoukhov-Hersch&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre les principes du tramage, éventuellement coder en python/opencv l&#039;algorithme basique. Comprendre ensuite l&#039;algorithme d&#039;Ostromoukhov et Hersch (1999), et l&#039;implémenter en python, d&#039;abord en noir et blanc, et si le temps le permet, en couleur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://dl.acm.org/doi/pdf/10.1145/311535.311605 Ostromoukhov et Hersch, Multi-Color and Artistic Dithering, ACM SIGGRAPH 1999]&lt;br /&gt;
* [https://opencv.org OpenCV], pratique pour lire une image, l&#039;afficher, faire des traitements.&lt;br /&gt;
&lt;br /&gt;
=== Rendu réaliste de scènes 3D par lancer de rayons ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note : &#039;&#039;&#039; Sujet demandé par Lukas Rey.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le rendu réaliste de scène 3D a été (et reste) un des objectifs majeurs de l&#039;informatique graphique, notamment grâce à ses nombreuses applications dans différents domaines : le cinéma (effets spéciaux), mais aussi le marketing, la publicité, l&#039;architecture, ou l&#039;art. L&#039;algorithme le plus utilisé est appelé &amp;quot;lancer de rayons&amp;quot;, avec un objectif de simuler le trajet des rayons lumineux dans une scène 3D afin de déterminer les couleurs perçues par un observateur. Plutôt que de calculer tous les rayons lumineux d&#039;une scène, cet algorithme calcule seulement le trajet inverse des rayons lumineux qui arrivent dans l&#039;oeil de l&#039;observateur, ce qui est beaucoup plus économique. On verra que cet algorithme permet de simuler des matériaux réfléchissants ou (semi-)transparents, de calculer des ombres portées, de simuler du brouillard...&lt;br /&gt;
&lt;br /&gt;
[[file:ray-tracing.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Il s&#039;agit de comprendre d&#039;où vient la couleur perçue d&#039;un objet, d&#039;implémenter l&#039;algorithme récursif classique du lancé de rayons, au moins avec des objets simples (sphères, tétraèdres), et de voir comment optimiser les calculs (car ça devient vite coûteux). On pourra s&#039;appuyer sur ce [https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html TP] pour l&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://en.wikipedia.org/wiki/Ray_tracing_(graphics)&lt;br /&gt;
* https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html&lt;br /&gt;
&lt;br /&gt;
=== Rendu temps réel avec OpenGL ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Colin Weill-Duflos&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; On cherche à utiliser une API graphique (OpenGL) afin de faire du rendu de scène 3d en utilisant la carte graphique. Cela permet d&#039;utiliser les techniques de rendu 3d en temps réel (rastérisation) et de les faire effectivement fonctionner en temps réel, permettant d&#039;afficher une scène avec laquelle on peut intéragir : en déplaçant la caméré, en bougeant des éléments...&lt;br /&gt;
Ces techniques ont déjà été utilisée dans des années précédentes, sans utiliser la carte graphique (le résultat était assez lent). Grâce à OpenGL, la plupart de ces opérations peuvent s&#039;effectuer sur la carte graphique, ce qui permet de ne pas avoir à en recoder une partie (grâce à des composants capables de faire uniquement ces opérations) et d&#039;être plus rapide.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre les techniques de raterisation&lt;br /&gt;
* comprendre la pipeline OpenGL&lt;br /&gt;
* implémenter une scène avec un objet et une caméra controlable&lt;br /&gt;
* rajouter des shaders pour simuler la lumière (Phong shading), variantes stylisées (Toon shading)&lt;br /&gt;
* rajouter des textures sur la scène&lt;br /&gt;
* faire des shadow maps pour les ombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [Travaux précédents](http://os-vps418.infomaniak.ch:1250/mediawiki/images/0/0d/Gossin-2023.pdf)&lt;br /&gt;
* [Pipeline OpenGL](https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview)&lt;br /&gt;
* [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
* [Toon shading](https://fr.wikipedia.org/wiki/Ombrage_de_cellulo%C3%AFd)&lt;br /&gt;
* [Shadow maps](https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping)&lt;br /&gt;
&lt;br /&gt;
=== Problèmes indécidables ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Quand on a un calcul à faire, on peut se demander de la meilleure implémentation pour faire faire ce calcul par un ordinateur. On pense généralement moins à la question - pourtant primordiale - de savoir si ce calcul peut être effectué par l’ordinateur. Pourtant, on sait depuis l’origine de l’informatique qu’il existe des fonctions que l’on ne peut pas calculer à l’aide d’un ordinateur.  On cherchera à comprendre ce que serait un programme qui résoudrait le problème de l’arrêt et pourquoi, il ne marchera pas. On pourra se demander alors s’il y a un lien entre les différents problèmes non-calculables : avec une librairie qui résout le problème de l’arrêt, peut-on écrire un problème qui résout le problème de correspondance de Post ? Peut-on imaginer un problème qu’on ne pourrait pas résoudre même si on avait une fonction qui résolvait le problème de l’arrêt ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de fonction calculable (et donc de fonction non-calculable). Donner des exemples. &amp;quot;Coder&amp;quot; l’argument diagonal de la non-calculabilité de l’arrêt. Coder une réduction entre deux problèmes non-calculables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Th%C3%A9orie_de_la_calculabilit%C3%A9 Wikipédia - Théorie de la calculabilité]&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_l%27arr%C3%AAt Wikipédia - Problème de l&#039;arrêt]&lt;br /&gt;
* [https://ludovicpatey.com/courses/comp-thy-2023/cr11-fr.pdf Livre récent en français sur la théorie de la calculabilité]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Réseaux de neurones et apprentissage ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; sujet demandé par Elliot Moiroud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
# se familiariser avec les concepts utilisés en apprentissage,&lt;br /&gt;
# essayer d&#039;implémenter une version ultra simple de la procédure d&#039;apprentissage,&lt;br /&gt;
# utiliser une bibliothèque existante sur quelques exemples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
# http://neuralnetworksanddeeplearning.com/&lt;br /&gt;
&lt;br /&gt;
=== Synchronisation dans les Systèmes Distribués ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; l&#039;algorithme de Lamport joue un rôle crucial dans la synchronisation des horloges dans un réseau de machines qui ne sont pas nécessairement précises ou synchronisées entre elles. Il permet de créer un consensus sur l&#039;ordre des événements dans un système distribué, où la communication peut être retardée ou désordonnée. Cette capacité est fondamentale pour assurer la cohérence et la fiabilité des opérations dans des environnements distribués, tels que les bases de données distribuées, les systèmes de fichiers en réseau et les applications de blockchain. Après avoir maîtrisé l&#039;algorithme de Lamport, l&#039;étudiant pourra les fautes byzantines pour comprendre comment les systèmes distribués gèrent les informations contradictoires ou erronées transmises par différents nœuds du réseau.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Analyser et comprendre l&#039;algorithme de Lamport pour la synchronisation des horloges.&lt;br /&gt;
# (Examiner les fautes byzantines et leur influence sur la stabilité des systèmes distribués.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Time, Clocks, and the Ordering of Events in a Distributed System.&lt;br /&gt;
https://lamport.azurewebsites.net/pubs/time-clocks.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation dynamique et complexité ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; La programmation dynamique est sans doute une des techniques de programmation qui porte le plus mal son nom.  Elle s&#039;applique lorsqu&#039;un problème peut se décomposer en sous-problèmes, dont les solutions peuvent être combinées. Dans le cas relativement simples où les sous-problèmes sont toujours disjoint, on utilise une approche de type &amp;quot;diviser pour rêgner&amp;quot;. Lorsque ce n&#039;est pas le cas, il faut faire attention à ne pas dupliquer les calculs. Les deux approches habituelles sont :&lt;br /&gt;
# la &amp;quot;mémoization&amp;quot;, qui consiste à sauvegarder toutes les solutions trouvées pour éviter de les recalculer,&lt;br /&gt;
# la &amp;quot;programmation dynamique&amp;quot; qui consiste à faire les solutions dans le &amp;quot;bon ordre&amp;quot; afin de ne jamais avoir besoin d&#039;une solution qui n&#039;aurait pas été calculée.&lt;br /&gt;
&lt;br /&gt;
Ces techniques permettent en général d&#039;obtenir un algorithme beaucoup plus rapide que la version naïve.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# étudier les méthodes de &amp;quot;mémoization&amp;quot; et &amp;quot;programmation dynamique&amp;quot; sur plusieurs exemples et les comparer&lt;br /&gt;
# mettre en évidence les complexités &amp;quot;pratiques&amp;quot; de ces algorithmes au moyen de benchmarks pertinents&lt;br /&gt;
# comprendre les calculs &amp;quot;théoriques&amp;quot; de la complexité de ces algorithmes pour vérifier que les prédictions correspondent à la pratique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;Introduction à l&#039;algorithmique&amp;quot;, T. Cormen, C. Leiserson, R. Rivest, C. Stein&lt;br /&gt;
# la page wikipedia française : https://fr.wikipedia.org/wiki/Programmation_dynamique&lt;br /&gt;
&lt;br /&gt;
== sujets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
=== algorithmes de recherche de chaines ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : rechercher si une chaine &#039;&#039;s1&#039;&#039; apparait à l&#039;intérieur d&#039;une chaine &#039;&#039;s2&#039;&#039; est assez simple, mais l&#039;algorithme naïf n&#039;est pas très rapide. L&#039;objectif de ce sujet est de s&#039;intéresser à certains algorithmes de recherche de sous-chaines plus efficaces. Le plus simple est probablement l&#039;algorithme KMP (du noms de ses inventeurs : Knuth, Morris et Pratt) qui évite des comparaisons inutiles de l&#039;algorithme naïf. L&#039;algorithme de Boyer-Moore utilise des idées similaires mais considère la sous-chaine (&#039;&#039;s1&#039;&#039;) à l&#039;envers, ce qui lui permet d&#039;aller en général plus vite. Ces algorithmes restent assez lents lorsque la chaine &#039;&#039;s2&#039;&#039; est très grande. C&#039;est par exemple le cas en bio-informatique lorsque l&#039;on doit rechercher des chaines dans le génome. Dans ce cas, la chaine &#039;&#039;s2&#039;&#039; est fixe et on rercherche de nombreuses sous-chaines &#039;&#039;s1&#039;&#039;. Il est alors possible de faire un &#039;&#039;pré-traitement&#039;&#039; pour faire une recherche beaucoup plus rapide qui ne dépend pas de la taille de &#039;&#039;s2&#039;&#039; !&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de quelques uns de ces algorithmes&lt;br /&gt;
*# les implémenter (par exemple en Python)&lt;br /&gt;
*# essayer de les comparer&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
# https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm&lt;br /&gt;
# transformé de Burrows-Wheeler et recherche de sous-chaines https://www.youtube.com/watch?v=P3ORBMon8aw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== génération de labyrinthes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : il existe de nombreuses méthodes algorithmiques pour générer des labyrinthes aléatoires. La plupart de ces méthodes sont expliquées sur des grilles carrées mais il est possible de les implémenter sur d&#039;autres types de grilles. Il est possible des les adapter par exemple pour générer des labyrinthes circulaires, cylindriques, ou sphériques ; ou bien des labyrinthes en plusieurs parties (de grandes pièces contenant des labyrinthes, reliées par des couloirs formant un autre labyrinthe).&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de plusieurs algorithmes de génération de labyrinthes&lt;br /&gt;
*# les étendres à des grilles plus intéressantes&lt;br /&gt;
*# &#039;&#039;expérimenter et chercher des manières simples de générer un labyrinthe &amp;quot;continu&amp;quot;&#039;&#039; (La solution décrite dans &amp;quot;How to Generate Perfect Mazes?&amp;quot; est probablement un peu trop complexe.)&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** le livre &amp;quot;Mazes for programmers&amp;quot;, https://pragprog.com/titles/jbmaze/mazes-for-programmers/&lt;br /&gt;
** l&#039;article &amp;quot;How to Generate Perfect Mazes?&amp;quot;, https://hal.uca.fr/hal-03174952/file/article-journal-2020.pdf&lt;br /&gt;
** l&#039;article &amp;quot;Organic Labyrinths and Mazes&amp;quot;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== L’infâme GOTO ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : L’instruction goto n’a aujourd’hui plus la côte parmi les informaticiens, et est souvent considérée comme une instruction à bannir. L&#039;idée est d&#039;explorer ce que permet cette instruction, et comment a évolué son utilisation.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# remplacer des structures de contrôles simples simples par des goto&lt;br /&gt;
*# faire un programme plus complexe utilisant un maximum de goto&lt;br /&gt;
*# expliquer l&#039;évolution de l&#039;utilisation du goto&lt;br /&gt;
*# avantages/inconvénients de son utilisation&lt;br /&gt;
*# comparaison des langages prenant en charge ou non cette instruction et pourquoi&lt;br /&gt;
*# utilisation actuelle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Blockchains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : les blockchains sont de plus en plus populaires, utilisées initialement pour les cryptomonnaies, elles peuvent être utilisées pour stocker des données, gérer les contrats intelligents, etc.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre le fonctionnement des blockchains (par exemple avec l&#039;article de Satoshi Nakamoto)&lt;br /&gt;
*# implémenter une blockchaine&lt;br /&gt;
*# ...&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de reconstruction de surfaces à partir d&#039;images 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les images 3D sont devenues courantes avec les outils d&#039;acquisition comme les scanners X ou les scanners IRM. On peut aussi modéliser des objets 3D sous forme de volumes, pour ensuite en extraire des surfaces (e.g. modélisation de fluides, de feu ou de fumées). Un enjeu est de pouvoir construire des surfaces qui représentent le bord d&#039;objets d&#039;intérêt dans ces données volumiques. Les algorithmes les plus classiques reconstruisent une surface composée de triangles qui approchent un niveau de gris donné dans le volume 3D :  c&#039;est une iso-surface, comparable à une courbe d&#039;iso-altitude dans une carte topographique, mais en 3D ! On  s&#039;intéreressera à deux algorithmes particulièrement : le marching-tetrahedra et le marching-cubes.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre ce qu&#039;est une iso-surface dans une image 3D ou dans une fonction implicite.&lt;br /&gt;
*# Comprendre les points communs et différences des algorithmes Marching Tetrahedra et Marching Cubes&lt;br /&gt;
*# Implémenter un des deux algorithmes. On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python. &lt;br /&gt;
*# On lira des fichiers .vol pour les images 3D, qui vous seront fournies.&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_tetrahedra Marching Tetrahedra sur wikipedia]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_cubes Marching Cubes sur wikipedia]&lt;br /&gt;
** [https://dl.acm.org/doi/pdf/10.1145/37402.37422 Lorensen, Cline, Marching cubes: a high resolutions 3D surface construction algorithm, Computer Graphics, 21(4), 1987]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-slices.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-isosurface.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Coupes dans une image 3D &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Isosurface dans cette image &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Invitation à la complexité algorithmique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
* Résumé : on abordera le thème de la complexité algorithmique : étant donné un programme implémentant une fonction, peut-on borner son temps de calcul en fonction de la taille de ses entrées. On procédera par l&#039;exemple, en tentant de confirmer la théorie par des expériences concrets de petits programmes (par exemple en Python). Comme point d&#039;entrée, on pourra par exemple examiner les différences de complexité entre quelques algorithmes de tri.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre l&#039;intérêt de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;,&lt;br /&gt;
*# se familiariser avec les notions et notations utilisées pour décrire la complexité en temps de calcul (ou en mémoire) des algorithmes,&lt;br /&gt;
*# apprendre à vers de &amp;quot;benchmarks&amp;quot; pour évaluer l&#039;efficacité réelle d&#039;une fonction dans un langage de programmation,&lt;br /&gt;
*# comprendre les limites de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== sujets 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
===Rust et la notion d&#039;appartenance (&amp;quot;ownership&amp;quot;)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Théo Connetable : [[Fichier:VISI401-2022-Connetable.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : dans la plupart des langages &amp;quot;haut niveau&amp;quot; (Python, Java, Javascript, ...), la mémoire est gérée automatiquement. Par exemple, Python détecte qu&#039;une liste ne sert plus à rien pour libérer la mémoire qu&#039;elle occupait. Dans les langages &amp;quot;bas niveau&amp;quot; (C), c&#039;est au programmeur de libérer explicitement la mémoire qu&#039;il utilise. (S&#039;il ne le fait pas, son programme risque d&#039;avoir des &amp;quot;fuites de mémoire&amp;quot;.) Rust est un nouveau (première version en 2010) langage de programmation. Un des objectifs de Rust est d&#039;offrir des garanties de sécurité sur la mémoire avec la notion d&#039;appartenance. Ces garanties sont testées à la compilation et ne dégradent donc pas l&#039;efficacité du programme final.&lt;br /&gt;
* Objectifs : l&#039;objectif, après s&#039;être familiarisé avec le langage Rust, est de comprendre à quoi correspond la notion de &amp;quot;ownership&amp;quot; (&amp;quot;appartenance&amp;quot;) et de l&#039;illustrer sur quelques exemples. Si l&#039;étudiant ne les connait pas, les notions de pointeurs (en C), d&#039;allocation sur la pile, sur le tas, et le concept de &amp;quot;ramasse miettes&amp;quot; (garbage collector&amp;quot; en anglais) seront des étapes préliminaires importantes.&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# The Rust Programming Language https://doc.rust-lang.org/book/title-page.html, avec en particulier la section 4, &amp;quot;Understanding Ownership&amp;quot;&lt;br /&gt;
*# Safe Systems Programming in Rust https://cacm.acm.org/magazines/2021/4/251364-safe-systems-programming-in-rust/fulltext&lt;br /&gt;
*# Rust Ownership by Example https://depth-first.com/articles/2020/01/27/rust-ownership-by-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Bitcoin &amp;amp; blockchain===&lt;br /&gt;
* Présentation : Baptiste Griva [[Fichier:VISI401-2022-Griva.pdf]]&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Les blockchain sont de plus en plus populaires. Avec l&#039;article de Satoshi Nakamoto, l&#039;étudiant devra comprendre son fonctionnement. On pourra dans un second temps s&#039;intéresser aux attaques habituelles face à une blockchain.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre le fonctionnement de la blockchain bitcoin&lt;br /&gt;
*# S&#039;intéresser à ses vulnérabilités (51% attack,...)&lt;br /&gt;
* Références: pour commencer https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
===Débruitage d&#039;image===&lt;br /&gt;
* Présentation : Lucas Policastro [[Fichier:VISI401-2022-Policastro.pdf]]&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La plupart des procédés d&#039;acquisition d&#039;image (typiquement capteurs CCD ou CMOS des caméras ou téléphones) ne sont pas parfaits et introduisent du bruit (des perturbations) dans les images résultantes. Ce bruit ressemble en général à une perturbation aléatoire locale par capteur, indépendante de ce  qui se passe sur un capteur proche. Peut-on alors améliorer la qualité visuelle d&#039;une photo dégradée par un tel bruit (typiquement gaussien) ? On regardera notamment les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
*# On pourra s&#039;appuyer sur les démos IPOL en ligne de ces algorithmes et leur description. http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
*# L&#039;algorithme des moyennes non locales est implémentable relativement facilement (même en numpy).&lt;br /&gt;
* Références:&lt;br /&gt;
** http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
** Le site https://www.ipol.im contient plein d&#039;algos de restauration d&#039;image (suivre Enhancement &amp;amp; Restoration, puis Denoising).&lt;br /&gt;
&lt;br /&gt;
===Sécurité des cartes RFID : le cas Mifare===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Paul Aubry [[Fichier:VISI401-2022-Aubry.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : les cartes RFID (Radio Frequency IDentification) sont des cartes à puce qui peuvent communiquer avec un lecteur distant (mais proche). De nombreuses cartes de transport en commun ou d&#039;ouverture de portes utilisent cette technologie. La carte Mifare classic, très répandue, utilise un protocole cryptographique pour éviter les &amp;quot;replay attacks&amp;quot; (enregistrer un échange pour le réutiliser) et le clonage de la carte. Le détails du protocole est longtemps resté un secret industriel, mais ceci n&#039;a pas empéché la découverte de *grosses* failles. Il est maintenant possible de cloner une carte Mifare en quelques secondes avec du matériel grand public.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre fonctionne la protection contre les &amp;quot;replay attacks&amp;quot; à partir de challenges cryptographiques&lt;br /&gt;
*# comprendre le protocole Mifare classic&lt;br /&gt;
*# comprendre les attaques sur le protocole&lt;br /&gt;
*# expérimenter avec des puces RFID existante *(facultatif)*&lt;br /&gt;
*# regarder les évolutions du protocole pour se protéger de ces attaques&lt;br /&gt;
* Référence : F. D. Garcia, P. van Rossum, R. Verdult, R. Wichers Schreur : &amp;quot;Wirelessly Pickpocketing a Mifare Classic Card&amp;quot; https://www.cs.ru.nl/~flaviog/publications/Pickpocketing.Mifare.pdf&lt;br /&gt;
&lt;br /&gt;
===Ingénierie Dirigée par les Modèles (IDM)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Alexandre Desbos [[Fichier:VISI-401-2022-Desbos.pdf]]&lt;br /&gt;
* Tuteur : Philippe Pernelle&lt;br /&gt;
* Résumé : l&#039;ingénierie dirigée par les modèles (ou MDE Model Driven Engineering) est une approche de conception basée sur la transformation de modèle sur des niveaux d&#039;abstraction différents (modèle, méta-modèle, méta-méta-modèle ...). l&#039;OMG propose une approche MDE basée sur 3 niveaux  d&#039;abstraction (CIM,PIM, PSM)  permettant de bâtir une application  en partant du niveaux d&#039;abstraction le plus haut (CIM) et en procédant par transformation / raffinement pour arriver au PSM puis à la génération de code. Il existe par ailleurs différents langages  (ATL, OCL) qui vont faciliter la transformation de modèle. A noter que la fondation Eclipse propose un environnement spécifique pour manipuler des modèles avec des implémentations d&#039;ATL et d&#039;OCL&lt;br /&gt;
* Objectifs :  L&#039;objectif est d&#039;étudier ces mécanismes de transformation / raffinement par l&#039;implémentation d&#039;un cas d&#039;étude dans eclipse en utilisant les langages ATL et OCL. Après une étude bibliographique des principes de MDA, l&#039;idée est de mettre en oeuvre dans Eclipse des extrait des modèles CIM, PIM et PSM proposés par les articles ci-dessous puis d&#039;essayer de construire des OCL et des scripts ATL afin de faciliter la transformation (sans aller jusqu&#039;à la génération de code)&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# These : https://hal.archives-ouvertes.fr/tel-01247610 (uniquement les pages 35 à 47)&lt;br /&gt;
*# Models and Mechanisms for implementing playful scenarios https://hal.archives-ouvertes.fr/hal-01372311&lt;br /&gt;
*# Digital Twin and Ecological Transition Integration in Training Process https://hal.archives-ouvertes.fr/hal-03375508&lt;br /&gt;
*# Eclipse Modeling Tools https://www.eclipse.org/downloads/packages/release/2021-12/r/eclipse-modeling-tools&lt;br /&gt;
&lt;br /&gt;
===[[Couvrir un polygone rectilinéaire avec des rectangles]]===&lt;br /&gt;
* Présentation : Maxent Bernier [[Fichier:VISI401-2022-Bernier.pdf]]&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Un polygone est dit rectilinéaire si les seuls angles qui apparaissent sont des angles droits. On considérera des polygones simples (i.e., sans trous et qui ne s&#039;auto-intersectent pas). Un tel polygone peut donc être recouvert par des carrés ou par des rectangles. On cherchera à écrire un algorithme qui trouve une couverture minimale (i.e., avec le moins de carrés/rectangles possibles). Dans le cas des carrés, on va pouvoir trouver un algorithme efficace pour ce problème. Malheureusement, le cas de la couverture minimale par les rectangles est NP-complète. &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme de recouvrement par des carrés&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet et le lien avec la couverture par les rectangles&lt;br /&gt;
*# Contourner la difficulté de la NP-complétude (heuristique ou cas des polygones orthogonalement convexes)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polygon_covering#cite_note-cr88-4  Couvertures de polygones (Wikipedia)]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/NP-completeness NP-complétude (Wikipedia)]]&lt;br /&gt;
** [[http://webdocs.cs.ualberta.ca/~joe/Preprints/Cover/paper.ps La couverture par rectangles est NP-complète]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires ===&lt;br /&gt;
&lt;br /&gt;
*Présentation : Emilien Boitouzet [[Fichier:VISI401-2022-Boitouzet.pdf]]&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
[[Fichier:automate_1.png]] [[Fichier:automate_2.jpeg]]&lt;br /&gt;
* Sujet : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser des calculs. Cependant les réalisations pratiques manquent, ce sujet se propose d’étudier l’utilisation des automates cellulaires dans les domaines suivant par exemple :&lt;br /&gt;
*# Modélisation des systèmes complexes (propagation des feux de forêt, processus de percolation, écoulement du sable ...)&lt;br /&gt;
*# Modélisation du comportement d&#039;un gaz&lt;br /&gt;
*# Système dynamique discret alternatif au modèle physique des équations aux dérivées partielles&lt;br /&gt;
*# Modélisation de la croissance de tissus cellulaires en biologie&lt;br /&gt;
*# Simulation de la croissance des cristaux&lt;br /&gt;
*# Correction automatique d’erreurs en imagerie&lt;br /&gt;
* Référence: https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
&lt;br /&gt;
=== Programmation bare-metal ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Andrien Montmayeur [[Fichier:VISI401-2022-Montmayeur.pdf]]&lt;br /&gt;
* Tuteur : Colin Weill-Duflos&lt;br /&gt;
* Sujet : l&#039;execution d&#039;un programme compilé peut parfois paraître un peu magique: on ne comprend pas forcément tout ce que fait le compilateur, et le système d&#039;exploitation fournit des abstractions bien pratiques. Comment se débrouille-t-on dans un contexte où il n&#039;y a pas de système d&#039;exploitation, comme certaines applications embarquées ou bien le système d&#039;exploitation lui-même?&lt;br /&gt;
* Objectifs : comprendre en détails la chaîne de compilation du C, l&#039;architecture d&#039;un executable et comment ce dernier est executé par une machine pour parvenir à faire executer un programme directement par un microprocesseur arm et interagir avec des périphériques simples.&lt;br /&gt;
* Référence:&lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Executable_and_Linkable_Format Architecture d&#039;un executable]&lt;br /&gt;
*#[https://aticleworld.com/c-compilation-process/ les étapes de compilation du C] (regarder notamment le linkage)&lt;br /&gt;
*# [https://azeria-labs.com/arm-data-types-and-registers-part-2/ débuter avec l&#039;assembleur arm]&lt;br /&gt;
&lt;br /&gt;
===GeoGebra et algèbre géométrique ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Nolann Sanmarti [[Fichier:VISI401-2022-Sanmarti.pdf]]&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Sujet : l&#039;algèbre géométrique émerge récemment comme un outil prometteur pour la synthèse d&#039;images : avec des points de contrôle, un produit, il est possible de représenter et de manipuler de manière efficace un ensemble d&#039;objets géométriques. Récemment, des bibliothèques c++ ont été développées. Ces bibliothèques autorisent une utilisation générique de l&#039;algèbre géométrique mais sont encore limitées par le manque d&#039;outils intéractifs adaptés. Par ailleurs, le logiciel de visualisation GeoGebra est un outil particulièrement utile pour la visualisation et la résolution de problèmes géométriques. Le but de ce projet serait de travailler un binding entre l&#039;algèbre géométrique et GeoGebra.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# se familiariser avec l&#039;algèbre géométrique, et l&#039;applet Javascript de GeoGebra,&lt;br /&gt;
*# identifier les objets et les opérations géométriques intéressantes à visualiser avec l&#039;algèbre géométrique,&lt;br /&gt;
*# implantations d&#039;une méthode générique permettant de générer des scripts dans l&#039;applet Javascript de GeoGebra.&lt;br /&gt;
* Références :&lt;br /&gt;
*# Projective geometric algebra: A new framework for doing euclidean geometry, Charles G. Gunn, 2019&lt;br /&gt;
*# [http://www.geogebra.org geogebra]&lt;br /&gt;
&lt;br /&gt;
== sujets 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
=== Comment Facebook gère ses données ?  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Pour une base de données, il est impossible d&#039;être cohérent, disponible tout le temps et partitionné. C&#039;est le fameux théorème CAP. Pour autant, les données de Facebook sont cohérentes, disponibles tout le temps, et réparties à travers le monde !? Impossible. Pour l&#039;étudiant, il faudra comprendre pourquoi c&#039;est impossible, et comment Facebook fait en pratique pour gérer ce problème.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le CAP théorème, et sa démonstration&lt;br /&gt;
*# Comprendre comment Facebook gère ce problème, et ses données d&#039;une manière générale&lt;br /&gt;
*# À définir, selon les questions que se pose l&#039;étudiant.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Théorème CAP :&lt;br /&gt;
*## https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_CAP&lt;br /&gt;
*## Brewer&#039;s Conjeture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services (https://awoc.wolski.fi/dlib/big-data/GiLy02-CAP.pdf)&lt;br /&gt;
*# Facebook Social Graph :&lt;br /&gt;
*## TAO : The power of the graph (https://engineering.fb.com/2013/06/25/core-data/tao-the-power-of-the-graph/)&lt;br /&gt;
*## TAO: Facebook’s Distributed Data Store for the Social Graph (https://www.usenix.org/system/files/conference/atc13/atc13-bronson.pdf)&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de calcul de l&#039;enveloppe convexe  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les ensembles convexes ont beaucoup de propriétés géométriques intéressantes, par exemple détecter la collision de deux ensembles convexes est &amp;quot;facile&amp;quot; algorithmiquement. Une étape fréquente dans beaucoup d&#039;algorithmes de traitements de données 2D/3D/nD est donc de calculer l&#039;enveloppe convexe d&#039;un nuage de points, c&#039;est-à-dire le plus petit ensemble convexe contenant ces points. Il existe de nombreux algorithmes de calcul d&#039;enveloppe convexe en 2D (Graham scan, Melkman, balayage de ligne (sweep-line), division-fusion, Chan&#039;s algorithm, Quickhull) et 3D (Chan&#039;s algorithm, Quickhull) et même nD (Quickhull notamment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
|Enveloppe convexe des points à coordonnées entières inclus dans une boule de diamètre 25&lt;br /&gt;
|----&lt;br /&gt;
[[Fichier:Qhull-25.png|300px]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Objectifs: il s&#039;agira de regarder quelques uns de ces algorithmes, d&#039;identifier leurs principales différences ainsi que leurs complexités théoriques et pratiques. On pourra aussi regarder plus précisément l&#039;algorithme Quickhull, dont l&#039;implémentation 2D est facile, et 3D accessible.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Barber, C. B., Dobkin, D. P., &amp;amp; Huhdanpaa, H. (1996). The quickhull algorithm for convex hulls. ACM Transactions on Mathematical Software (TOMS), 22(4), 469-483 [[https://www.researchgate.net/profile/Hannu_Huhdanpaa/publication/242414606_The_Quickhull_Algorithm_for_Convex_Hulls/links/54e5f6970cf2bff5a4f1e7db.pdf (PDF)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Graham_scan Algorithme de Graham (Wikipedia)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Convex_hull_algorithms Convex hull algorithms (Wikipedia)]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes autour des polyominos ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Un polyomino est une forme (sans trou) obtenue en collant des petits carrés de taille 1 par leurs bords. Des exemples connus sont par exemples les pièces du jeu tetris : il s&#039;agit de &amp;quot;tétramino&amp;quot;, c&#039;est à dire de polyomino formés de 4 carrés. Voici également les pentaminos, composés de 5 carrés :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:polyominos.png]]&lt;br /&gt;
&lt;br /&gt;
Une question récurrente est celle de la pavabilité : peut-on (en utilisant certains types de polyominos) paver un domaine donné.&lt;br /&gt;
Lorsque le domaine est fini, on peut utiliser une recherche exhaustive, mais lorsqu&#039;on veut paver tout le plan, le problème devient indécidable en général.&lt;br /&gt;
Nous nous intéresserons au cas le plus simple : est-il possible de paver le plan tout entier en utilisant des polyominos tous identiques, et en utilisant uniquement des translations.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pavages.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les définitions et notions de bases des polyominos, et en particulier leur représentation comme mot de contour&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance de polyominos en Python&lt;br /&gt;
*# comprendre la caractérisation des polyominos &amp;quot;exacts&amp;quot;, càd ceux qui pavent le plan&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance des polyominos exacts en Python&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Bibliographie initiale&lt;br /&gt;
*# [http://www.xprov.org/doc/these-XProvencal.pdf &amp;quot;Combinatoire des mots, géométrie discrète et pavages&amp;quot;], Xavier Provencal (chapitres 1 et 2)&lt;br /&gt;
*# [https://www.lama.univ-smb.fr/pagesmembres/vuillon/IanRAIRO.pdf &amp;quot;An algorithm for deciding if a polyomino tiles the plane by translation&amp;quot;], Ian Gambini et Laurent Vuillon&lt;br /&gt;
&lt;br /&gt;
=== Version algorithmique du lemme local de Lovász  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons un problème standard sur le routage de paquets dans des réseaux. Donnés un réseau et une collection de paquets, chacun venant avec un chemin dans le réseau (de la source vers la destination), le but est d’établir un planning qui minimise le temps pour que tous les paquets atteignent leur destination. Il est naturel de mesurer la qualité d’un tel planning en fonction de deux paramètres : la congestion c qui est le nombre maximum de paquets qui doivent emprunter une même arête du réseau et la dilatation d qui est le nombre maximum d’arêtes d’un chemin. En effet, il est facile de trouver un planning en temps c*d, et tout planning doit prendre comme temps au moins max(c,d). &lt;br /&gt;
&lt;br /&gt;
En 1994, Leighton, Maggsand et Rao ont montré qu’il existait toujours un planning en temps O(c+d). Malheureusement, ce résultat est basé sur le lemme local de Lovász. Il s’agit d’un résultat classique de combinatoire dont la preuve était à l’époque non constructive. Le problème précédent du routage de paquets n’est qu’une application de ce lemme parmi tant d’autres. En 2010, Moser et Tardos donnèrent un algorithme (en plus assez simple et efficace) pour le lemme local de Lovász.&lt;br /&gt;
&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le lemme local de Lovász et certaines de ses applications&lt;br /&gt;
*# Coder la version algorithmique de Moser et Tardos&lt;br /&gt;
*# Coder des applications du lemme (comme par exemple le routage de paquets)&lt;br /&gt;
* Bibliographie initiale : &lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Algorithmic_Lov%C3%A1sz_local_lemma Page wikipedia de la version algorithmique du lemme local de Lovász]&lt;br /&gt;
*# [http://www.scs.cmu.edu/afs/cs.cmu.edu/project/phrensy/pub/papers/LeightonMR94.pdf Application aux routage de paquets par Leighton, Maagsand et Rao]&lt;br /&gt;
*# [https://arxiv.org/pdf/0903.0544.pdf La version algorithmique du lemme local de Lovász par Moser et Tardos]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* Crypto-système de Merkle-Hellman et algorithme de Shamir, Ewan Rakotoanosy (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Reconstruction de surfaces à partir de nuages de points et de normales, Yohan Thépaut (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Algorithmes de super-résolution par apprentissage, Romain Théodet (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Autour de la question de la sensibilité des fonctions Booléennes, Christophe Carmagnac (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Structures de données purement fonctionnelles]], Loïc Dornel (Tuteur : Tom Hirschowitz)&lt;br /&gt;
* Automates cellulaires et décidabilité, Lucas Chardonnet (Tuteur : François Boussion)&lt;br /&gt;
&lt;br /&gt;
== sujets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
=== Crypto-système de Merkle-Hellman et algorithme de Shamir ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Le système de Merkle-Hellman est un système cryptographique de type &amp;quot;clé publique / clé privée&amp;quot;. Il a été inventé juste en 1978, après le système RSA (encore utilisé). Ce système a l&#039;avantage d&#039;être un peu plus simple, mais le **gros** désavantage d&#039;avoir été craqué par A. Shamir en 1984. L&#039;objectif est de comprendre le système, et la faille qu&#039;il contenait. Cela permettra de comprendre l&#039;algorithme de Shamir...&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Shamir, Adi (1984). &amp;quot;A polynomial-time algorithm for breaking the  basic Merkle - Hellman cryptosystem&amp;quot;. IEEE Transactions on Information  Theory. 30 (5): 699–704. doi:10.1109/SFCS.1982.5 [[http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.123.5840&amp;amp;rep=rep1&amp;amp;type=pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Reconstruction de surfaces à partir de nuages de points et de normales ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les lasers d&#039;acquisition de données 3d permettent de fabriquer des données qui approchent le bord d&#039;un objet 3D. Ces données sont souvent sous la forme d&#039;un nuage de points, doublé d&#039;un vecteur associé à chaque point et qui indique la direction normale à la surface de l&#039;objet. On parle de données de Hermite. Il existe des algorithmes dédiés, très efficaces et robustes, pour reconstruire une surface qui passe par ces points. L&#039;objectif est de comprendre les deux principales méthodes, l&#039;une appelée reconstruction de Poisson, l&#039;autre relié à la notion d&#039;indice (ou winding number), leurs qualités et leur défaut.&lt;br /&gt;
* Bibliographie initiale:&lt;br /&gt;
** KAZHDAN, Michael, BOLITHO, Matthew, et HOPPE, Hugues. Poisson surface reconstruction. In : Proceedings of the fourth Eurographics symposium on Geometry processing. 2006 [[http://faculty.cs.tamu.edu/schaefer/teaching/689_Fall2006/poissonrecon.pdf PDF]]&lt;br /&gt;
** BARILL, Gavin, DICKSON, Neil G., SCHMIDT, Ryan, et al. Fast winding numbers for soups and clouds. ACM Transactions on Graphics (TOG), 2018, vol. 37, no 4, p. 43. [[http://www.dgp.toronto.edu/projects/fast-winding-numbers/fast-winding-numbers-for-soups-and-clouds-siggraph-2018-compressed-barill-et-al.pdf]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de super-résolution par apprentissage ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La super-résolution consiste à, étant donné une image M x N, de fabriquer une image &amp;quot;zoomée&amp;quot; de taille kM x kN, où l&#039;information inventée est &amp;quot;crédible&amp;quot;. Le problème est évidemment mal posé mathématiquement, et du coup on rajoute de l&#039;information a priori : continuité des couleurs, continuité des structures géométriques, modèles probabilistes, moyennes non-locales (auto-similarités), etc. Avec l&#039;avènement du deep learning, des méthodes à base d&#039;apprentissage ont vu le jour. En gros, un réseau de neurones (CNN) apprend sur plein d&#039;images en &amp;quot;dézoomant&amp;quot; les images en entrées (facile, on sous-échantillonne), puis on utilise la fonction construite pour faire la super-résolution.&lt;br /&gt;
* L&#039;objectif est de regarder les méthodes de super-résolution, notamment celles par apprentissage et de voir leurs qualités et défauts. On pourra aussi les comparer avec des méthodes purement géométriques de super-résolution, ou des méthodes de moyennes non-locales.&lt;br /&gt;
* Ce sujet a été discuté avec Romain Théodet et conduit à un stage au LAMA pour combiner méthode géométrique et méthode par deep learning pour la super-résolution.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** SHI, Wenzhe, CABALLERO, Jose, HUSZÁR, Ferenc, et al. Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network. In : Proceedings of the IEEE conference on computer vision and pattern recognition. 2016. p. 1874-1883 [[https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf PDF]]?&lt;br /&gt;
** Lachaud, J.-O. and Kerautret, B., Geometric Total Variation for image vectorization, zooming and pixel art depixelizing, In : Proceedings of 5th Asian Conference on Pattern Recognition, 2019 [[Fichier:Paper-GTV.pdf]]&lt;br /&gt;
** [[https://github.com/kerautret/GTVimageVect Démos en ligne d&#039;algorithmes de super-résolution]]&lt;br /&gt;
&lt;br /&gt;
=== Autour de la question de la sensibilité des fonctions Booléennes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : On souhaite s’intéresser aux problèmes résolus par des algorithmes qui répondent par Vrai/Faux. Ces problèmes ont des entrées dans {0,1}^n (entrées codées en binaire) et une sortie dans {0,1) (Vrai ou Faux). Il est donc naturel de s’intéresser aux propriétés de ces fonctions Booléennes. Un certain nombre de paramètres intéressants ont été identifiés, comme la complexité du certificat (nombre minimal de bits nécessaires pour connaître la valeur de sortie), le degré (degré d’un polynôme qui correspond à la fonction sur les entrées Booléennes), la sensibilité (lnombre de bits qui, s’ils sont modifiés, impliquent une modification de la sortie), et bien d’autres (taille d’un arbre de décision, complexité en requêtes classiques ou quantiques, taille des coefficients de Fourier,…). En 1992, Nisan et Szegedy ont montré que tous ces paramètres sont reliés entre eux : si on connait l’un d’eux, par exemple le degré, on sait alors que n’importe quel autre de ces paramètres, par exemple la taille de l’arbre de décision, est limité à un certain intervalle de valeurs. Tous, sauf un : la sensibilité. Aucune méthode de preuve semblait impliquer que ce paramètre ne pouvait pas être beaucoup plus petit que les autres. Nisan et Szegedy posèrent alors la question de savoir si la sensibilité d’une fonction Bolléenne était reliée ou non aux autres paramètres classiques.&lt;br /&gt;
* Cet été, en 2019, un chercheur, Hao Huang, a montré dans une preuve de deux pages que la sensibilité ne pouvait pas être significativement plus petite que les autres paramètres, résolvant le problème posé 27 ans auparavant. Cette &amp;quot;sensitivity&amp;quot; conjecture a été attaquée en vain par de nombreux chercheurs renommés. Or, la nouvelle preuve est si simple qu’un chercheur l’a résumé en un [[https://twitter.com/BooleanAnalysis/status/1145837576487612416 tweet]].&lt;br /&gt;
* L&#039;objectif est de comprendre quels sont les paramètres classiques des fonctions Booléennes et des liens entre eux avant de s&#039;intéresser à la preuve de la conjecture. On pourra essayer de construire des fonctions extrémales (ie, avec des paramètres extrémaux dans leur plage de valeurs).&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** Le papier original où la question a été posée : N. Nisan, M. Szegedy. [[https://www.researchgate.net/profile/Mario_Szegedy/publication/2508255_On_the_Degree_of_Boolean_Functions_as_Real_Polynomials/links/09e41514878e7ef890000000.pdf On the degree of Boolean functions as real polynomials.]] Comput. Complexity, 4 (1992), 462–467.&lt;br /&gt;
** Une référence sur l&#039;analyse des fonctions Booléennes : Ryan O’Donnell. [[http://www.cs.tau.ac.il/~amnon/Classes/2016-PRG/Analysis-Of-Boolean-Functions.pdf Analysis of Boolean Functions]], Cambridge University Press, 2014  &lt;br /&gt;
** La preuve de la conjecture : Hao Huang. [[https://arxiv.org/abs/1907.00847 Induced subgraphs of hypercubes and a proof of the Sensitivity Conjecture]]. Annals of Mathematics, 190 (2019), 949-955&lt;br /&gt;
&lt;br /&gt;
=== Structures de données purement fonctionnelles ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;algorithmique est souvent enseignée sur des langages principalement impératifs tels que C. Les structures de données utilisées ne sont pas toujours évidentes à traduire vers les langages fonctionnels tels que OCaml. L&#039;étudiant s&#039;initiera aux structures de données fonctionnelles et aux concepts liés tels que la persistence, en suivant le livre « Purely functional data structures » d&#039;Okasaki.&lt;br /&gt;
* Liens&lt;br /&gt;
** [[https://www.cs.cmu.edu/~rwh/theses/okasaki.pdf La thèse d&#039;Okasaki (PDF)]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires et décidabilité ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Un automate cellulaire est un modèle de calcul discret, utilisé en dans différentes sciences (informatique, mathématiques, physique, biologie, etc;). Le jeu de la vie est l&#039;exemple emblématique d&#039;automate cellulaire. Les règles de calcul d&#039;un automate cellulaire, et de son évolution au cours du temps sont assez simples, mais mènent cependant à des problèmes complexes dont certains indécidables. Par exemple, déterminer si, étant donné des règles, on arrivera forcément, en un nombre fini d&#039;étapes, dans une configuration donné, quelque soit la configuration initiale (problème de nilopotence).&lt;br /&gt;
* L&#039;objectif est de s&#039;intéresser à ces problèmes indécidables dans les automates cellulaires et de produire un mini-cours sur le sujet.&lt;br /&gt;
* Références &lt;br /&gt;
** K. JARKKO, The nilpotency problem of one-dimensional cellular automata, SIAM J. Comput., Vol. 21, No. 3, pp. 571-586, June 1992.&lt;br /&gt;
** K. CULIK II, J. PACHL, S. Yu, On the limit sets ofcellular automata, SIAM J. Comput., 18 (1989), pp.831-842.&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le &amp;lt;b&amp;gt;lundi 27 mai&amp;lt;/b&amp;gt; de 9h à 11h en salle 115 du chablais.&lt;br /&gt;
Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Tristan_Porteries Tristan Porteries (PDF)]: problèmes avec mémoire restreinte, tuteur S. Tavenas&lt;br /&gt;
* R. Wagner: Reconstruction de surfaces à partir de nuages de points, tuteur J.-O. Lachaud&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Nils_Ruet Nils Ruet (PDF)]: LISP, tuteur P. Hyvernat&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Remy_Bouvier Rémy Bouvier (PDF)]: dancing links, tuteur P. Hyvernat&lt;br /&gt;
&lt;br /&gt;
== sujets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les sujets 1-3 sont encadrés par J.-O. Lachaud, les sujets 4-5 par P. Hyvernat, le sujet 6 par S. Tavenas.&lt;br /&gt;
Un encadrant encadre au max 2 étudiants.&lt;br /&gt;
&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;br /&gt;
# Une question naturelle est de savoir quels sont les problèmes qui peuvent être résolus avec un espace mémoire restreint. Plus formellement, on notera L l&#039;ensemble des problèmes que l&#039;on peut résoudre en utilisant seulement un espace mémoire logarithmique. On s&#039;intéresse à cette classe de problèmes, et plus particulièrement aux problèmes de connectivité dans un graphe.&lt;br /&gt;
#* [https://www.irif.fr/~sperifel/complexite.pdf Sylvain Périfel Complexité algorithmique] : Un livre récent qui survole une grosse partie de la complexité algorithmique. Le chapitre 4 concerne la complexité en espace.&lt;br /&gt;
#* [https://omereingold.files.wordpress.com/2014/10/sl.pdf Omer Reingold Undirected Connectivity in Log-Space]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le vendredi 25 mai 2018, à 9h. Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* ray-tracing au path-tracing, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Raphael_Tournafond.pdf Raphael Tournafond (PDF)]&lt;br /&gt;
* &amp;quot;dancing links&amp;quot; et NP complétude, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Ambroise_Decouttere.pdf Ambroise Decouttere (PDF)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
# Du ray-tracing au path-tracing: il s&#039;agit de comprendre l&#039;évolution des algorithmes de rendu (dits &amp;quot;réalistes&amp;quot;) et de mettre en avant les principales évolutions.&lt;br /&gt;
#* An introduction to ray tracing AS Glassner - 1989 - books.google.com&lt;br /&gt;
#* Energy redistribution path tracing, D Cline, J Talbot, P Egbert - ACM Transactions on Graphics (TOG), 2005 - dl.acm.org&lt;br /&gt;
#* et pour une introduction douce au ray-tracing: TP2 de http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO805/Tests/html/index.html&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; et NP complétude : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
#* [https://arxiv.org/pdf/1203.1895.pdf Classic Nintendo Games are (Computationally) Hard] : preuve que Super Mario et d&#039;autres jeux video classiques sont NP-complets &#039;&#039;Theoretical Computer Science, volume 586, 2015, pages 135–160.&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15708</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15708"/>
		<updated>2025-01-16T12:27:46Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* &amp;quot;tableau des suffixes&amp;quot; et transformée de Burrows-Wheeler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2024--2025: Pierre Hyvernat&lt;br /&gt;
* Responsable 2016--2024 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés (2024-2025) ==&lt;br /&gt;
=== [[Polyominos, pavages et solveurs SAT]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; les polyominos sont, comme les pièces de Tetris, des assemblages de petits carrés collés par leurs bords. Un ensemble de polyomino &#039;&#039;pavent&#039;&#039; une forment lorsqu&#039;on peut la remplir avec des ces polyominos, sans chevauchement et sans trou. Il existe des algorithmes spécifiques pour vérifier si on peut paver une forme, mais il est également possible de transformer la question en une grosse formule booléenne qui exprime que chaque case se retrouve bien recouverte, que chaque polyomino a bien la bonne forme, etc. On peut alors utiliser un &#039;&#039;solveur SAT&#039;&#039; qui cherche les solutions pour une telle formule.&lt;br /&gt;
&lt;br /&gt;
En écrivant des formules un peu plus complexes, on peut essayer de calculer le nombre de [https://en.wikipedia.org/wiki/Heesch%27s_problem Heesch&#039;s problem] d&#039;un polyomino. Il s&#039;agit du nombre d&#039;anneaux que l&#039;on peut mettre autour d&#039;un polyomino donné. Par exemple, la figure suivante montre un polyomino avec nombre de Heesh égal à 1 : le polyomino est entouré d&#039;un anneau (composé de copies de lui même), et on ne peut pas ajouter de second anneau supplémentaire (sans chevauchement et sans trou).&lt;br /&gt;
&lt;br /&gt;
[[File:heesch.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Le plus grand nombre de Heesh fini connu est ... 6 ! (Mais il n&#039;est pas atteint par un polyomino.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Comprendre l&#039;utilisation d&#039;un solveur SAT, par exemple en codant la résolution de sudoku.&lt;br /&gt;
# Coder (en Python ?) la génération de la formule associée à un problème de pavage, et la transformation d&#039;une solution booléenne en image finale.&lt;br /&gt;
# Coder (en Python ?) la génération de la formule associée à la question &amp;quot;le nombre de Heesh de ce polyomino est au moins égal à H&amp;quot;, et la transformation d&#039;une solution en image finale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tt&amp;gt;TODO: ref sur les solveur SAT&amp;lt;/tt&amp;gt;&lt;br /&gt;
# G. Kaplan, Heesch Numbers of Unmarked Polyforms : [https://isohedral.ca/heesch-numbers-of-unmarked-polyforms/ blog], [https://arxiv.org/pdf/2105.09438 article]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes de couplages parfaits et de mariages stables]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un [https://fr.wikipedia.org/wiki/Th%C3%A9orie_des_graphes graphe] est un ensemble de sommets et un ensemble d’arêtes sur ces sommets. Un [https://fr.wikipedia.org/wiki/Couplage_(th%C3%A9orie_des_graphes) couplage] dans un graphe est un ensemble d&#039;arêtes C, tels que toute paire d&#039;arête de C n&#039;a aucun sommet en commun. Un couplage est dit parfait s&#039;il touche tous les sommets du graphe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Graph.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Matching1.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Matching2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un couplage dans ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un couplage parfait dans ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les algorithmes d&#039;[https://fr.wikipedia.org/wiki/Algorithme_d%27Edmonds_pour_les_couplages Edmonds] et de [https://fr.wikipedia.org/wiki/Algorithme_de_Hopcroft-Karp Hopcroft-Karp] sont des algorithmes de recherche de couplage dans des graphes. &lt;br /&gt;
&lt;br /&gt;
Si le graphe que dans lequel on cherche un couplage correspond à un graphe d&#039;affectation avec des préférences, on se retrouve dans le cas du [https://fr.wikipedia.org/wiki/Probl%C3%A8me_des_mariages_stables problème des mariages stables]. C&#039;est par exemple le cas de l&#039;affectation des places dans l&#039;enseignement supérieur où il faut affecter des étudiants dans les différents établissements de tels sorte à respecter les choix des étudiants et des établissements. L&#039;[https://fr.wikipedia.org/wiki/Algorithme_de_Gale_et_Shapley algorithme de Gale et Shapley] permet de résoudre efficacement ce problème.&lt;br /&gt;
&lt;br /&gt;
Dans ce sujet, il est proposé de ce pencher sur ces différents problèmes et d&#039;implémenter les algorithmes de résolutions présentés.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# comprendre le problème du mariage stable,&lt;br /&gt;
# implémenter les algorithmes de Gale-Shapley,&lt;br /&gt;
# implémenter les algorithmes de Hopcroft-Karp,&lt;br /&gt;
# comprendre la preuve de correction de l&#039;algorithme de Hopcroft-Karp,&lt;br /&gt;
# implémenter l&#039;algorithme d&#039;Edmonds.&lt;br /&gt;
# éventuellement implémenter d&#039;autres algorithmes liés aux couplages parfaits comme l&#039;algorithme hongrois ou l&#039;algorithme de Christofides.&lt;br /&gt;
&lt;br /&gt;
=== [[Stéganographie &amp;quot;BPC&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; la [https://fr.wikipedia.org/wiki/St%C3%A9ganographie stéganographie] consiste à dissimuler de l&#039;information dans un message d&#039;apparence anodine. On peut par exemple modifier légèrement les couleurs des pixels d&#039;une image, on l&#039;intensité des sons d&#039;une fichier sonore de manière imperceptible par un humain. Les destinataires peuvent alors récupérer cette information caché en appliquant la méthode inverse.&lt;br /&gt;
&lt;br /&gt;
La méthode la plus simple consiste à utiliser le bit de poids faible des couleurs RVB de chaque pixel d&#039;une image. La différence visuelle est tellement petite qu&#039;on ne peut pas la distinguer à l’œil nu. Par exemple, les deux couleurs suivantes sont différentes uniquement sur les bits de poids faible des composantes RVB.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:bleu1.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:bleu2.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;#237fd1&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;#227ed0&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour augmenter la quantité de données que l&#039;on peut dissimuler, on peut utiliser les 2 bits de poids faible, ou les 3 bits de poids faible, etc. Plus on utilise de bits, plus les distorsions dans l&#039;image deviennent visibles. Une manière plus intelligente est de ne remplacer des bits que dans les endroits &amp;quot;bruités&amp;quot; de l&#039;image. Les distorsions deviennent alors plus difficiles à distinguer. C&#039;est la stéganographie &amp;quot;complexité des plans de bits&amp;quot; (BPCS = &amp;quot;Bit Plane Complexity Steganography&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;exemple suivant, l&#039;intégralité des 9605 lignes / 37860 mots / 239347 octets (avant compression) de la pièce &amp;quot;Cyrano de Bergerac&amp;quot; est dissimulée dans l&#039;image de gauche.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:image-orig.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:LSBS.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:BPCS.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;image [https://pixabay.com/fr/photos/montagnes-lac-nature-paysage-hiver-8025144/ originale]&amp;lt;br&amp;gt;(320x240 pixels)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;stéganographie LSB&amp;lt;br&amp;gt;(avec les 3 bits de poids faible)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;stéganographie BPC &amp;lt;br&amp;gt;(paramètres &amp;lt;tt&amp;gt;0,10,20,30,999,999,999,999&amp;lt;/tt&amp;gt;)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Si vous regardez attentivement, les pixels du ciel ou de la surface de l&#039;eau sont nettement plus modifiés dans l&#039;image centrale que dans l&#039;image de droite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter (par exemple en Python) la stéganographie par bits de poids faible sur des images,&lt;br /&gt;
# comprendre et implémenter la stéganographie par plans de complexité,&lt;br /&gt;
# comparer les 2 approches sur des exemples&lt;br /&gt;
# si le temps le permet, regarder les technique de &amp;quot;stéganalyse&amp;quot; qui permettent de détecter la présence d&#039;informations dissimulées dans une image.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# [https://web.archive.org/web/20120905034757/http://www.eece.maine.edu/~eason/steg/SPIE98.pdf Principle and applications of BPCS-Steganography]&lt;br /&gt;
# [https://web.archive.org/web/20110815205714/http://etd.lib.ttu.edu/theses/available/etd-06272008-31295018922590/unrestricted/31295018922590.pdf High capacity data hiding system using BPCS steganography]&lt;br /&gt;
&lt;br /&gt;
=== [[&amp;quot;tableau des suffixes&amp;quot; et transformée de Burrows-Wheeler]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le [https://fr.wikipedia.org/wiki/Tableau_des_suffixes tableau des suffixes] est une structure de données qui permet de répondre très rapidement à des requêtes du style &amp;quot;est-ce que la chaine &#039;&#039;p&#039;&#039; apparait dans la chaine &#039;&#039;S&#039;&#039; ?&amp;quot; La chaine &#039;&#039;p&#039;&#039; pourrait être une &amp;quot;petite&amp;quot; chaine de quelques milliers de caractères, alors que la chaine &#039;&#039;S&#039;&#039; pourrait être une &amp;quot;grosse&amp;quot; chaine de plusieurs milliard de caractères. Les biologistes utilisent des requêtes de ce genre lorsqu&#039;ils recherchent des motifs &#039;&#039;p&#039;&#039; dans l&#039;ADN &#039;&#039;S&#039;&#039;. Lorsque &#039;&#039;S&#039;&#039; ne change pas, l&#039;arbre des suffixes permet de répondre à la requête précédente avec un nombre d&#039;opérations beaucoup plus faible que la recherche naïve qui devrait regarder tous les caractères de &#039;&#039;S&#039;&#039; !&lt;br /&gt;
&lt;br /&gt;
Cette structure de données est également reliée à la transformée de Burrows-Wheeler, à la base de l&#039;algorithme de compression &amp;lt;tt&amp;gt;bzip&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# Le calcul naïf du tableau des suffixes se fait en quelques lignes de Python. Le premier objectif sera d&#039;utiliser cette version pour expérimenter avec les algorithmes de recherche simples sur le tableaux des suffixes, et de comparer les temps d&#039;exécution avec ceux des algorithmes standard. &lt;br /&gt;
# Transformer un tableau de suffixes en transformée de Burrows-Wheeler est également l&#039;affaire de quelques lignes de Python. Le second objectif sera donc de coder les quelques fonctionnalités manquantes pour compresser, et décompresser des chaines de caractères ; et de comparer ceci avec d&#039;autres algorithmes existants.&lt;br /&gt;
# le tableau des suffixes est plus petit que l&#039;arbre des suffixes (variante un peu plus rapide, mais plus complexe), et la transformée de Burrows-Wheeler est encore plus petite. L&#039;idée serait de comprendre d&#039;où viennent ces différences et comment passer d&#039;une structure à l&#039;autre, et comment les améliorer.&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# les liens wikipédia (plutôt en anglais) cités ci dessus sont un bon début&lt;br /&gt;
# [https://www.cs.jhu.edu/~langmea/resources/bwt_fm.pdf Introduction to the Burrows-Wheeler Transform and FM Index]&lt;br /&gt;
# les [https://www.youtube.com/playlist?list=PL2mpR0RYFQsDFNyRsTNcWkFTHTkxWREeb vidéos de Ben Langmead] sur le sujet&lt;br /&gt;
# Dan Gusfield, &#039;&#039;Algorithms on Strings, Trees and Sequences&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===[[le problème du collectionneur]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutrice :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; un collectionneur cherche à avoir toutes les vignettes d’une série&lt;br /&gt;
représentant des joueurs de foot. Chaque vignette représente un joueur,&lt;br /&gt;
il y a en tout &#039;&#039;N&#039;&#039; joueurs. Pour avoir une vignette, on doit acheter un&lt;br /&gt;
paquet de céréales. Chaque paquet de céréales contient une vignette&lt;br /&gt;
choisie de manière uniforme et indépendante au hasard parmi ces &#039;&#039;N&#039;&#039;&lt;br /&gt;
possibilités. Combien faudra t il en moyenne acheter de paquets de&lt;br /&gt;
céréales afin d&#039;obtenir toute la série des &#039;&#039;N&#039;&#039; joueurs de foot?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
# Ecrire un programme qui simule l&#039;expérience&lt;br /&gt;
# en déduire une approximation le nombre moyen de paquets de céréales à acheter&lt;br /&gt;
# Résoudre le problème théoriquement&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
https://fr.wikipedia.org/wiki/Probl%C3%A8me_du_collectionneur_de_vignettes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Jeu de la vie]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Romain Negro&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le [https://fr.wikipedia.org/wiki/Jeu_de_la_vie jeu de la vie] est un [https://fr.wikipedia.org/wiki/Automate_cellulaire automate cellulaire] inventé dans les années 70 par John Conway dont les&lt;br /&gt;
règles sont simples, mais dont des comportements macroscopiques complexes peuvent apparaître. Des simples structures immobiles aux structures semblant dotées d&#039;intelligence, le jeu de la vie est&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Turing-complet Turing-complet].&lt;br /&gt;
&lt;br /&gt;
Le jeu de la vie se présente ainsi : sur une grille infinie, il y a des cellules vivantes ou mortes. A chaque étape, chaque cellule naît, reste en vie ou meurt en fonction de son 8-voisinage. Une cellule naît si&lt;br /&gt;
exactement 3 de ses voisins sont vivants. Une cellule reste en vie son état si celle-ci a entre 2 et 3 voisins vivants. Dans les autres cas, la cellule meurt.&lt;br /&gt;
&lt;br /&gt;
Afin de faire fonctionner cet automate, l&#039;approche naïve consiste à chaque étape à calculer pour chaque cellule son état suivant. Cependant, celle-ci ne fonctionne que sur une grille finie et n&#039;est pas très&lt;br /&gt;
efficace pour de plus grandes grilles.&lt;br /&gt;
&lt;br /&gt;
Certaines approches permettent de travailler sur des grilles de taille infinie (en théorie), voire de pouvoir rapidement se déplacer de plusieurs étapes dans le temps. D&#039;autres approches permettent même de&lt;br /&gt;
s&#039;affranchir de la notion de grille et d&#039;étapes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter (en Python ou Javascript) une version naïve du jeu de la vie sur une grille finie,                                                                                                                    &lt;br /&gt;
# proposer une implémentation permettant d&#039;effectuer la simulation sur une grille infinie,                                                                                                                          &lt;br /&gt;
# comprendre et si le temps le permet implémenter la simulation en utilisant une approche en arbre.                                                                                                                 &lt;br /&gt;
# s&#039;il reste encore du temps, comprendre comment fonctionne l&#039;approche continue du jeu de la vie                                                                                                                    &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# Liens wikipédia cités dans le résumé                                                                                                                                                                              &lt;br /&gt;
# [https://johnhw.github.io/hashlife/index.md.html Implémentation utilisant des arbres]                                                                                                                             &lt;br /&gt;
# [https://arxiv.org/pdf/2005.03742 Lenia : jeu de la vie &amp;quot;continu&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Modèle proie-prédateur sans équations]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
les équations de prédation de Lotka-Volterra sont relativement simples sur le plan mathématiques et permettent d&#039;étudier l&#039;évolution d&#039;une population de proies (typiquement des lapins) et de prédateurs (typiquement des renards). Avec le bon jeu de paramètres, on peut observer des cycles dans le nombre de proies et de prédateurs. L&#039;objectif de ce projet est d&#039;observer de tels cycles sans utiliser d&#039;équations, mais des déplacements aléatoires sur une grille à deux dimensions.&lt;br /&gt;
&lt;br /&gt;
Les règles de base sont les suivantes:&lt;br /&gt;
*A chaque itération, chaque individu se déplace d&#039;une case dans une direction aléatoire(haut/bas/droite/gauche).&lt;br /&gt;
*Les proies sont mangées par les prédateurs lorsqu&#039;elles se retrouvent au même endroit que l&#039;un d&#039;eux.&lt;br /&gt;
*Les proies(respectivement prédateurs) voient leur population doubler toute les &amp;lt;tt&amp;gt;nr_proie&amp;lt;/tt&amp;gt; (resp. &amp;lt;tt&amp;gt;nr_pred&amp;lt;/tt&amp;gt;) itérations.&lt;br /&gt;
*On suppose que les proies ont toujours à manger.&lt;br /&gt;
*Si un prédateur n&#039;a pas mangé pendant &amp;lt;tt&amp;gt;n_faim&amp;lt;/tt&amp;gt; itérations, il meurt.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du projet est le suivant:&lt;br /&gt;
&lt;br /&gt;
#Ecrire un programme en python qui suit les règles de base.&lt;br /&gt;
#Visualiser l&#039;évolution du nombre de proies et de prédateurs en fonction du temps, pour différentes valeurs de &amp;lt;tt&amp;gt;nr_proie&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;nr_pred&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;n_faim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Remarque :&#039;&#039; Des précisions supplémentaires seront discutées avec le tuteur au faire et à mesure de l&#039;avancement du projet pour concrétiser l&#039;implémentation des règles de base.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;références:&#039;&#039;&#039;&lt;br /&gt;
#[https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra Les équations de prédation de Lotka-Volterra]&lt;br /&gt;
#Exemple de déplacement aléatoire: [https://fr.wikipedia.org/wiki/Mouvement_brownien Le Mouvement Brownien]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Où placer une (ou plusieurs) antennes 5G dans un village ?]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Dorin Bucur&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Cette question, présentée ici de manière simplifiée, est très importante et&lt;br /&gt;
apparaît sous différentes formes dans la planification économique. Sa&lt;br /&gt;
modélisation repose sur des notions mathématiques relativement simples, et sa&lt;br /&gt;
résolution implique généralement l&#039;utilisation d&#039;algorithmes numériques&lt;br /&gt;
d&#039;optimisation. De manière simple, on devra chercher à positionner un certain&lt;br /&gt;
nombre de points dans un ensemble donné du plan, de telle manière à ce que la&lt;br /&gt;
moyenne de la distance à l&#039;ensemble des points soit minimale.&lt;br /&gt;
&lt;br /&gt;
En s’appuyant sur les deux références fournies, l’étudiant devra :&lt;br /&gt;
&lt;br /&gt;
*Ecrire un modèle mathématique associé à ce problème&lt;br /&gt;
*Comprendre le rôle des diagrammes de Voronoï&lt;br /&gt;
*Effectuer une analyse élémentaire de quelques cas simples (par exemple : une antenne dans un village circulaire, deux antennes dans le même village, etc.)&lt;br /&gt;
*Proposer une méthode de résolution numérique en développant un algorithme d&#039;optimisation de type gradient, implémenté en Python.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références:&#039;&#039;&#039;&lt;br /&gt;
#https://www.palais-decouverte.fr/fileadmin/fileadmin_Palais/fichiersContribs/au-programme/expos-permanentes/mathematiques/Bloc_Formes/pdf_revue/359_nov_dec_2k8.pdf&lt;br /&gt;
#https://doi.org/10.1080/00029890.2002.11919849&lt;br /&gt;
&lt;br /&gt;
===[[Introduction à la complexité et sa formalisation]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; La notion de complexité d&#039;un programme est une abstraction du temps que va mettre le programme pour calculer son résultat. Plus qu&#039;une durée concrète, mesurée en secondes, il s&#039;agit avant tout de prédire le comportement du programme sur des paramètres de plus en plus grands. Des travaux assez récents développent des langages où la complexité peut être contrôlée directement. L&#039;objectif serait de découvrir sur des exemples simples la notion de complexité, et de regarder comment fonctionnent ces langages qui permettent de l&#039;internaliser.&lt;br /&gt;
&lt;br /&gt;
Ces langages utilisent un style de programmation assez différent des langages utilisé en L1 (comme Python) : ce sont des langages dits &#039;&#039;fonctionnels&#039;&#039;. La première partie du projet sera donc la découverte d&#039;un langage fonctionnel, [https://ocaml.org/ OCaml]. La seconde partie consistera à explorer le langage expérimental [https://github.com/jonsterling/agda-calf calf], le &#039;&#039;cost-aware logical framework&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
* [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Calcul des valeurs de Grundy pour des jeux octaux]] par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* [[Modélisation de la ruine du joueur]] par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* [[Calibration de caméra et reconstruction 3D]] par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
=== [[Surfaces polygonales et surfaces de subdivision]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
=== [[Calcul des valeurs de Grundy pour des jeux octaux]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
=== [[Planarité de graphes]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Calibration de caméra et reconstruction 3D]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15707</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15707"/>
		<updated>2025-01-16T10:30:07Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2024--2025: Pierre Hyvernat&lt;br /&gt;
* Responsable 2016--2024 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés (2024-2025) ==&lt;br /&gt;
=== [[Polyominos, pavages et solveurs SAT]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; les polyominos sont, comme les pièces de Tetris, des assemblages de petits carrés collés par leurs bords. Un ensemble de polyomino &#039;&#039;pavent&#039;&#039; une forment lorsqu&#039;on peut la remplir avec des ces polyominos, sans chevauchement et sans trou. Il existe des algorithmes spécifiques pour vérifier si on peut paver une forme, mais il est également possible de transformer la question en une grosse formule booléenne qui exprime que chaque case se retrouve bien recouverte, que chaque polyomino a bien la bonne forme, etc. On peut alors utiliser un &#039;&#039;solveur SAT&#039;&#039; qui cherche les solutions pour une telle formule.&lt;br /&gt;
&lt;br /&gt;
En écrivant des formules un peu plus complexes, on peut essayer de calculer le nombre de [https://en.wikipedia.org/wiki/Heesch%27s_problem Heesch&#039;s problem] d&#039;un polyomino. Il s&#039;agit du nombre d&#039;anneaux que l&#039;on peut mettre autour d&#039;un polyomino donné. Par exemple, la figure suivante montre un polyomino avec nombre de Heesh égal à 1 : le polyomino est entouré d&#039;un anneau (composé de copies de lui même), et on ne peut pas ajouter de second anneau supplémentaire (sans chevauchement et sans trou).&lt;br /&gt;
&lt;br /&gt;
[[File:heesch.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Le plus grand nombre de Heesh fini connu est ... 6 ! (Mais il n&#039;est pas atteint par un polyomino.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Comprendre l&#039;utilisation d&#039;un solveur SAT, par exemple en codant la résolution de sudoku.&lt;br /&gt;
# Coder (en Python ?) la génération de la formule associée à un problème de pavage, et la transformation d&#039;une solution booléenne en image finale.&lt;br /&gt;
# Coder (en Python ?) la génération de la formule associée à la question &amp;quot;le nombre de Heesh de ce polyomino est au moins égal à H&amp;quot;, et la transformation d&#039;une solution en image finale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tt&amp;gt;TODO: ref sur les solveur SAT&amp;lt;/tt&amp;gt;&lt;br /&gt;
# G. Kaplan, Heesch Numbers of Unmarked Polyforms : [https://isohedral.ca/heesch-numbers-of-unmarked-polyforms/ blog], [https://arxiv.org/pdf/2105.09438 article]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes de couplages parfaits et de mariages stables]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un [https://fr.wikipedia.org/wiki/Th%C3%A9orie_des_graphes graphe] est un ensemble de sommets et un ensemble d’arêtes sur ces sommets. Un [https://fr.wikipedia.org/wiki/Couplage_(th%C3%A9orie_des_graphes) couplage] dans un graphe est un ensemble d&#039;arêtes C, tels que toute paire d&#039;arête de C n&#039;a aucun sommet en commun. Un couplage est dit parfait s&#039;il touche tous les sommets du graphe.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Graph.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Matching1.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Matching2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un couplage dans ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Un couplage parfait dans ce graphe&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les algorithmes d&#039;[https://fr.wikipedia.org/wiki/Algorithme_d%27Edmonds_pour_les_couplages Edmonds] et de [https://fr.wikipedia.org/wiki/Algorithme_de_Hopcroft-Karp Hopcroft-Karp] sont des algorithmes de recherche de couplage dans des graphes. &lt;br /&gt;
&lt;br /&gt;
Si le graphe que dans lequel on cherche un couplage correspond à un graphe d&#039;affectation avec des préférences, on se retrouve dans le cas du [https://fr.wikipedia.org/wiki/Probl%C3%A8me_des_mariages_stables problème des mariages stables]. C&#039;est par exemple le cas de l&#039;affectation des places dans l&#039;enseignement supérieur où il faut affecter des étudiants dans les différents établissements de tels sorte à respecter les choix des étudiants et des établissements. L&#039;[https://fr.wikipedia.org/wiki/Algorithme_de_Gale_et_Shapley algorithme de Gale et Shapley] permet de résoudre efficacement ce problème.&lt;br /&gt;
&lt;br /&gt;
Dans ce sujet, il est proposé de ce pencher sur ces différents problèmes et d&#039;implémenter les algorithmes de résolutions présentés.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# comprendre le problème du mariage stable,&lt;br /&gt;
# implémenter les algorithmes de Gale-Shapley,&lt;br /&gt;
# implémenter les algorithmes de Hopcroft-Karp,&lt;br /&gt;
# comprendre la preuve de correction de l&#039;algorithme de Hopcroft-Karp,&lt;br /&gt;
# implémenter l&#039;algorithme d&#039;Edmonds.&lt;br /&gt;
# éventuellement implémenter d&#039;autres algorithmes liés aux couplages parfaits comme l&#039;algorithme hongrois ou l&#039;algorithme de Christofides.&lt;br /&gt;
&lt;br /&gt;
=== [[Stéganographie &amp;quot;BPC&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; la [https://fr.wikipedia.org/wiki/St%C3%A9ganographie stéganographie] consiste à dissimuler de l&#039;information dans un message d&#039;apparence anodine. On peut par exemple modifier légèrement les couleurs des pixels d&#039;une image, on l&#039;intensité des sons d&#039;une fichier sonore de manière imperceptible par un humain. Les destinataires peuvent alors récupérer cette information caché en appliquant la méthode inverse.&lt;br /&gt;
&lt;br /&gt;
La méthode la plus simple consiste à utiliser le bit de poids faible des couleurs RVB de chaque pixel d&#039;une image. La différence visuelle est tellement petite qu&#039;on ne peut pas la distinguer à l’œil nu. Par exemple, les deux couleurs suivantes sont différentes uniquement sur les bits de poids faible des composantes RVB.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:bleu1.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:bleu2.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;#237fd1&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;#227ed0&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour augmenter la quantité de données que l&#039;on peut dissimuler, on peut utiliser les 2 bits de poids faible, ou les 3 bits de poids faible, etc. Plus on utilise de bits, plus les distorsions dans l&#039;image deviennent visibles. Une manière plus intelligente est de ne remplacer des bits que dans les endroits &amp;quot;bruités&amp;quot; de l&#039;image. Les distorsions deviennent alors plus difficiles à distinguer. C&#039;est la stéganographie &amp;quot;complexité des plans de bits&amp;quot; (BPCS = &amp;quot;Bit Plane Complexity Steganography&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;exemple suivant, l&#039;intégralité des 9605 lignes / 37860 mots / 239347 octets (avant compression) de la pièce &amp;quot;Cyrano de Bergerac&amp;quot; est dissimulée dans l&#039;image de gauche.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:image-orig.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:LSBS.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:BPCS.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;image [https://pixabay.com/fr/photos/montagnes-lac-nature-paysage-hiver-8025144/ originale]&amp;lt;br&amp;gt;(320x240 pixels)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;stéganographie LSB&amp;lt;br&amp;gt;(avec les 3 bits de poids faible)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;stéganographie BPC &amp;lt;br&amp;gt;(paramètres &amp;lt;tt&amp;gt;0,10,20,30,999,999,999,999&amp;lt;/tt&amp;gt;)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
Si vous regardez attentivement, les pixels du ciel ou de la surface de l&#039;eau sont nettement plus modifiés dans l&#039;image centrale que dans l&#039;image de droite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter (par exemple en Python) la stéganographie par bits de poids faible sur des images,&lt;br /&gt;
# comprendre et implémenter la stéganographie par plans de complexité,&lt;br /&gt;
# comparer les 2 approches sur des exemples&lt;br /&gt;
# si le temps le permet, regarder les technique de &amp;quot;stéganalyse&amp;quot; qui permettent de détecter la présence d&#039;informations dissimulées dans une image.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# [https://web.archive.org/web/20120905034757/http://www.eece.maine.edu/~eason/steg/SPIE98.pdf Principle and applications of BPCS-Steganography]&lt;br /&gt;
# [https://web.archive.org/web/20110815205714/http://etd.lib.ttu.edu/theses/available/etd-06272008-31295018922590/unrestricted/31295018922590.pdf High capacity data hiding system using BPCS steganography]&lt;br /&gt;
&lt;br /&gt;
=== [[&amp;quot;tableau des suffixes&amp;quot; et transformée de Burrows-Wheeler]] ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le [https://fr.wikipedia.org/wiki/Tableau_des_suffixes tableau des suffixes] est une structure de données qui permet de répondre très rapidement à des requêtes du style &amp;quot;est-ce que la chaine &#039;&#039;p&#039;&#039; apparait dans la chaine &#039;&#039;S&#039;&#039; ?&amp;quot; La chaine &#039;&#039;p&#039;&#039; pourrait être une &amp;quot;petite&amp;quot; chaine de quelques milliers de caractères, alors que la chaine &#039;&#039;S&#039;&#039; pourrait être une &amp;quot;grosse&amp;quot; chaine de plusieurs milliard de caractères. Les biologistes utilisent des requêtes de ce genre lorsqu&#039;ils recherchent des motifs &#039;&#039;p&#039;&#039; dans l&#039;ADN &#039;&#039;S&#039;&#039;. Lorsque &#039;&#039;S&#039;&#039; ne change pas, l&#039;arbre des suffixes permet de répondre à la requête précédente avec un nombre d&#039;opérations beaucoup plus faible que la recherche naïve qui devrait regarder tous les caractères de &#039;&#039;S&#039;&#039; !&lt;br /&gt;
&lt;br /&gt;
Cette structure de données est également reliée à la transformée de Burrows-Wheeler, à la base de l&#039;algorithme de compression &amp;lt;tt&amp;gt;bzip&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# Le calcul naïf du tableau des suffixes se fait en quelques lignes de Python. Le premier objectif sera d&#039;utiliser cette version pour expérimenter avec les algorithmes de recherche simples sur le tableaux des suffixes, et de comparer les temps d&#039;exécution avec ceux des algorithmes standard. &lt;br /&gt;
# Transformer un tableau de suffixes en transformée de Burrows-Wheeler est également l&#039;affaire de quelques lignes de Python. Le second objectif sera donc de coder les quelques fonctionnalités manquantes pour compresser, et décompresser des chaines de caractères ; et de comparer ceci avec d&#039;autres algorithmes existants.&lt;br /&gt;
# le tableau des suffixes est plus petit que l&#039;arbre des suffixes (variante un peu plus rapide, mais plus complexe), et la transformée de Burrows-Wheeler est encore plus petite. L&#039;idée serait de comprendre d&#039;où viennent ces différences et comment passer d&#039;une structure à l&#039;autre, et comment les améliorer.&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# les liens wikipédia (plutôt en anglais) cités ci dessus sont un bon début&lt;br /&gt;
# [https://www.cs.jhu.edu/~langmea/resources/bwt_fm.pdf Introduction to the Burrows-Wheeler Transform and FM Index]&lt;br /&gt;
# les [https://www.youtube.com/playlist?list=PL2mpR0RYFQsDFNyRsTNcWkFTHTkxWREeb vidéos de Ben Langmead] sur le sujet&lt;br /&gt;
# Dan Gusfield, &#039;&#039;Algorithms on Strings, Trees and Sequences&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[le problème du collectionneur]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutrice :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; un collectionneur cherche à avoir toutes les vignettes d’une série&lt;br /&gt;
représentant des joueurs de foot. Chaque vignette représente un joueur,&lt;br /&gt;
il y a en tout &#039;&#039;N&#039;&#039; joueurs. Pour avoir une vignette, on doit acheter un&lt;br /&gt;
paquet de céréales. Chaque paquet de céréales contient une vignette&lt;br /&gt;
choisie de manière uniforme et indépendante au hasard parmi ces &#039;&#039;N&#039;&#039;&lt;br /&gt;
possibilités. Combien faudra t il en moyenne acheter de paquets de&lt;br /&gt;
céréales afin d&#039;obtenir toute la série des &#039;&#039;N&#039;&#039; joueurs de foot?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
# Ecrire un programme qui simule l&#039;expérience&lt;br /&gt;
# en déduire une approximation le nombre moyen de paquets de céréales à acheter&lt;br /&gt;
# Résoudre le problème théoriquement&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
https://fr.wikipedia.org/wiki/Probl%C3%A8me_du_collectionneur_de_vignettes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Jeu de la vie]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Romain Negro&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le [https://fr.wikipedia.org/wiki/Jeu_de_la_vie jeu de la vie] est un [https://fr.wikipedia.org/wiki/Automate_cellulaire automate cellulaire] inventé dans les années 70 par John Conway dont les&lt;br /&gt;
règles sont simples, mais dont des comportements macroscopiques complexes peuvent apparaître. Des simples structures immobiles aux structures semblant dotées d&#039;intelligence, le jeu de la vie est&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Turing-complet Turing-complet].&lt;br /&gt;
&lt;br /&gt;
Le jeu de la vie se présente ainsi : sur une grille infinie, il y a des cellules vivantes ou mortes. A chaque étape, chaque cellule naît, reste en vie ou meurt en fonction de son 8-voisinage. Une cellule naît si&lt;br /&gt;
exactement 3 de ses voisins sont vivants. Une cellule reste en vie son état si celle-ci a entre 2 et 3 voisins vivants. Dans les autres cas, la cellule meurt.&lt;br /&gt;
&lt;br /&gt;
Afin de faire fonctionner cet automate, l&#039;approche naïve consiste à chaque étape à calculer pour chaque cellule son état suivant. Cependant, celle-ci ne fonctionne que sur une grille finie et n&#039;est pas très&lt;br /&gt;
efficace pour de plus grandes grilles.&lt;br /&gt;
&lt;br /&gt;
Certaines approches permettent de travailler sur des grilles de taille infinie (en théorie), voire de pouvoir rapidement se déplacer de plusieurs étapes dans le temps. D&#039;autres approches permettent même de&lt;br /&gt;
s&#039;affranchir de la notion de grille et d&#039;étapes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
# implémenter (en Python ou Javascript) une version naïve du jeu de la vie sur une grille finie,                                                                                                                    &lt;br /&gt;
# proposer une implémentation permettant d&#039;effectuer la simulation sur une grille infinie,                                                                                                                          &lt;br /&gt;
# comprendre et si le temps le permet implémenter la simulation en utilisant une approche en arbre.                                                                                                                 &lt;br /&gt;
# s&#039;il reste encore du temps, comprendre comment fonctionne l&#039;approche continue du jeu de la vie                                                                                                                    &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
# Liens wikipédia cités dans le résumé                                                                                                                                                                              &lt;br /&gt;
# [https://johnhw.github.io/hashlife/index.md.html Implémentation utilisant des arbres]                                                                                                                             &lt;br /&gt;
# [https://arxiv.org/pdf/2005.03742 Lenia : jeu de la vie &amp;quot;continu&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Modèle proie-prédateur sans équations]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Mouloud Kessar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
les équations de prédation de Lotka-Volterra sont relativement simples sur le plan mathématiques et permettent d&#039;étudier l&#039;évolution d&#039;une population de proies (typiquement des lapins) et de prédateurs (typiquement des renards). Avec le bon jeu de paramètres, on peut observer des cycles dans le nombre de proies et de prédateurs. L&#039;objectif de ce projet est d&#039;observer de tels cycles sans utiliser d&#039;équations, mais des déplacements aléatoires sur une grille à deux dimensions.&lt;br /&gt;
&lt;br /&gt;
Les règles de base sont les suivantes:&lt;br /&gt;
*A chaque itération, chaque individu se déplace d&#039;une case dans une direction aléatoire(haut/bas/droite/gauche).&lt;br /&gt;
*Les proies sont mangées par les prédateurs lorsqu&#039;elles se retrouvent au même endroit que l&#039;un d&#039;eux.&lt;br /&gt;
*Les proies(respectivement prédateurs) voient leur population doubler toute les &amp;lt;tt&amp;gt;nr_proie&amp;lt;/tt&amp;gt; (resp. &amp;lt;tt&amp;gt;nr_pred&amp;lt;/tt&amp;gt;) itérations.&lt;br /&gt;
*On suppose que les proies ont toujours à manger.&lt;br /&gt;
*Si un prédateur n&#039;a pas mangé pendant &amp;lt;tt&amp;gt;n_faim&amp;lt;/tt&amp;gt; itérations, il meurt.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du projet est le suivant:&lt;br /&gt;
&lt;br /&gt;
#Ecrire un programme en python qui suit les règles de base.&lt;br /&gt;
#Visualiser l&#039;évolution du nombre de proies et de prédateurs en fonction du temps, pour différentes valeurs de &amp;lt;tt&amp;gt;nr_proie&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;nr_pred&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;n_faim&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Remarque :&#039;&#039; Des précisions supplémentaires seront discutées avec le tuteur au faire et à mesure de l&#039;avancement du projet pour concrétiser l&#039;implémentation des règles de base.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;références:&#039;&#039;&#039;&lt;br /&gt;
#[https://fr.wikipedia.org/wiki/%C3%89quations_de_pr%C3%A9dation_de_Lotka-Volterra Les équations de prédation de Lotka-Volterra]&lt;br /&gt;
#Exemple de déplacement aléatoire: [https://fr.wikipedia.org/wiki/Mouvement_brownien Le Mouvement Brownien]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Où placer une (ou plusieurs) antennes 5G dans un village ?]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Dorin Bucur&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Cette question, présentée ici de manière simplifiée, est très importante et&lt;br /&gt;
apparaît sous différentes formes dans la planification économique. Sa&lt;br /&gt;
modélisation repose sur des notions mathématiques relativement simples, et sa&lt;br /&gt;
résolution implique généralement l&#039;utilisation d&#039;algorithmes numériques&lt;br /&gt;
d&#039;optimisation. De manière simple, on devra chercher à positionner un certain&lt;br /&gt;
nombre de points dans un ensemble donné du plan, de telle manière à ce que la&lt;br /&gt;
moyenne de la distance à l&#039;ensemble des points soit minimale.&lt;br /&gt;
&lt;br /&gt;
En s’appuyant sur les deux références fournies, l’étudiant devra :&lt;br /&gt;
&lt;br /&gt;
*Ecrire un modèle mathématique associé à ce problème&lt;br /&gt;
*Comprendre le rôle des diagrammes de Voronoï&lt;br /&gt;
*Effectuer une analyse élémentaire de quelques cas simples (par exemple : une antenne dans un village circulaire, deux antennes dans le même village, etc.)&lt;br /&gt;
*Proposer une méthode de résolution numérique en développant un algorithme d&#039;optimisation de type gradient, implémenté en Python.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références:&#039;&#039;&#039;&lt;br /&gt;
#https://www.palais-decouverte.fr/fileadmin/fileadmin_Palais/fichiersContribs/au-programme/expos-permanentes/mathematiques/Bloc_Formes/pdf_revue/359_nov_dec_2k8.pdf&lt;br /&gt;
#https://doi.org/10.1080/00029890.2002.11919849&lt;br /&gt;
&lt;br /&gt;
===[[Introduction à la complexité et sa formalisation]]===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; La notion de complexité d&#039;un programme est une abstraction du temps que va mettre le programme pour calculer son résultat. Plus qu&#039;une durée concrète, mesurée en secondes, il s&#039;agit avant tout de prédire le comportement du programme sur des paramètres de plus en plus grands. Des travaux assez récents développent des langages où la complexité peut être contrôlée directement. L&#039;objectif serait de découvrir sur des exemples simples la notion de complexité, et de regarder comment fonctionnent ces langages qui permettent de l&#039;internaliser.&lt;br /&gt;
&lt;br /&gt;
Ces langages utilisent un style de programmation assez différent des langages utilisé en L1 (comme Python) : ce sont des langages dits &#039;&#039;fonctionnels&#039;&#039;. La première partie du projet sera donc la découverte d&#039;un langage fonctionnel, [https://ocaml.org/ OCaml]. La seconde partie consistera à explorer le langage expérimental [https://github.com/jonsterling/agda-calf calf], le &#039;&#039;cost-aware logical framework&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
* [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Calcul des valeurs de Grundy pour des jeux octaux]] par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* [[Modélisation de la ruine du joueur]] par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* [[Calibration de caméra et reconstruction 3D]] par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
=== [[Surfaces polygonales et surfaces de subdivision]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
=== [[Calcul des valeurs de Grundy pour des jeux octaux]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
=== [[Planarité de graphes]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Calibration de caméra et reconstruction 3D]] ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15645</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15645"/>
		<updated>2024-05-28T06:57:58Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Projets réalisés (2023-2024) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Projets réalisés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
* [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Calcul des valeurs de Grundy pour des jeux octaux]] par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* [[Modélisation de la ruine du joueur]] par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* [[Calibration de caméra et reconstruction 3D]] par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== [[Surfaces polygonales et surfaces de subdivision]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== [[Calcul des valeurs de Grundy pour des jeux octaux]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de la ruine du joueur]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== [[Planarité de graphes]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Calibration de caméra et reconstruction 3D]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15644</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15644"/>
		<updated>2024-05-28T06:57:11Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Projets réalisés (2023-2024) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Projets réalisés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
* [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Calcul des valeurs de Grundy pour des jeux octaux]] par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Modélisation de la ruine du joueur par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* Planarité de graphes (non sélectionné)&lt;br /&gt;
* [[Calibration de caméra et reconstruction 3D]] par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== [[Surfaces polygonales et surfaces de subdivision]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== [[Calcul des valeurs de Grundy pour des jeux octaux]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de la ruine du joueur]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== [[Planarité de graphes]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Calibration de caméra et reconstruction 3D]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15643</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15643"/>
		<updated>2024-05-28T06:56:41Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Projets réalisés (2023-2024) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Projets réalisés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
* [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Calcul des valeurs de Grundy pour des jeux octaux]] par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Modélisation de la ruine du joueur par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* Planarité de graphes (non sélectionné)&lt;br /&gt;
* [[Calibration de caméra et reconstruction 3D]] par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== [[Surfaces polygonales et surfaces de subdivision]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== [[Calcul des valeurs de Grundy pour des jeux octaux]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de la ruine du joueur]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== [[Planarité de graphes]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Calibration de caméra et reconstruction 3D]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15642</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15642"/>
		<updated>2024-05-28T06:56:12Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Projets réalisés (2023-2024) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Projets réalisés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
* [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Calcul des valeurs de Grundy pour des jeux octaux]] par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Modélisation de la ruine du joueur par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* Planarité de graphes (non sélectionné)&lt;br /&gt;
* [[Calibration de caméra et reconstruction 3D]] par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== [[Surfaces polygonales et surfaces de subdivision]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== [[Calcul des valeurs de Grundy pour des jeux octaux]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de la ruine du joueur]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== [[Planarité de graphes]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Calibration de caméra et reconstruction 3D]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15641</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15641"/>
		<updated>2024-05-28T06:55:51Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Projets réalisés (2023-2024) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Projets réalisés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
* [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* Calcul des valeurs de Grundy pour des jeux octaux par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Modélisation de la ruine du joueur par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* Planarité de graphes (non sélectionné)&lt;br /&gt;
* [[Calibration de caméra et reconstruction 3D]] par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== [[Surfaces polygonales et surfaces de subdivision]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== [[Calcul des valeurs de Grundy pour des jeux octaux]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de la ruine du joueur]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== [[Planarité de graphes]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Calibration de caméra et reconstruction 3D]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15640</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15640"/>
		<updated>2024-05-28T06:55:27Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Projets réalisés (2023-2024) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Projets réalisés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
* Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* Calcul des valeurs de Grundy pour des jeux octaux par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Modélisation de la ruine du joueur par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* Planarité de graphes (non sélectionné)&lt;br /&gt;
* [[Calibration de caméra et reconstruction 3D]] par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== [[Surfaces polygonales et surfaces de subdivision]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== [[Calcul des valeurs de Grundy pour des jeux octaux]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de la ruine du joueur]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== [[Planarité de graphes]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Calibration de caméra et reconstruction 3D]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15639</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15639"/>
		<updated>2024-05-28T06:53:49Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Projets 2022-2023 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Projets réalisés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
* Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* Calcul des valeurs de Grundy pour des jeux octaux par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Modélisation de la ruine du joueur par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* Planarité de graphes&lt;br /&gt;
* Calibration de caméra et reconstruction 3D par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== [[Surfaces polygonales et surfaces de subdivision]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== [[Calcul des valeurs de Grundy pour des jeux octaux]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de la ruine du joueur]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== [[Planarité de graphes]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Calibration de caméra et reconstruction 3D]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15390</id>
		<title>PROJ002 CMI : Projet en traitement et analyse d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15390"/>
		<updated>2024-05-14T13:57:50Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Archive des projets réalisés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Ce module constitue une initiation au monde de la recherche dans le laboratoire d&#039;adossement du CMI Info. Plusieurs sujets en lien avec le traitement et l&#039;analyse d&#039;image et les thématiques développées dans le laboratoire sont proposés aux étudiants.&lt;br /&gt;
&lt;br /&gt;
Les étudiants CMI travaillent dans le laboratoire d&#039;accueil sur ces sujets, qui comportent tous:&lt;br /&gt;
* découverte du sujet de recherche à partir de références bibliographiques &lt;br /&gt;
* appropriation du sujet précis visé et développement d&#039;algorithmes répondant au problème posé.&lt;br /&gt;
* un point possible de contribution pour l&#039;étudiant, qui constitue un apport nouveau au sujet.&lt;br /&gt;
&lt;br /&gt;
Le projet se déroule en janvier, après le cours de traitement et analyse d&#039;image, avec environ 25h de présentiel dans le laboratoire. A l&#039;issue du projet, l&#039;étudiant ou le groupe d&#039;étudiant  doit remettre un dépôt (github ou autre) présentant l&#039;avancement de son travail, le code développé, un readme expliquant le sujet, décrivant les points saillants du travail réalisé et ainsi que comment se servir du code développé. Des exemples d&#039;utilisation doivent aussi être donnés.&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2023-2024 =&lt;br /&gt;
&lt;br /&gt;
Cette année, pour faire suite au cours avancé de  [https://codimd.math.cnrs.fr/s/U_hz-OPpK Traitement et Analyse d&#039;Image avec apprentissage profond], les sujets proposés sont en lien avec des techniques d&#039;apprentissage. L&#039;objectif est de recréer le réseau d&#039;apprentissage, l&#039;entrainer sur la base de votre choix (ImageNet ou COCO par exemple), et de mesurer l&#039;efficacité de stratégies d&#039;apprentissage.&lt;br /&gt;
&lt;br /&gt;
* Super-résolution temps-réel: Shi, W., Caballero, J., Huszár, F., Totz, J., Aitken, A. P., Bishop, R., ... &amp;amp; Wang, Z. (2016). [https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network]. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 1874-1883).&lt;br /&gt;
** Il pourra être intéressant de tester l&#039;apprentissage suggéré dans le papier, mais aussi un apprentissage type adverseurial (l&#039;objectif s&#039;y prête bien).&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets / de visages: P. Viola, M. Jones. (2001). [https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf Rapid Object Detection using a Boosted Cascade of Simple Features] In Proceedings of the IEEE conference on computer vision and pattern recognition (CVPR2001).&lt;br /&gt;
** https://www.youtube.com/watch?v=uEJ71VlUmMQ&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets (boîtes englobantes): Chen, S., Sun, P., Song, Y., &amp;amp; Luo, P. (2023). [https://openaccess.thecvf.com/content/ICCV2023/papers/Chen_DiffusionDet_Diffusion_Model_for_Object_Detection_ICCV_2023_paper.pdf DiffusionDet: Diffusion Model for Object Detection]  In Proceedings of the IEEE/CVF International Conference on Computer Vision (pp. 19830-19843).&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets (YOLOv3): Redmon, J., Divvala, S., Girshick, R., &amp;amp; Farhadi, A. (2016). [https://arxiv.org/pdf/1506.02640.pdf You only look once: Unified, real-time object detection]. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 779-788).&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2022-2023 =&lt;br /&gt;
&lt;br /&gt;
*  Segmentation d&#039;image hiérarchique par ensembles échelle (C. Carmagnac, L. Chardonnet)&lt;br /&gt;
*  Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; (R. Théodet, Y. Thépaut)&lt;br /&gt;
*  Scan de page par Webcam, redressement et amélioration d&#039;image&lt;br /&gt;
&lt;br /&gt;
== Segmentation d&#039;image hiérarchique par ensembles échelle ==&lt;br /&gt;
&lt;br /&gt;
La segmentation d&#039;image constitue à découper une image en ses régions d&#039;intérêt. Il se pose alors un problème d&#039;échelle à laquelle on veut voir l&#039;image. Doit-on faire attention aux  détails (e.g. visages, couleurs des yeux) ou à des parties plus globales (nombre de personnes dans la photo, etc). L&#039;approche par ensembles-échelle ou scale-sets construit une hiérarchie de partitions en régions d&#039;une image, paramétrée par une échelle lambda. Cette hiérarchie est causale (les hiérarchies plus fines sont incluses dans les hiérarchies plus grossières). En général la partition la plus fine est celle où chaque pixel  est une région pour  lambda=0. Avec  l&#039;augmentation de lambda, on fusionne deux à deux régions jusqu&#039;à arriver à la partition la plus grossière constituée d&#039;une seule région.&lt;br /&gt;
L&#039;intérêt du modèle de Guigues et al. est d&#039;associer une énergie à chaque région, paramétrée par l&#039;échelle lambda, et qui est représentatif de son homogénéité et de sa forme. Entre 2 régions adjacentes  R_i  et R_j, on peut  déterminer l&#039;échelle lambda_ij à partir de laquelle il vaut mieux fusionner les 2 régions pour diminuer l&#039;énergie totale. L&#039;algorithme de calcul de la hiérarchie consiste donc à regarder les paires de régions et à fusionner les régions dans l&#039;ordre croissant des échelles de fusion lambda_ij.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique des ensemble-échelle et l&#039;algorithme (heuristique) de calcul de sa hiérarchie&lt;br /&gt;
#* comprendre les structures de données utiles pour implémenter cet algorithme : graphe d&#039;adjacence de région, calcul du périmètre d&#039;une région, de son énergie&lt;br /&gt;
#* mettre en place un premier algorithme de fusion de régions&lt;br /&gt;
#* calculer pour 2 régions le lambda_ij optimal&lt;br /&gt;
#* afficher une partition à un lambda donné&lt;br /&gt;
# Etape 2 : optimisation&lt;br /&gt;
#* travailler les structures de données pour accélérer ou réutiliser les calculs&lt;br /&gt;
#* partir d&#039;une segmentation fine initiale moins triviale, genre le résultat d&#039;un watershed/ligne de partage des eaux&lt;br /&gt;
#* tester d&#039;autres énergies pour les régions&lt;br /&gt;
#* tester sur des bases d&#039;image&lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://link.springer.com/content/pdf/10.1007/s11263-005-6299-0.pdf Scale-sets image analysis, L Guigues, JP Cocquerez, H Le Men - International Journal of Computer Vision, 2006]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5i8LT2Gnd Cours INFO001 sur les ensembles échelle]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5IeK4xFhb Cours INFO001 sur les structures de données régions/partitions]&lt;br /&gt;
&lt;br /&gt;
== Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Si on réduit une image de manière  non isotrope, par exemple, on veut passer de 1080x600 à 400x400, les éléments importants de l&#039;image vont être déformés. &lt;br /&gt;
L&#039;approche proposée ici est d&#039;éliminer les parties non importantes de l&#039;image. Il se trouve que notre perception attache peu d&#039;importance aux parties homogènes d&#039;une image alors que nous distinguons très bien les parties à forte variation.&lt;br /&gt;
Le principe du seam carving est d&#039;éliminer 1 pixel par ligne (mettons). On pourrait donc essayer d&#039;éliminer la colonne la plus homogène, mais ce n&#039;est un peu trop rigide. On va plutôt tracer une colonne possiblement zigzaguante du haut vers le bas, qui minimise les variations de couleur. Cette &amp;quot;colonne&amp;quot; serait extraite par un algorithme d&#039;optimisation. Une fois qu&#039;on sait enlever une colonne, on peut recommencer le processus pour enlever plus de colonnes.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique du seam carving.&lt;br /&gt;
#* faire les prétraitements nécessaires à son calcul (gradient notammen)&lt;br /&gt;
#* mettre en place un algorithme  de recherche du meilleur chemin&lt;br /&gt;
#* faire alors les fonctions qui enlèvent une colonne et une ligne d&#039;une image&lt;br /&gt;
#* en déduire l&#039;algorithme de réduction de résolution w x h vers w&#039; x h&#039;, qui commence par une interpolation puis par éliminer seulement des lignes ou des colonnes&lt;br /&gt;
# Etape 2 : traitement temps-réel&lt;br /&gt;
#* la méthode est presque parallélisable naturellement, au sens où l&#039;algorithme d&#039;optimisation peut donner plusieurs chemins candidats&lt;br /&gt;
#* mettre en place cette approche avec élimination de plusieurs chemins  simultanées&lt;br /&gt;
#* voir si on peut aboutir à un traitement temps-réel d&#039;un flux vidéo&lt;br /&gt;
# Etape 3 : amélioration possibles&lt;br /&gt;
#* on peut travailler les énergies mises en place, changer l&#039;espace des couleurs, ou mixer plusieurs modèles de réduction de résolution&lt;br /&gt;
#* on pourra s&#039;inspirer aussi d&#039;articles ayant amélioré cette méthode.&lt;br /&gt;
# Quelques liens pour démarrer&lt;br /&gt;
#* [https://en.wikipedia.org/wiki/Seam_carving Seam carving sur wikipedia]&lt;br /&gt;
#* L&#039;article décrivant la méthode: [https://dl.acm.org/doi/10.1145/1275808.1276390 Avidan, Shai; Shamir, Ariel (July 2007). &amp;quot;Seam carving for content-aware image resizing | ACM SIGGRAPH 2007 papers&amp;quot;. Siggraph 2007]&lt;br /&gt;
&lt;br /&gt;
== Scan de page par Webcam, redressement et amélioration d&#039;image ==&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif est de scanner une page avec une simple webcam ou camera. L&#039;application doit permettre de lire un flux video en entrée, repérer les côtes d&#039;une feuille si elle est présente dans une certaine zone, puis ramener cette géométrie déformée à une feuille A4 (mettons). Ensuite des algorithmes d&#039;amélioration d&#039;image peuvent être utilisés : élimination du bruit, binarisation  (e.g. Otsu). Enfin on peut chercher à reconnaître les caractères (Optical Character Recognition). Ce projet poursuit le travail de R. Bouvier de l&#039;an dernier.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* On pourra commencer par reprendre le travail de Rémi Bouvier&lt;br /&gt;
#* Pour détecter les contours de la feuille, 2 techniques ont été implémentées, Canny ou watershed. &lt;br /&gt;
#* Permettre à l&#039;utilisateur de choisir en cours d&#039;utilisation la technique utilisée, de modifier les paramètres, de visualiser en surimpression le résultat&lt;br /&gt;
#* Reprendre ensuite la méthode de détection de lignes (transformée de Hough)&lt;br /&gt;
#** Indiquez clairement où l&#039;utilisateur doit à peu près placer les coins&lt;br /&gt;
#** Sélectionner les droites données par Hough en ne gardant que celles qui passent par ces zones&lt;br /&gt;
#* Si 4 bords de la page sont détectés, capturer l&#039;image et affichez-là&lt;br /&gt;
#* On pourra enfin redresser l&#039;image par une transformation homographique&lt;br /&gt;
# Etape 2 : améliorations&lt;br /&gt;
#* on peut travailler sur le déclenchement automatique de la capture, e.g.,  repérer que l&#039;histogramme dans la partie correspondant à la feuille comporte essentiellement des blancs/gris clairs et des noirs.&lt;br /&gt;
#* on peut renforcer/aider la détection des bords de l&#039;image en  détectant des coins dans les zones spécifiées.&lt;br /&gt;
#* on peut repérer que la feuille n&#039;est pas très droite (genre courbée d&#039;un côté ou de l&#039;autre :  en fait, elle ne peut pas être courbée des 2 côtés en même temps (car sa courbure gaussienne est nulle !).&lt;br /&gt;
#* on peut améliorer l&#039;image capturée en égalisant l&#039;image, ou proposer sa binarisation optimale par la méthode d&#039;Otsu.&lt;br /&gt;
#* on peut grouper les lignes puis tenter d&#039;utiliser la reconnaissance de caractères pour extraire les textes dans l&#039;image.&lt;br /&gt;
#* si le focus de la caméra n&#039;est pas bon, on peut essayer des techniques de déconvolution pour retrouver une image plus nette (c&#039;est un problème d&#039;optimisation), ou on peut essayer de piloter le focus de la caméra (mais pas toutes les caméras/webcam se laissent piloter). &lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://github.com/RemiB99/Proj002-ScanDocumentWebcam projet de Rémi Bouvier]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/NUd-0HnaB Transformée de Hough]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/A_-AUJ1ql Détection de coins/points saillants]&lt;br /&gt;
&lt;br /&gt;
= Archive des projets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
* R. Negro : [https://github.com/romain22222/chess-gamesheet-reader Lecteur de parties d&#039;échec]&lt;br /&gt;
* F. Dufaure, R. Pajean : [https://github.com/FloowD/PROJ002_Pneumonia_Recognition Reconnaissance de pneumonie]&lt;br /&gt;
* S. Léonard : [https://github.com/sinux-l5d/PROJ002/ Classifieur d&#039;animaux]&lt;br /&gt;
* S. Pichenot, H. Rey : [https://github.com/Heargo/info001_cmi Reconnaissance d&#039;émotions et estimation de l&#039;âge]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* R. Théodet, Y. Thépaut : [https://github.com/ythepaut/proj001_seam-carving Seam carving]&lt;br /&gt;
* C. Carmagnac, L. Chardonnet : [https://github.com/445654/Scale-sets Hierarchical scale sets]&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
* R. Bouvier : [https://github.com/RemiB99/Proj002-ScanDocumentWebcam Scan de page par WebCam]&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
* R. Tournafond et A. Decouttère : [https://github.com/Gitravail/Proj002-ColorTransfert Transfert de couleurs entre images par transport optimal par coupes]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15389</id>
		<title>PROJ002 CMI : Projet en traitement et analyse d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15389"/>
		<updated>2024-05-14T13:53:15Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Archive des projets réalisés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Ce module constitue une initiation au monde de la recherche dans le laboratoire d&#039;adossement du CMI Info. Plusieurs sujets en lien avec le traitement et l&#039;analyse d&#039;image et les thématiques développées dans le laboratoire sont proposés aux étudiants.&lt;br /&gt;
&lt;br /&gt;
Les étudiants CMI travaillent dans le laboratoire d&#039;accueil sur ces sujets, qui comportent tous:&lt;br /&gt;
* découverte du sujet de recherche à partir de références bibliographiques &lt;br /&gt;
* appropriation du sujet précis visé et développement d&#039;algorithmes répondant au problème posé.&lt;br /&gt;
* un point possible de contribution pour l&#039;étudiant, qui constitue un apport nouveau au sujet.&lt;br /&gt;
&lt;br /&gt;
Le projet se déroule en janvier, après le cours de traitement et analyse d&#039;image, avec environ 25h de présentiel dans le laboratoire. A l&#039;issue du projet, l&#039;étudiant ou le groupe d&#039;étudiant  doit remettre un dépôt (github ou autre) présentant l&#039;avancement de son travail, le code développé, un readme expliquant le sujet, décrivant les points saillants du travail réalisé et ainsi que comment se servir du code développé. Des exemples d&#039;utilisation doivent aussi être donnés.&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2023-2024 =&lt;br /&gt;
&lt;br /&gt;
Cette année, pour faire suite au cours avancé de  [https://codimd.math.cnrs.fr/s/U_hz-OPpK Traitement et Analyse d&#039;Image avec apprentissage profond], les sujets proposés sont en lien avec des techniques d&#039;apprentissage. L&#039;objectif est de recréer le réseau d&#039;apprentissage, l&#039;entrainer sur la base de votre choix (ImageNet ou COCO par exemple), et de mesurer l&#039;efficacité de stratégies d&#039;apprentissage.&lt;br /&gt;
&lt;br /&gt;
* Super-résolution temps-réel: Shi, W., Caballero, J., Huszár, F., Totz, J., Aitken, A. P., Bishop, R., ... &amp;amp; Wang, Z. (2016). [https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network]. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 1874-1883).&lt;br /&gt;
** Il pourra être intéressant de tester l&#039;apprentissage suggéré dans le papier, mais aussi un apprentissage type adverseurial (l&#039;objectif s&#039;y prête bien).&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets / de visages: P. Viola, M. Jones. (2001). [https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf Rapid Object Detection using a Boosted Cascade of Simple Features] In Proceedings of the IEEE conference on computer vision and pattern recognition (CVPR2001).&lt;br /&gt;
** https://www.youtube.com/watch?v=uEJ71VlUmMQ&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets (boîtes englobantes): Chen, S., Sun, P., Song, Y., &amp;amp; Luo, P. (2023). [https://openaccess.thecvf.com/content/ICCV2023/papers/Chen_DiffusionDet_Diffusion_Model_for_Object_Detection_ICCV_2023_paper.pdf DiffusionDet: Diffusion Model for Object Detection]  In Proceedings of the IEEE/CVF International Conference on Computer Vision (pp. 19830-19843).&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets (YOLOv3): Redmon, J., Divvala, S., Girshick, R., &amp;amp; Farhadi, A. (2016). [https://arxiv.org/pdf/1506.02640.pdf You only look once: Unified, real-time object detection]. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 779-788).&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2022-2023 =&lt;br /&gt;
&lt;br /&gt;
*  Segmentation d&#039;image hiérarchique par ensembles échelle (C. Carmagnac, L. Chardonnet)&lt;br /&gt;
*  Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; (R. Théodet, Y. Thépaut)&lt;br /&gt;
*  Scan de page par Webcam, redressement et amélioration d&#039;image&lt;br /&gt;
&lt;br /&gt;
== Segmentation d&#039;image hiérarchique par ensembles échelle ==&lt;br /&gt;
&lt;br /&gt;
La segmentation d&#039;image constitue à découper une image en ses régions d&#039;intérêt. Il se pose alors un problème d&#039;échelle à laquelle on veut voir l&#039;image. Doit-on faire attention aux  détails (e.g. visages, couleurs des yeux) ou à des parties plus globales (nombre de personnes dans la photo, etc). L&#039;approche par ensembles-échelle ou scale-sets construit une hiérarchie de partitions en régions d&#039;une image, paramétrée par une échelle lambda. Cette hiérarchie est causale (les hiérarchies plus fines sont incluses dans les hiérarchies plus grossières). En général la partition la plus fine est celle où chaque pixel  est une région pour  lambda=0. Avec  l&#039;augmentation de lambda, on fusionne deux à deux régions jusqu&#039;à arriver à la partition la plus grossière constituée d&#039;une seule région.&lt;br /&gt;
L&#039;intérêt du modèle de Guigues et al. est d&#039;associer une énergie à chaque région, paramétrée par l&#039;échelle lambda, et qui est représentatif de son homogénéité et de sa forme. Entre 2 régions adjacentes  R_i  et R_j, on peut  déterminer l&#039;échelle lambda_ij à partir de laquelle il vaut mieux fusionner les 2 régions pour diminuer l&#039;énergie totale. L&#039;algorithme de calcul de la hiérarchie consiste donc à regarder les paires de régions et à fusionner les régions dans l&#039;ordre croissant des échelles de fusion lambda_ij.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique des ensemble-échelle et l&#039;algorithme (heuristique) de calcul de sa hiérarchie&lt;br /&gt;
#* comprendre les structures de données utiles pour implémenter cet algorithme : graphe d&#039;adjacence de région, calcul du périmètre d&#039;une région, de son énergie&lt;br /&gt;
#* mettre en place un premier algorithme de fusion de régions&lt;br /&gt;
#* calculer pour 2 régions le lambda_ij optimal&lt;br /&gt;
#* afficher une partition à un lambda donné&lt;br /&gt;
# Etape 2 : optimisation&lt;br /&gt;
#* travailler les structures de données pour accélérer ou réutiliser les calculs&lt;br /&gt;
#* partir d&#039;une segmentation fine initiale moins triviale, genre le résultat d&#039;un watershed/ligne de partage des eaux&lt;br /&gt;
#* tester d&#039;autres énergies pour les régions&lt;br /&gt;
#* tester sur des bases d&#039;image&lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://link.springer.com/content/pdf/10.1007/s11263-005-6299-0.pdf Scale-sets image analysis, L Guigues, JP Cocquerez, H Le Men - International Journal of Computer Vision, 2006]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5i8LT2Gnd Cours INFO001 sur les ensembles échelle]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5IeK4xFhb Cours INFO001 sur les structures de données régions/partitions]&lt;br /&gt;
&lt;br /&gt;
== Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Si on réduit une image de manière  non isotrope, par exemple, on veut passer de 1080x600 à 400x400, les éléments importants de l&#039;image vont être déformés. &lt;br /&gt;
L&#039;approche proposée ici est d&#039;éliminer les parties non importantes de l&#039;image. Il se trouve que notre perception attache peu d&#039;importance aux parties homogènes d&#039;une image alors que nous distinguons très bien les parties à forte variation.&lt;br /&gt;
Le principe du seam carving est d&#039;éliminer 1 pixel par ligne (mettons). On pourrait donc essayer d&#039;éliminer la colonne la plus homogène, mais ce n&#039;est un peu trop rigide. On va plutôt tracer une colonne possiblement zigzaguante du haut vers le bas, qui minimise les variations de couleur. Cette &amp;quot;colonne&amp;quot; serait extraite par un algorithme d&#039;optimisation. Une fois qu&#039;on sait enlever une colonne, on peut recommencer le processus pour enlever plus de colonnes.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique du seam carving.&lt;br /&gt;
#* faire les prétraitements nécessaires à son calcul (gradient notammen)&lt;br /&gt;
#* mettre en place un algorithme  de recherche du meilleur chemin&lt;br /&gt;
#* faire alors les fonctions qui enlèvent une colonne et une ligne d&#039;une image&lt;br /&gt;
#* en déduire l&#039;algorithme de réduction de résolution w x h vers w&#039; x h&#039;, qui commence par une interpolation puis par éliminer seulement des lignes ou des colonnes&lt;br /&gt;
# Etape 2 : traitement temps-réel&lt;br /&gt;
#* la méthode est presque parallélisable naturellement, au sens où l&#039;algorithme d&#039;optimisation peut donner plusieurs chemins candidats&lt;br /&gt;
#* mettre en place cette approche avec élimination de plusieurs chemins  simultanées&lt;br /&gt;
#* voir si on peut aboutir à un traitement temps-réel d&#039;un flux vidéo&lt;br /&gt;
# Etape 3 : amélioration possibles&lt;br /&gt;
#* on peut travailler les énergies mises en place, changer l&#039;espace des couleurs, ou mixer plusieurs modèles de réduction de résolution&lt;br /&gt;
#* on pourra s&#039;inspirer aussi d&#039;articles ayant amélioré cette méthode.&lt;br /&gt;
# Quelques liens pour démarrer&lt;br /&gt;
#* [https://en.wikipedia.org/wiki/Seam_carving Seam carving sur wikipedia]&lt;br /&gt;
#* L&#039;article décrivant la méthode: [https://dl.acm.org/doi/10.1145/1275808.1276390 Avidan, Shai; Shamir, Ariel (July 2007). &amp;quot;Seam carving for content-aware image resizing | ACM SIGGRAPH 2007 papers&amp;quot;. Siggraph 2007]&lt;br /&gt;
&lt;br /&gt;
== Scan de page par Webcam, redressement et amélioration d&#039;image ==&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif est de scanner une page avec une simple webcam ou camera. L&#039;application doit permettre de lire un flux video en entrée, repérer les côtes d&#039;une feuille si elle est présente dans une certaine zone, puis ramener cette géométrie déformée à une feuille A4 (mettons). Ensuite des algorithmes d&#039;amélioration d&#039;image peuvent être utilisés : élimination du bruit, binarisation  (e.g. Otsu). Enfin on peut chercher à reconnaître les caractères (Optical Character Recognition). Ce projet poursuit le travail de R. Bouvier de l&#039;an dernier.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* On pourra commencer par reprendre le travail de Rémi Bouvier&lt;br /&gt;
#* Pour détecter les contours de la feuille, 2 techniques ont été implémentées, Canny ou watershed. &lt;br /&gt;
#* Permettre à l&#039;utilisateur de choisir en cours d&#039;utilisation la technique utilisée, de modifier les paramètres, de visualiser en surimpression le résultat&lt;br /&gt;
#* Reprendre ensuite la méthode de détection de lignes (transformée de Hough)&lt;br /&gt;
#** Indiquez clairement où l&#039;utilisateur doit à peu près placer les coins&lt;br /&gt;
#** Sélectionner les droites données par Hough en ne gardant que celles qui passent par ces zones&lt;br /&gt;
#* Si 4 bords de la page sont détectés, capturer l&#039;image et affichez-là&lt;br /&gt;
#* On pourra enfin redresser l&#039;image par une transformation homographique&lt;br /&gt;
# Etape 2 : améliorations&lt;br /&gt;
#* on peut travailler sur le déclenchement automatique de la capture, e.g.,  repérer que l&#039;histogramme dans la partie correspondant à la feuille comporte essentiellement des blancs/gris clairs et des noirs.&lt;br /&gt;
#* on peut renforcer/aider la détection des bords de l&#039;image en  détectant des coins dans les zones spécifiées.&lt;br /&gt;
#* on peut repérer que la feuille n&#039;est pas très droite (genre courbée d&#039;un côté ou de l&#039;autre :  en fait, elle ne peut pas être courbée des 2 côtés en même temps (car sa courbure gaussienne est nulle !).&lt;br /&gt;
#* on peut améliorer l&#039;image capturée en égalisant l&#039;image, ou proposer sa binarisation optimale par la méthode d&#039;Otsu.&lt;br /&gt;
#* on peut grouper les lignes puis tenter d&#039;utiliser la reconnaissance de caractères pour extraire les textes dans l&#039;image.&lt;br /&gt;
#* si le focus de la caméra n&#039;est pas bon, on peut essayer des techniques de déconvolution pour retrouver une image plus nette (c&#039;est un problème d&#039;optimisation), ou on peut essayer de piloter le focus de la caméra (mais pas toutes les caméras/webcam se laissent piloter). &lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://github.com/RemiB99/Proj002-ScanDocumentWebcam projet de Rémi Bouvier]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/NUd-0HnaB Transformée de Hough]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/A_-AUJ1ql Détection de coins/points saillants]&lt;br /&gt;
&lt;br /&gt;
= Archive des projets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* R. Théodet, Y. Thépaut [https://github.com/ythepaut/proj001_seam-carving Seam carving]&lt;br /&gt;
* C. Carmagnac, L. Chardonnet [https://github.com/445654/Scale-sets Hierarchical scale sets]&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
* R. Bouvier: [https://github.com/RemiB99/Proj002-ScanDocumentWebcam Scan de page par WebCam]&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
* R. Tournafond et A. Decouttère: [https://github.com/Gitravail/Proj002-ColorTransfert Transfert de couleurs entre images par transport optimal par coupes]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15158</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15158"/>
		<updated>2024-04-22T13:05:47Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : Fix links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Projets réalisés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
* Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* Calcul des valeurs de Grundy pour des jeux octaux par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Modélisation de la ruine du joueur par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* Planarité de graphes&lt;br /&gt;
* Calibration de caméra et reconstruction 3D par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== [[Surfaces polygonales et surfaces de subdivision]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== [[Calcul des valeurs de Grundy pour des jeux octaux]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de la ruine du joueur]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== [[Planarité de graphes]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Calibration de caméra et reconstruction 3D]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15157</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15157"/>
		<updated>2024-04-22T13:05:15Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Projets 2020-2021 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Projets réalisés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
* Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* Calcul des valeurs de Grundy pour des jeux octaux par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Modélisation de la ruine du joueur par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* Planarité de graphes&lt;br /&gt;
* Calibration de caméra et reconstruction 3D par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== [[Surfaces polygonales et surfaces de subdivision]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== [[Calcul des valeurs de Grundy pour des jeux octaux]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de la ruine du joueur]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== [[Planarité de graphes]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Calibration de caméra et reconstruction 3D]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15156</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15156"/>
		<updated>2024-04-22T13:04:25Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Projets 2019-2020 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Projets réalisés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
* Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* Calcul des valeurs de Grundy pour des jeux octaux par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Modélisation de la ruine du joueur par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* Planarité de graphes&lt;br /&gt;
* Calibration de caméra et reconstruction 3D par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== [[Surfaces polygonales et surfaces de subdivision]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== [[Calcul des valeurs de Grundy pour des jeux octaux]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de la ruine du joueur]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== [[Planarité de graphes]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Calibration de caméra et reconstruction 3D]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15155</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15155"/>
		<updated>2024-04-22T13:03:49Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Projets 2019-2020 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Projets réalisés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
* Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* Calcul des valeurs de Grundy pour des jeux octaux par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Modélisation de la ruine du joueur par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* Planarité de graphes&lt;br /&gt;
* Calibration de caméra et reconstruction 3D par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== [[Surfaces polygonales et surfaces de subdivision]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== [[Calcul des valeurs de Grundy pour des jeux octaux]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de la ruine du joueur]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== [[Planarité de graphes]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Calibration de caméra et reconstruction 3D]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15154</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15154"/>
		<updated>2024-04-22T08:22:10Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Projets 2020-2021 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Projets réalisés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
* Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* [[Surfaces polygonales et surfaces de subdivision]] par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* Calcul des valeurs de Grundy pour des jeux octaux par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Modélisation de la ruine du joueur par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* Planarité de graphes&lt;br /&gt;
* Calibration de caméra et reconstruction 3D par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== [[Surfaces polygonales et surfaces de subdivision]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== [[Calcul des valeurs de Grundy pour des jeux octaux]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de la ruine du joueur]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== [[Planarité de graphes]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Calibration de caméra et reconstruction 3D]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Accueil&amp;diff=15147</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Accueil&amp;diff=15147"/>
		<updated>2024-04-12T09:50:42Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Utilisation du wiki */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
&amp;lt;big&amp;gt;Le wiki du [http://www.lama.univ-savoie.fr Laboratoire de Mathématiques (LAMA, UMR 5127)]&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce wiki contient certains cours dispensés par les filières de l&#039;[http://www.scem.univ-savoie.fr UFR SceM], ainsi que de la [documentation documentation] utile aux membres du LAMA.&lt;br /&gt;
Les modifications, voire les créations de pages par les étudiants sont les bienvenues. En cas de création de cours,&lt;br /&gt;
merci de prendre modèle sur les cours existants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Liste des cours ==&lt;br /&gt;
&lt;br /&gt;
=== Mathématiques à l&#039;université de Savoie ===&lt;br /&gt;
&lt;br /&gt;
[[MATH202 : Mathématiques pour le numérique 2]]&lt;br /&gt;
&lt;br /&gt;
[[MATH203 : Introduction à l&#039;algèbre]]&lt;br /&gt;
&lt;br /&gt;
[[MATH206 : Probabilités et Statistiques]]&lt;br /&gt;
&lt;br /&gt;
[[MATH302 : Outils mathématiques III]]&lt;br /&gt;
&lt;br /&gt;
[[MATH304 : Mathématiques pour les sciences III]]&lt;br /&gt;
&lt;br /&gt;
[[MATH508 : Algèbre linéaire et optimisation]]&lt;br /&gt;
&lt;br /&gt;
[[MATH611 : Statistiques inférentielles]]&lt;br /&gt;
&lt;br /&gt;
[[MATH801 : Géométrie affine et euclidienne]]&lt;br /&gt;
&lt;br /&gt;
[[PHOX301 et PHOX501 : Initiation au raisonnement mathématique avec PhoX]]&lt;br /&gt;
&lt;br /&gt;
[[Projet en L3 MASS]]&lt;br /&gt;
&lt;br /&gt;
=== Informatiques à l&#039;université de Savoie ===&lt;br /&gt;
&lt;br /&gt;
[[INFO202 : Informatique et multimédia]]&lt;br /&gt;
&lt;br /&gt;
[[INFO302 : Introduction à la Programmation Orientée Objet et Java]]&lt;br /&gt;
&lt;br /&gt;
[[INFO421 : Programmation fonctionnelle]]&lt;br /&gt;
&lt;br /&gt;
[[INFO424 : Projet en informatique]]&lt;br /&gt;
&lt;br /&gt;
[[INFO502 : Systèmes d&#039;exploitation]]&lt;br /&gt;
&lt;br /&gt;
[[INFO505 : Programmation C]]&lt;br /&gt;
&lt;br /&gt;
[[INFO510 : Algorithmique : structures de données complexes]]&lt;br /&gt;
&lt;br /&gt;
[[INFO511 : Algorithmique : algorithmes complexes]]&lt;br /&gt;
&lt;br /&gt;
[[INFO606 : Bases de données]]&lt;br /&gt;
&lt;br /&gt;
[[INFO607 : Algorithmique II]]&lt;br /&gt;
&lt;br /&gt;
[[INFO622 : Systèmes de synchronisation et Processus]]&lt;br /&gt;
&lt;br /&gt;
[[INFO625 : Réseau]]&lt;br /&gt;
&lt;br /&gt;
[[INFO626 : Algorithmique avancée]] &lt;br /&gt;
&lt;br /&gt;
[[INFO631 : Graphes et algorithmes]]&lt;br /&gt;
&lt;br /&gt;
[[INFO702 : Programmation générique et C++]]&lt;br /&gt;
&lt;br /&gt;
[http://lama.univ-savoie.fr/~raffalli/INFO725 INFO725 : Déduction Automatique]&lt;br /&gt;
&lt;br /&gt;
[[INFO803 : Conception et Programmation Objet]] &lt;br /&gt;
&lt;br /&gt;
[[INFO804 : Introduction à l&#039;Informatique Graphique]] &lt;br /&gt;
&lt;br /&gt;
[[INFO817 : Sémantique des langages fonctionnels  et objets, preuves de programmes]]&lt;br /&gt;
&lt;br /&gt;
[[INFO003 C1 : Analyse d&#039;algorithmes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strike&amp;gt;&amp;lt;small&amp;gt;[[INFO910 : Cryptologie ]]&amp;lt;/small&amp;gt;&amp;lt;/strike&amp;gt;&lt;br /&gt;
[[INFO002 : Cryptologie ]]&lt;br /&gt;
&lt;br /&gt;
[[INFO001 : Traitement et analyse d&#039;image]]&lt;br /&gt;
&lt;br /&gt;
=== Cours spécifiques CMI ===&lt;br /&gt;
&lt;br /&gt;
[[VISI201_CMI : visite de laboratoire]]&lt;br /&gt;
&lt;br /&gt;
[[VISI301_CMI : projet de recherche et développement]]&lt;br /&gt;
&lt;br /&gt;
[[VISI401_CMI : bibliographie scientifique]]&lt;br /&gt;
&lt;br /&gt;
[[VISI601_CMI : Algorithmique numérique]]&lt;br /&gt;
&lt;br /&gt;
[[PROJ602_CMI : Projet de recherche tuteuré]]&lt;br /&gt;
&lt;br /&gt;
[[PROJ002_CMI : Projet en traitement et analyse d&#039;image]]&lt;br /&gt;
&lt;br /&gt;
=== Autres cours ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[MSHS501 et MSHS601 : Enquête et sondage]]&lt;br /&gt;
&lt;br /&gt;
[[PHYS504 : Méthodes informatiques pour la physique]]&lt;br /&gt;
&lt;br /&gt;
[[PHYS710 : Simulation et modélisation en physique]]&lt;br /&gt;
&lt;br /&gt;
[[MATH0980 : contenu algorithmique des démonstrations mathématiques]] (cours du M2 de l&#039;université Claude Bernard à Lyon)&lt;br /&gt;
&lt;br /&gt;
[[Initiation aux assistants de preuves (cours du LMFI)]]&lt;br /&gt;
&lt;br /&gt;
[[Modèle de la programmation (cours du LMFI)]]&lt;br /&gt;
&lt;br /&gt;
[[Langage et concepts catégoriques pour les mathématiques et l’informatique]] (cours de l&#039;École doctorale MSTII de Grenoble)&lt;br /&gt;
&lt;br /&gt;
[[GIND401 : Introduction à la programmation objet en JAVA]]&lt;br /&gt;
&lt;br /&gt;
[[PROJ401 : Projet]]&lt;br /&gt;
&lt;br /&gt;
=== Anciens cours en informatique ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO204 : science informatique]]&amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO504 : Programmation C]]&amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO505 : Mathématiques pour l&#039;informatique]]&amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO505 : algorithmes de graphes]]&amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO510 et INFO511 : Algorithmique et structures de données]]&amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO523 : Programmation C]] &amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO602 : Algorithmique II]] &amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO614 : Mathématiques pour l&#039;informatique]]&amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO632 : algorithmes de graphes]]&amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO704 : Analyse d&#039;algorithmes]]&amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO710 : Compléments de base de données]]&amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO719 : rappels et compléments de programmation]]&amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO719 : rappels d&#039;algorithmique et programmation C]]&amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO724 : Algorithmique avancée, graphes et NP-Complétude]]&amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO735 : Programmation générique et C++]]&amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO803 : informatique]] (remplacé par [[INFO719 : rappels d&#039;algorithmique et programmation C]]&amp;lt;/strike&amp;gt; &amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO821 : Infographie]]&amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO916 : Cours de C]] (remplacé par [[INFO719 : rappels d&#039;algorithmique et programmation C]]&amp;lt;/strike&amp;gt; &amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO006 : Cryptologie et sécurité informatique]]&amp;lt;/strike&amp;gt; &amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;strike&amp;gt;[[INFO719 : Conception et Programmation Objet]]&amp;lt;/strike&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Utilisation des machines de TP ==&lt;br /&gt;
&lt;br /&gt;
[[Linux dans les salles de TP du Bourget|Démarrage sous Linux]]&lt;br /&gt;
&lt;br /&gt;
[[Comment compiler le C ?|Compilation de programmes C]]&lt;br /&gt;
&lt;br /&gt;
== Utilisation du wiki ==&lt;br /&gt;
&lt;br /&gt;
Consultez le [https://meta.wikimedia.org/w/index.php?title=Help:Editor/fr&amp;amp;uselang=fr Manuel de l&#039;éditeur] pour plus d&#039;informations sur l&#039;utilisation des &amp;quot;wiki&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
En cas de problème contacter [mailto:pierre.hyvernat@univ-smb.fr Pierre Hyvernat].&lt;br /&gt;
&lt;br /&gt;
== Projets scientifiques ==&lt;br /&gt;
&lt;br /&gt;
[[ Géométrie discrète ]]&lt;br /&gt;
[[ Projet CoMeDiC ]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15146</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15146"/>
		<updated>2024-04-12T09:48:29Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Sujets proposés (2023-2024) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Projets réalisés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
* Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Surfaces polygonales et surfaces de subdivision par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* Calcul des valeurs de Grundy pour des jeux octaux par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Modélisation de la ruine du joueur par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* Planarité de graphes&lt;br /&gt;
* Calibration de caméra et reconstruction 3D par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== [[Surfaces polygonales et surfaces de subdivision]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== [[Calcul des valeurs de Grundy pour des jeux octaux]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de la ruine du joueur]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== [[Planarité de graphes]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Calibration de caméra et reconstruction 3D]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15145</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15145"/>
		<updated>2024-04-12T09:45:56Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Calcul approché de l&amp;#039;élément majoritaire, et autres algorithmes approchés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Projets réalisés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
* Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Surfaces polygonales et surfaces de subdivision par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* Calcul des valeurs de Grundy pour des jeux octaux par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Modélisation de la ruine du joueur par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* Planarité de graphes&lt;br /&gt;
* Calibration de caméra et reconstruction 3D par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== [[Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés]] ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== Surfaces polygonales et surfaces de subdivision ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== Calcul des valeurs de Grundy pour des jeux octaux ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== Modélisation de la ruine du joueur ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Planarité de graphes ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Calibration de caméra et reconstruction 3D ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO607_:_Algorithmique_II&amp;diff=15144</id>
		<title>INFO607 : Algorithmique II</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO607_:_Algorithmique_II&amp;diff=15144"/>
		<updated>2024-04-09T08:14:42Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cours du semestre 6 de la licence INFORMATIQUE (ex INFO602, Algorithmique II)&lt;br /&gt;
&lt;br /&gt;
* Responsables pour 2022--2023: Jacques-Olivier Lachaud (C/1xTD/1xTP), Colin Weill-Duflos (2xTP)&lt;br /&gt;
&lt;br /&gt;
= Quelques ressources pour l&#039;étudiant =&lt;br /&gt;
&lt;br /&gt;
# Leçons et exercices&lt;br /&gt;
#* [[Media:INFO607-Lesson-1.pdf|Leçon 1 : complexité des algorithmes (rappels), notations O, Theta, Omega]] / [[Media:INFO607-Exo-1.pdf|Exercices]]&lt;br /&gt;
#* [[Media:INFO602-Lesson-2.pdf|Leçon 2 : analyse amortie des algorithmes]] / [[Media:INFO602-Exo-2.pdf|Exercices]]&lt;br /&gt;
#* [[Media:INFO602-Lesson-3.pdf|Leçon 3 : structures pour ensembles disjoints (union-find)]] / [[Media:INFO602-Exo-3.pdf|Exercices]]&lt;br /&gt;
#* [[Media:INFO602-Lesson-4.pdf|Leçon 4 : complexité des fonctions récursives]] / [[Media:INFO602-Exo-4.pdf|Exercices]]&lt;br /&gt;
#* [[Media:INFO602-Lesson-5.pdf|Leçon 5 : géométrie algorithmique]] / [[Media:INFO602-Exo-5.pdf|Exercices]]&lt;br /&gt;
# [[Media:Cours-info607.pdf|Notes de cours (PDF)]]&lt;br /&gt;
# Fiches de TD&lt;br /&gt;
#* TD 1 : complexité des fonctions récursives, complexité amortie [http://www.lama.univ-savoie.fr/pagesmembres/lachaud/Cours/INFO602/TDs/td-1.pdf PDF]&lt;br /&gt;
#* TD 2 : complexité des tableaux dynamiques [http://www.lama.univ-savoie.fr/pagesmembres/lachaud/Cours/INFO602/TDs/td-2.pdf PDF]&lt;br /&gt;
# TPs et autres travaux pratiques. Les énoncés sont sur la [http://www.lama.univ-savoie.fr/pagesmembres/lachaud/Cours/INFO602/Tests/doc/html/index.html Pages des TPs].&lt;br /&gt;
#* Le langage choisi est le langage C.&lt;br /&gt;
#* Les TPs sont évalués et à rendre via [http://www.lama.univ-savoie.fr/TPLab TPLab]&lt;br /&gt;
#* Pour la première fois, on pourra aussi regarder la page [[Comment_compiler_le_C_%3F]]&lt;br /&gt;
#* Si vous n&#039;accédez pas aux pages &amp;quot;manual&amp;quot; en salle TP, on les trouve en ligne : [[http://www.linux-france.org/article/man-fr/ Manual pages]]&lt;br /&gt;
# Annales&lt;br /&gt;
#* Examen (2020-2021) : [http://www.lama.univ-savoie.fr/pagesmembres/lachaud/Cours/INFO602/Examens/examen-INFO602-2020-2021.pdf sujet PDF], [http://www.lama.univ-savoie.fr/pagesmembres/lachaud/Cours/INFO602/Examens/examen-sol-INFO602-2020-2021.pdf solution PDF]&lt;br /&gt;
#* Examen (2016-2017) : [http://www.lama.univ-savoie.fr/pagesmembres/lachaud/Cours/INFO602/Examens/examen-INFO626-2016-2017.pdf sujet PDF], [http://www.lama.univ-savoie.fr/pagesmembres/lachaud/Cours/INFO602/Examens/examen-sol-INFO626-2016-2017.pdf solution PDF]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N&#039;hésitez pas à contribuer au wiki, et en particulier à cette page:&lt;br /&gt;
clarifications, compléments, exemples…&lt;br /&gt;
&lt;br /&gt;
= Références=&lt;br /&gt;
* &#039;&#039;Introduction à l&#039;Algorithmique&#039;&#039;, de Cormen, Leiserson, Rivest et Stein, Ed. Dunod;&lt;br /&gt;
* &#039;&#039;The C programming language&#039;&#039;, de Kernighan et Ritchie;&lt;br /&gt;
* &#039;&#039;Le langage C&#039;&#039;, version française du précédent;&lt;br /&gt;
* Le wikilivre [http://fr.wikibooks.org/wiki/Programmation_C &#039;&#039;Programmation C&#039;&#039;]: un livre de cours sur le mode wikipedia.&lt;br /&gt;
&lt;br /&gt;
= Historique =&lt;br /&gt;
* Responsables pour 2021--2022: Jacques-Olivier Lachaud (C/1xTD/1xTP), Léo Richard (1xTP)&lt;br /&gt;
* (INFO602) Responsables pour 2020--2021: Jacques-Olivier Lachaud (C/2xTD/1xTP), Léo Richard (2xTP)&lt;br /&gt;
* (INFO626) Responsables pour 2019--2020: Jacques-Olivier Lachaud (C/2xTD/3xTP)&lt;br /&gt;
* Responsables pour 2018--2019: Jacques-Olivier Lachaud (C/TD/2xTP)&lt;br /&gt;
* Responsables pour 2017--2018: Jacques-Olivier Lachaud (C/TD/TP), Clovis Eberhardt (TP)&lt;br /&gt;
* Responsables pour 2016--2017: Jacques-Olivier Lachaud (C/TD/TP), Rodolphe Lepigre (TP)&lt;br /&gt;
* Responsables pour 2015--2016: Jacques-Olivier Lachaud (C/TD/TP), Rodolphe Lepigre (TP)&lt;br /&gt;
* Responsables pour 2014--2015: Jacques-Olivier Lachaud (C/TD/TP), Rodolphe Lepigre (TP)&lt;br /&gt;
* Responsable pour 2013--2014: Jacques-Olivier Lachaud (C/TD/TP)&lt;br /&gt;
* Responsable pour 19xx--2013: Yves Dumond (C/TD/TP)&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Cours-info607.pdf&amp;diff=15143</id>
		<title>Fichier:Cours-info607.pdf</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Cours-info607.pdf&amp;diff=15143"/>
		<updated>2024-04-09T08:13:22Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO607_:_Algorithmique_II&amp;diff=15142</id>
		<title>INFO607 : Algorithmique II</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO607_:_Algorithmique_II&amp;diff=15142"/>
		<updated>2024-04-09T08:12:13Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cours du semestre 6 de la licence INFORMATIQUE (ex INFO602, Algorithmique II)&lt;br /&gt;
&lt;br /&gt;
* Responsables pour 2022--2023: Jacques-Olivier Lachaud (C/1xTD/1xTP), Colin Weill-Duflos (2xTP)&lt;br /&gt;
&lt;br /&gt;
= Quelques ressources pour l&#039;étudiant =&lt;br /&gt;
&lt;br /&gt;
# Leçons et exercices&lt;br /&gt;
#* [[Media:INFO607-Lesson-1.pdf|Leçon 1 : complexité des algorithmes (rappels), notations O, Theta, Omega]] / [[Media:INFO607-Exo-1.pdf|Exercices]]&lt;br /&gt;
#* [[Media:INFO602-Lesson-2.pdf|Leçon 2 : analyse amortie des algorithmes]] / [[Media:INFO602-Exo-2.pdf|Exercices]]&lt;br /&gt;
#* [[Media:INFO602-Lesson-3.pdf|Leçon 3 : structures pour ensembles disjoints (union-find)]] / [[Media:INFO602-Exo-3.pdf|Exercices]]&lt;br /&gt;
#* [[Media:INFO602-Lesson-4.pdf|Leçon 4 : complexité des fonctions récursives]] / [[Media:INFO602-Exo-4.pdf|Exercices]]&lt;br /&gt;
#* [[Media:INFO602-Lesson-5.pdf|Leçon 5 : géométrie algorithmique]] / [[Media:INFO602-Exo-5.pdf|Exercices]]&lt;br /&gt;
# Notes de cours [http://www.lama.univ-savoie.fr/pagesmembres/lachaud/Cours/INFO602/Cours/notes-de-cours.pdf PDF]&lt;br /&gt;
# Fiches de TD&lt;br /&gt;
#* TD 1 : complexité des fonctions récursives, complexité amortie [http://www.lama.univ-savoie.fr/pagesmembres/lachaud/Cours/INFO602/TDs/td-1.pdf PDF]&lt;br /&gt;
#* TD 2 : complexité des tableaux dynamiques [http://www.lama.univ-savoie.fr/pagesmembres/lachaud/Cours/INFO602/TDs/td-2.pdf PDF]&lt;br /&gt;
# TPs et autres travaux pratiques. Les énoncés sont sur la [http://www.lama.univ-savoie.fr/pagesmembres/lachaud/Cours/INFO602/Tests/doc/html/index.html Pages des TPs].&lt;br /&gt;
#* Le langage choisi est le langage C.&lt;br /&gt;
#* Les TPs sont évalués et à rendre via [http://www.lama.univ-savoie.fr/TPLab TPLab]&lt;br /&gt;
#* Pour la première fois, on pourra aussi regarder la page [[Comment_compiler_le_C_%3F]]&lt;br /&gt;
#* Si vous n&#039;accédez pas aux pages &amp;quot;manual&amp;quot; en salle TP, on les trouve en ligne : [[http://www.linux-france.org/article/man-fr/ Manual pages]]&lt;br /&gt;
# Annales&lt;br /&gt;
#* Examen (2020-2021) : [http://www.lama.univ-savoie.fr/pagesmembres/lachaud/Cours/INFO602/Examens/examen-INFO602-2020-2021.pdf sujet PDF], [http://www.lama.univ-savoie.fr/pagesmembres/lachaud/Cours/INFO602/Examens/examen-sol-INFO602-2020-2021.pdf solution PDF]&lt;br /&gt;
#* Examen (2016-2017) : [http://www.lama.univ-savoie.fr/pagesmembres/lachaud/Cours/INFO602/Examens/examen-INFO626-2016-2017.pdf sujet PDF], [http://www.lama.univ-savoie.fr/pagesmembres/lachaud/Cours/INFO602/Examens/examen-sol-INFO626-2016-2017.pdf solution PDF]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N&#039;hésitez pas à contribuer au wiki, et en particulier à cette page:&lt;br /&gt;
clarifications, compléments, exemples…&lt;br /&gt;
&lt;br /&gt;
= Références=&lt;br /&gt;
* &#039;&#039;Introduction à l&#039;Algorithmique&#039;&#039;, de Cormen, Leiserson, Rivest et Stein, Ed. Dunod;&lt;br /&gt;
* &#039;&#039;The C programming language&#039;&#039;, de Kernighan et Ritchie;&lt;br /&gt;
* &#039;&#039;Le langage C&#039;&#039;, version française du précédent;&lt;br /&gt;
* Le wikilivre [http://fr.wikibooks.org/wiki/Programmation_C &#039;&#039;Programmation C&#039;&#039;]: un livre de cours sur le mode wikipedia.&lt;br /&gt;
&lt;br /&gt;
= Historique =&lt;br /&gt;
* Responsables pour 2021--2022: Jacques-Olivier Lachaud (C/1xTD/1xTP), Léo Richard (1xTP)&lt;br /&gt;
* (INFO602) Responsables pour 2020--2021: Jacques-Olivier Lachaud (C/2xTD/1xTP), Léo Richard (2xTP)&lt;br /&gt;
* (INFO626) Responsables pour 2019--2020: Jacques-Olivier Lachaud (C/2xTD/3xTP)&lt;br /&gt;
* Responsables pour 2018--2019: Jacques-Olivier Lachaud (C/TD/2xTP)&lt;br /&gt;
* Responsables pour 2017--2018: Jacques-Olivier Lachaud (C/TD/TP), Clovis Eberhardt (TP)&lt;br /&gt;
* Responsables pour 2016--2017: Jacques-Olivier Lachaud (C/TD/TP), Rodolphe Lepigre (TP)&lt;br /&gt;
* Responsables pour 2015--2016: Jacques-Olivier Lachaud (C/TD/TP), Rodolphe Lepigre (TP)&lt;br /&gt;
* Responsables pour 2014--2015: Jacques-Olivier Lachaud (C/TD/TP), Rodolphe Lepigre (TP)&lt;br /&gt;
* Responsable pour 2013--2014: Jacques-Olivier Lachaud (C/TD/TP)&lt;br /&gt;
* Responsable pour 19xx--2013: Yves Dumond (C/TD/TP)&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=15141</id>
		<title>VISI401 CMI : bibliographie scientifique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=15141"/>
		<updated>2024-04-05T15:42:30Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable:&lt;br /&gt;
* 2017--2021 : Jacques-Olivier Lachaud&lt;br /&gt;
* 2022-- : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
Ce module amène l&#039;étudiant à effectuer des recherches bibliographiques sur un sujet donné, et à synthétiser ses résultats sous la forme d&#039;un exposé construit.&lt;br /&gt;
&lt;br /&gt;
L&#039;étudiant, à partir d&#039;un sujet et d&#039;un ou plusieurs articles initiaux, doit approfondir le sujet, appréhender son historique, ses évolutions, et son état actuel. &lt;br /&gt;
&lt;br /&gt;
A côté des ressources fournies par les bibliothèques, quelques pointeurs très utiles pour faire des recherches bibliographiques:&lt;br /&gt;
* [https://scholar.google.fr Scholar Google] (libre)&lt;br /&gt;
* [https://researchgate.net ResearchGate] (libre)&lt;br /&gt;
* [https://mathscinet.ams.org/mathscinet/ MashSciNet] (plus math)&lt;br /&gt;
* [https://www.springerlink.com  Springer] (accès via USMB)&lt;br /&gt;
* [https://www.sciencedirect.com Elsevier Sciencedirect] (accès via USMB)&lt;br /&gt;
* SciHub lorsqu&#039;on ne trouve pas&lt;br /&gt;
&lt;br /&gt;
La synthèse bibliographique se fait en interaction avec le tuteur par des visites régulières et/ou des compte-rendus d&#039;avancement par email. La synthèse finale fait l&#039;objet d&#039;un exposé final (15-20 minutes + questions) et d&#039;un document de présentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Génération de labyrinthes &amp;quot;organiques&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; la génération de labyrinthes est un problème classique, notamment abordé dans les cours d&#039;algorithmes de graphes. Ces méthodes permettent de générer des labyrinthes sur des &#039;&#039;grilles&#039;&#039;, typiquement carrées :&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze_grid.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
La création de labyrinthe &amp;quot;organiques&amp;quot;, du style&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
utilise une méthode très différente. Les détails sont décrits dans un article publié en  2006: http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf. La description peut sembler très abstraite, mais l&#039;idée initiale est assez simple : une courbe initiale est, petit à petit, déformée aléatoirement.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; comprendre la méthode de base, et l&#039;implémenter pour générer des labyrinthes organiques. La première version pourra être codée en Python, mais comme la méthode nécessite une &#039;&#039;grosse&#039;&#039; quantité de calculs, il pourra être intéressant de coder une seconde version en utilisant un langage compilé si l&#039;on souhaite obtenir de &amp;quot;gros&amp;quot; labyrinthes. De nombreuses améliorations sont décrites dans l&#039;article de H. Pedersen et K. Singh, et il serait intéressant de d&#039;en implémenter certaines, soient en Python (en les testant sur de petits labyrinthes) soit dans un autre langage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039; Hans Pedersen et Karan Singh, &#039;&#039;Organic Labyrinths and Mazes&#039;&#039;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== Tramage artistique d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le tramage d&#039;une image (en anglais *dithering* ou *half-toning*) consiste à esquisser une image en niveaux de gris ou en couleur à l&#039;aide de très peu d&#039;encres ou couleurs différentes. Historiquement, l&#039;utilisation la plus courante est en impression: un fax ne dispose que d&#039;une encre noire (donc 2 couleurs noir et blanc pour transférer une image), les imprimantes n&#039;ont que 4 encres (et donc cinq couleurs jaune, cyan, magenta, noir et le blanc du papier). Les premiers ordinateurs avaient des écrans avec très peu de couleurs, donc les photos étaient approchées avec 8 ou 16 couleurs. &lt;br /&gt;
&lt;br /&gt;
En informatique, les algorithmes de tramage par diffusion d&#039;erreur [https://fr.wikipedia.org/wiki/Algorithme_de_Floyd-Steinberg#:~:text=L%27algorithme%20de%20Floyd%2DSteinberg,un%20pixel%20à%20ses%20voisins. Floyd-Steinberg] sont faciles à implémenter et rapide, donc très utilisés.&lt;br /&gt;
&lt;br /&gt;
Néanmoins, il existe des algorithmes qui donnent des résultats beaucoup plus jolis, notamment celui proposé par Ostromoukhov et Hersch (1999). Nous proposons de l&#039;étudier et de l&#039;implémenter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-david.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-photo.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Floyd-Steinberg&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Ostromoukhov-Hersch&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre les principes du tramage, éventuellement coder en python/opencv l&#039;algorithme basique. Comprendre ensuite l&#039;algorithme d&#039;Ostromoukhov et Hersch (1999), et l&#039;implémenter en python, d&#039;abord en noir et blanc, et si le temps le permet, en couleur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://dl.acm.org/doi/pdf/10.1145/311535.311605 Ostromoukhov et Hersch, Multi-Color and Artistic Dithering, ACM SIGGRAPH 1999]&lt;br /&gt;
* [https://opencv.org OpenCV], pratique pour lire une image, l&#039;afficher, faire des traitements.&lt;br /&gt;
&lt;br /&gt;
=== Rendu réaliste de scènes 3D par lancer de rayons ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note : &#039;&#039;&#039; Sujet demandé par Lukas Rey.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le rendu réaliste de scène 3D a été (et reste) un des objectifs majeurs de l&#039;informatique graphique, notamment grâce à ses nombreuses applications dans différents domaines : le cinéma (effets spéciaux), mais aussi le marketing, la publicité, l&#039;architecture, ou l&#039;art. L&#039;algorithme le plus utilisé est appelé &amp;quot;lancer de rayons&amp;quot;, avec un objectif de simuler le trajet des rayons lumineux dans une scène 3D afin de déterminer les couleurs perçues par un observateur. Plutôt que de calculer tous les rayons lumineux d&#039;une scène, cet algorithme calcule seulement le trajet inverse des rayons lumineux qui arrivent dans l&#039;oeil de l&#039;observateur, ce qui est beaucoup plus économique. On verra que cet algorithme permet de simuler des matériaux réfléchissants ou (semi-)transparents, de calculer des ombres portées, de simuler du brouillard...&lt;br /&gt;
&lt;br /&gt;
[[file:ray-tracing.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Il s&#039;agit de comprendre d&#039;où vient la couleur perçue d&#039;un objet, d&#039;implémenter l&#039;algorithme récursif classique du lancé de rayons, au moins avec des objets simples (sphères, tétraèdres), et de voir comment optimiser les calculs (car ça devient vite coûteux). On pourra s&#039;appuyer sur ce [https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html TP] pour l&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://en.wikipedia.org/wiki/Ray_tracing_(graphics)&lt;br /&gt;
* https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html&lt;br /&gt;
&lt;br /&gt;
=== Rendu temps réel avec OpenGL ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Colin Weill-Duflos&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; On cherche à utiliser une API graphique (OpenGL) afin de faire du rendu de scène 3d en utilisant la carte graphique. Cela permet d&#039;utiliser les techniques de rendu 3d en temps réel (rastérisation) et de les faire effectivement fonctionner en temps réel, permettant d&#039;afficher une scène avec laquelle on peut intéragir : en déplaçant la caméré, en bougeant des éléments...&lt;br /&gt;
Ces techniques ont déjà été utilisée dans des années précédentes, sans utiliser la carte graphique (le résultat était assez lent). Grâce à OpenGL, la plupart de ces opérations peuvent s&#039;effectuer sur la carte graphique, ce qui permet de ne pas avoir à en recoder une partie (grâce à des composants capables de faire uniquement ces opérations) et d&#039;être plus rapide.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre les techniques de raterisation&lt;br /&gt;
* comprendre la pipeline OpenGL&lt;br /&gt;
* implémenter une scène avec un objet et une caméra controlable&lt;br /&gt;
* rajouter des shaders pour simuler la lumière (Phong shading), variantes stylisées (Toon shading)&lt;br /&gt;
* rajouter des textures sur la scène&lt;br /&gt;
* faire des shadow maps pour les ombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [Travaux précédents](http://os-vps418.infomaniak.ch:1250/mediawiki/images/0/0d/Gossin-2023.pdf)&lt;br /&gt;
* [Pipeline OpenGL](https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview)&lt;br /&gt;
* [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
* [Toon shading](https://fr.wikipedia.org/wiki/Ombrage_de_cellulo%C3%AFd)&lt;br /&gt;
* [Shadow maps](https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping)&lt;br /&gt;
&lt;br /&gt;
=== Problèmes indécidables ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Quand on a un calcul à faire, on peut se demander de la meilleure implémentation pour faire faire ce calcul par un ordinateur. On pense généralement moins à la question - pourtant primordiale - de savoir si ce calcul peut être effectué par l’ordinateur. Pourtant, on sait depuis l’origine de l’informatique qu’il existe des fonctions que l’on ne peut pas calculer à l’aide d’un ordinateur.  On cherchera à comprendre ce que serait un programme qui résoudrait le problème de l’arrêt et pourquoi, il ne marchera pas. On pourra se demander alors s’il y a un lien entre les différents problèmes non-calculables : avec une librairie qui résout le problème de l’arrêt, peut-on écrire un problème qui résout le problème de correspondance de Post ? Peut-on imaginer un problème qu’on ne pourrait pas résoudre même si on avait une fonction qui résolvait le problème de l’arrêt ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de fonction calculable (et donc de fonction non-calculable). Donner des exemples. &amp;quot;Coder&amp;quot; l’argument diagonal de la non-calculabilité de l’arrêt. Coder une réduction entre deux problèmes non-calculables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Th%C3%A9orie_de_la_calculabilit%C3%A9 Wikipédia - Théorie de la calculabilité]&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_l%27arr%C3%AAt Wikipédia - Problème de l&#039;arrêt]&lt;br /&gt;
* [https://ludovicpatey.com/courses/comp-thy-2023/cr11-fr.pdf Livre récent en français sur la théorie de la calculabilité]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Réseaux de neurones et apprentissage ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; sujet demandé par Elliot Moiroud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
# se familiariser avec les concepts utilisés en apprentissage,&lt;br /&gt;
# essayer d&#039;implémenter une version ultra simple de la procédure d&#039;apprentissage,&lt;br /&gt;
# utiliser une bibliothèque existante sur quelques exemples.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
# http://neuralnetworksanddeeplearning.com/&lt;br /&gt;
&lt;br /&gt;
=== Synchronisation dans les Systèmes Distribués ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; François Boussion&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; l&#039;algorithme de Lamport joue un rôle crucial dans la synchronisation des horloges dans un réseau de machines qui ne sont pas nécessairement précises ou synchronisées entre elles. Il permet de créer un consensus sur l&#039;ordre des événements dans un système distribué, où la communication peut être retardée ou désordonnée. Cette capacité est fondamentale pour assurer la cohérence et la fiabilité des opérations dans des environnements distribués, tels que les bases de données distribuées, les systèmes de fichiers en réseau et les applications de blockchain. Après avoir maîtrisé l&#039;algorithme de Lamport, l&#039;étudiant pourra les fautes byzantines pour comprendre comment les systèmes distribués gèrent les informations contradictoires ou erronées transmises par différents nœuds du réseau.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Analyser et comprendre l&#039;algorithme de Lamport pour la synchronisation des horloges.&lt;br /&gt;
# (Examiner les fautes byzantines et leur influence sur la stabilité des systèmes distribués.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Time, Clocks, and the Ordering of Events in a Distributed System.&lt;br /&gt;
https://lamport.azurewebsites.net/pubs/time-clocks.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation dynamique et complexité ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; La programmation dynamique est sans doute une des techniques de programmation qui porte le plus mal son nom.  Elle s&#039;applique lorsqu&#039;un problème peut se décomposer en sous-problèmes, dont les solutions peuvent être combinées. Dans le cas relativement simples où les sous-problèmes sont toujours disjoint, on utilise une approche de type &amp;quot;diviser pour rêgner&amp;quot;. Lorsque ce n&#039;est pas le cas, il faut faire attention à ne pas dupliquer les calculs. Les deux approches habituelles sont :&lt;br /&gt;
# la &amp;quot;mémoization&amp;quot;, qui consiste à sauvegarder toutes les solutions trouvées pour éviter de les recalculer,&lt;br /&gt;
# la &amp;quot;programmation dynamique&amp;quot; qui consiste à faire les solutions dans le &amp;quot;bon ordre&amp;quot; afin de ne jamais avoir besoin d&#039;une solution qui n&#039;aurait pas été calculée.&lt;br /&gt;
&lt;br /&gt;
Ces techniques permettent en général d&#039;obtenir un algorithme beaucoup plus rapide que la version naïve.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# étudier les méthodes de &amp;quot;mémoization&amp;quot; et &amp;quot;programmation dynamique&amp;quot; sur plusieurs exemples et les comparer&lt;br /&gt;
# mettre en évidence les complexités &amp;quot;pratiques&amp;quot; de ces algorithmes au moyen de benchmarks pertinents&lt;br /&gt;
# comprendre les calculs &amp;quot;théoriques&amp;quot; de la complexité de ces algorithmes pour vérifier que les prédictions correspondent à la pratique.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;Introduction à l&#039;algorithmique&amp;quot;, T. Cormen, C. Leiserson, R. Rivest, C. Stein&lt;br /&gt;
# la page wikipedia française : https://fr.wikipedia.org/wiki/Programmation_dynamique&lt;br /&gt;
&lt;br /&gt;
== sujets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
=== algorithmes de recherche de chaines ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : rechercher si une chaine &#039;&#039;s1&#039;&#039; apparait à l&#039;intérieur d&#039;une chaine &#039;&#039;s2&#039;&#039; est assez simple, mais l&#039;algorithme naïf n&#039;est pas très rapide. L&#039;objectif de ce sujet est de s&#039;intéresser à certains algorithmes de recherche de sous-chaines plus efficaces. Le plus simple est probablement l&#039;algorithme KMP (du noms de ses inventeurs : Knuth, Morris et Pratt) qui évite des comparaisons inutiles de l&#039;algorithme naïf. L&#039;algorithme de Boyer-Moore utilise des idées similaires mais considère la sous-chaine (&#039;&#039;s1&#039;&#039;) à l&#039;envers, ce qui lui permet d&#039;aller en général plus vite. Ces algorithmes restent assez lents lorsque la chaine &#039;&#039;s2&#039;&#039; est très grande. C&#039;est par exemple le cas en bio-informatique lorsque l&#039;on doit rechercher des chaines dans le génome. Dans ce cas, la chaine &#039;&#039;s2&#039;&#039; est fixe et on rercherche de nombreuses sous-chaines &#039;&#039;s1&#039;&#039;. Il est alors possible de faire un &#039;&#039;pré-traitement&#039;&#039; pour faire une recherche beaucoup plus rapide qui ne dépend pas de la taille de &#039;&#039;s2&#039;&#039; !&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de quelques uns de ces algorithmes&lt;br /&gt;
*# les implémenter (par exemple en Python)&lt;br /&gt;
*# essayer de les comparer&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
# https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm&lt;br /&gt;
# transformé de Burrows-Wheeler et recherche de sous-chaines https://www.youtube.com/watch?v=P3ORBMon8aw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== génération de labyrinthes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : il existe de nombreuses méthodes algorithmiques pour générer des labyrinthes aléatoires. La plupart de ces méthodes sont expliquées sur des grilles carrées mais il est possible de les implémenter sur d&#039;autres types de grilles. Il est possible des les adapter par exemple pour générer des labyrinthes circulaires, cylindriques, ou sphériques ; ou bien des labyrinthes en plusieurs parties (de grandes pièces contenant des labyrinthes, reliées par des couloirs formant un autre labyrinthe).&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de plusieurs algorithmes de génération de labyrinthes&lt;br /&gt;
*# les étendres à des grilles plus intéressantes&lt;br /&gt;
*# &#039;&#039;expérimenter et chercher des manières simples de générer un labyrinthe &amp;quot;continu&amp;quot;&#039;&#039; (La solution décrite dans &amp;quot;How to Generate Perfect Mazes?&amp;quot; est probablement un peu trop complexe.)&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** le livre &amp;quot;Mazes for programmers&amp;quot;, https://pragprog.com/titles/jbmaze/mazes-for-programmers/&lt;br /&gt;
** l&#039;article &amp;quot;How to Generate Perfect Mazes?&amp;quot;, https://hal.uca.fr/hal-03174952/file/article-journal-2020.pdf&lt;br /&gt;
** l&#039;article &amp;quot;Organic Labyrinths and Mazes&amp;quot;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== L’infâme GOTO ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : L’instruction goto n’a aujourd’hui plus la côte parmi les informaticiens, et est souvent considérée comme une instruction à bannir. L&#039;idée est d&#039;explorer ce que permet cette instruction, et comment a évolué son utilisation.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# remplacer des structures de contrôles simples simples par des goto&lt;br /&gt;
*# faire un programme plus complexe utilisant un maximum de goto&lt;br /&gt;
*# expliquer l&#039;évolution de l&#039;utilisation du goto&lt;br /&gt;
*# avantages/inconvénients de son utilisation&lt;br /&gt;
*# comparaison des langages prenant en charge ou non cette instruction et pourquoi&lt;br /&gt;
*# utilisation actuelle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Blockchains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : les blockchains sont de plus en plus populaires, utilisées initialement pour les cryptomonnaies, elles peuvent être utilisées pour stocker des données, gérer les contrats intelligents, etc.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre le fonctionnement des blockchains (par exemple avec l&#039;article de Satoshi Nakamoto)&lt;br /&gt;
*# implémenter une blockchaine&lt;br /&gt;
*# ...&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de reconstruction de surfaces à partir d&#039;images 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les images 3D sont devenues courantes avec les outils d&#039;acquisition comme les scanners X ou les scanners IRM. On peut aussi modéliser des objets 3D sous forme de volumes, pour ensuite en extraire des surfaces (e.g. modélisation de fluides, de feu ou de fumées). Un enjeu est de pouvoir construire des surfaces qui représentent le bord d&#039;objets d&#039;intérêt dans ces données volumiques. Les algorithmes les plus classiques reconstruisent une surface composée de triangles qui approchent un niveau de gris donné dans le volume 3D :  c&#039;est une iso-surface, comparable à une courbe d&#039;iso-altitude dans une carte topographique, mais en 3D ! On  s&#039;intéreressera à deux algorithmes particulièrement : le marching-tetrahedra et le marching-cubes.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre ce qu&#039;est une iso-surface dans une image 3D ou dans une fonction implicite.&lt;br /&gt;
*# Comprendre les points communs et différences des algorithmes Marching Tetrahedra et Marching Cubes&lt;br /&gt;
*# Implémenter un des deux algorithmes. On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python. &lt;br /&gt;
*# On lira des fichiers .vol pour les images 3D, qui vous seront fournies.&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_tetrahedra Marching Tetrahedra sur wikipedia]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_cubes Marching Cubes sur wikipedia]&lt;br /&gt;
** [https://dl.acm.org/doi/pdf/10.1145/37402.37422 Lorensen, Cline, Marching cubes: a high resolutions 3D surface construction algorithm, Computer Graphics, 21(4), 1987]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-slices.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-isosurface.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Coupes dans une image 3D &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Isosurface dans cette image &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Invitation à la complexité algorithmique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
* Résumé : on abordera le thème de la complexité algorithmique : étant donné un programme implémentant une fonction, peut-on borner son temps de calcul en fonction de la taille de ses entrées. On procédera par l&#039;exemple, en tentant de confirmer la théorie par des expériences concrets de petits programmes (par exemple en Python). Comme point d&#039;entrée, on pourra par exemple examiner les différences de complexité entre quelques algorithmes de tri.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre l&#039;intérêt de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;,&lt;br /&gt;
*# se familiariser avec les notions et notations utilisées pour décrire la complexité en temps de calcul (ou en mémoire) des algorithmes,&lt;br /&gt;
*# apprendre à vers de &amp;quot;benchmarks&amp;quot; pour évaluer l&#039;efficacité réelle d&#039;une fonction dans un langage de programmation,&lt;br /&gt;
*# comprendre les limites de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== sujets 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
===Rust et la notion d&#039;appartenance (&amp;quot;ownership&amp;quot;)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Théo Connetable : [[Fichier:VISI401-2022-Connetable.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : dans la plupart des langages &amp;quot;haut niveau&amp;quot; (Python, Java, Javascript, ...), la mémoire est gérée automatiquement. Par exemple, Python détecte qu&#039;une liste ne sert plus à rien pour libérer la mémoire qu&#039;elle occupait. Dans les langages &amp;quot;bas niveau&amp;quot; (C), c&#039;est au programmeur de libérer explicitement la mémoire qu&#039;il utilise. (S&#039;il ne le fait pas, son programme risque d&#039;avoir des &amp;quot;fuites de mémoire&amp;quot;.) Rust est un nouveau (première version en 2010) langage de programmation. Un des objectifs de Rust est d&#039;offrir des garanties de sécurité sur la mémoire avec la notion d&#039;appartenance. Ces garanties sont testées à la compilation et ne dégradent donc pas l&#039;efficacité du programme final.&lt;br /&gt;
* Objectifs : l&#039;objectif, après s&#039;être familiarisé avec le langage Rust, est de comprendre à quoi correspond la notion de &amp;quot;ownership&amp;quot; (&amp;quot;appartenance&amp;quot;) et de l&#039;illustrer sur quelques exemples. Si l&#039;étudiant ne les connait pas, les notions de pointeurs (en C), d&#039;allocation sur la pile, sur le tas, et le concept de &amp;quot;ramasse miettes&amp;quot; (garbage collector&amp;quot; en anglais) seront des étapes préliminaires importantes.&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# The Rust Programming Language https://doc.rust-lang.org/book/title-page.html, avec en particulier la section 4, &amp;quot;Understanding Ownership&amp;quot;&lt;br /&gt;
*# Safe Systems Programming in Rust https://cacm.acm.org/magazines/2021/4/251364-safe-systems-programming-in-rust/fulltext&lt;br /&gt;
*# Rust Ownership by Example https://depth-first.com/articles/2020/01/27/rust-ownership-by-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Bitcoin &amp;amp; blockchain===&lt;br /&gt;
* Présentation : Baptiste Griva [[Fichier:VISI401-2022-Griva.pdf]]&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Les blockchain sont de plus en plus populaires. Avec l&#039;article de Satoshi Nakamoto, l&#039;étudiant devra comprendre son fonctionnement. On pourra dans un second temps s&#039;intéresser aux attaques habituelles face à une blockchain.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre le fonctionnement de la blockchain bitcoin&lt;br /&gt;
*# S&#039;intéresser à ses vulnérabilités (51% attack,...)&lt;br /&gt;
* Références: pour commencer https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
===Débruitage d&#039;image===&lt;br /&gt;
* Présentation : Lucas Policastro [[Fichier:VISI401-2022-Policastro.pdf]]&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La plupart des procédés d&#039;acquisition d&#039;image (typiquement capteurs CCD ou CMOS des caméras ou téléphones) ne sont pas parfaits et introduisent du bruit (des perturbations) dans les images résultantes. Ce bruit ressemble en général à une perturbation aléatoire locale par capteur, indépendante de ce  qui se passe sur un capteur proche. Peut-on alors améliorer la qualité visuelle d&#039;une photo dégradée par un tel bruit (typiquement gaussien) ? On regardera notamment les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
*# On pourra s&#039;appuyer sur les démos IPOL en ligne de ces algorithmes et leur description. http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
*# L&#039;algorithme des moyennes non locales est implémentable relativement facilement (même en numpy).&lt;br /&gt;
* Références:&lt;br /&gt;
** http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
** Le site https://www.ipol.im contient plein d&#039;algos de restauration d&#039;image (suivre Enhancement &amp;amp; Restoration, puis Denoising).&lt;br /&gt;
&lt;br /&gt;
===Sécurité des cartes RFID : le cas Mifare===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Paul Aubry [[Fichier:VISI401-2022-Aubry.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : les cartes RFID (Radio Frequency IDentification) sont des cartes à puce qui peuvent communiquer avec un lecteur distant (mais proche). De nombreuses cartes de transport en commun ou d&#039;ouverture de portes utilisent cette technologie. La carte Mifare classic, très répandue, utilise un protocole cryptographique pour éviter les &amp;quot;replay attacks&amp;quot; (enregistrer un échange pour le réutiliser) et le clonage de la carte. Le détails du protocole est longtemps resté un secret industriel, mais ceci n&#039;a pas empéché la découverte de *grosses* failles. Il est maintenant possible de cloner une carte Mifare en quelques secondes avec du matériel grand public.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre fonctionne la protection contre les &amp;quot;replay attacks&amp;quot; à partir de challenges cryptographiques&lt;br /&gt;
*# comprendre le protocole Mifare classic&lt;br /&gt;
*# comprendre les attaques sur le protocole&lt;br /&gt;
*# expérimenter avec des puces RFID existante *(facultatif)*&lt;br /&gt;
*# regarder les évolutions du protocole pour se protéger de ces attaques&lt;br /&gt;
* Référence : F. D. Garcia, P. van Rossum, R. Verdult, R. Wichers Schreur : &amp;quot;Wirelessly Pickpocketing a Mifare Classic Card&amp;quot; https://www.cs.ru.nl/~flaviog/publications/Pickpocketing.Mifare.pdf&lt;br /&gt;
&lt;br /&gt;
===Ingénierie Dirigée par les Modèles (IDM)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Alexandre Desbos [[Fichier:VISI-401-2022-Desbos.pdf]]&lt;br /&gt;
* Tuteur : Philippe Pernelle&lt;br /&gt;
* Résumé : l&#039;ingénierie dirigée par les modèles (ou MDE Model Driven Engineering) est une approche de conception basée sur la transformation de modèle sur des niveaux d&#039;abstraction différents (modèle, méta-modèle, méta-méta-modèle ...). l&#039;OMG propose une approche MDE basée sur 3 niveaux  d&#039;abstraction (CIM,PIM, PSM)  permettant de bâtir une application  en partant du niveaux d&#039;abstraction le plus haut (CIM) et en procédant par transformation / raffinement pour arriver au PSM puis à la génération de code. Il existe par ailleurs différents langages  (ATL, OCL) qui vont faciliter la transformation de modèle. A noter que la fondation Eclipse propose un environnement spécifique pour manipuler des modèles avec des implémentations d&#039;ATL et d&#039;OCL&lt;br /&gt;
* Objectifs :  L&#039;objectif est d&#039;étudier ces mécanismes de transformation / raffinement par l&#039;implémentation d&#039;un cas d&#039;étude dans eclipse en utilisant les langages ATL et OCL. Après une étude bibliographique des principes de MDA, l&#039;idée est de mettre en oeuvre dans Eclipse des extrait des modèles CIM, PIM et PSM proposés par les articles ci-dessous puis d&#039;essayer de construire des OCL et des scripts ATL afin de faciliter la transformation (sans aller jusqu&#039;à la génération de code)&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# These : https://hal.archives-ouvertes.fr/tel-01247610 (uniquement les pages 35 à 47)&lt;br /&gt;
*# Models and Mechanisms for implementing playful scenarios https://hal.archives-ouvertes.fr/hal-01372311&lt;br /&gt;
*# Digital Twin and Ecological Transition Integration in Training Process https://hal.archives-ouvertes.fr/hal-03375508&lt;br /&gt;
*# Eclipse Modeling Tools https://www.eclipse.org/downloads/packages/release/2021-12/r/eclipse-modeling-tools&lt;br /&gt;
&lt;br /&gt;
===[[Couvrir un polygone rectilinéaire avec des rectangles]]===&lt;br /&gt;
* Présentation : Maxent Bernier [[Fichier:VISI401-2022-Bernier.pdf]]&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Un polygone est dit rectilinéaire si les seuls angles qui apparaissent sont des angles droits. On considérera des polygones simples (i.e., sans trous et qui ne s&#039;auto-intersectent pas). Un tel polygone peut donc être recouvert par des carrés ou par des rectangles. On cherchera à écrire un algorithme qui trouve une couverture minimale (i.e., avec le moins de carrés/rectangles possibles). Dans le cas des carrés, on va pouvoir trouver un algorithme efficace pour ce problème. Malheureusement, le cas de la couverture minimale par les rectangles est NP-complète. &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme de recouvrement par des carrés&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet et le lien avec la couverture par les rectangles&lt;br /&gt;
*# Contourner la difficulté de la NP-complétude (heuristique ou cas des polygones orthogonalement convexes)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polygon_covering#cite_note-cr88-4  Couvertures de polygones (Wikipedia)]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/NP-completeness NP-complétude (Wikipedia)]]&lt;br /&gt;
** [[http://webdocs.cs.ualberta.ca/~joe/Preprints/Cover/paper.ps La couverture par rectangles est NP-complète]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires ===&lt;br /&gt;
&lt;br /&gt;
*Présentation : Emilien Boitouzet [[Fichier:VISI401-2022-Boitouzet.pdf]]&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
[[Fichier:automate_1.png]] [[Fichier:automate_2.jpeg]]&lt;br /&gt;
* Sujet : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser des calculs. Cependant les réalisations pratiques manquent, ce sujet se propose d’étudier l’utilisation des automates cellulaires dans les domaines suivant par exemple :&lt;br /&gt;
*# Modélisation des systèmes complexes (propagation des feux de forêt, processus de percolation, écoulement du sable ...)&lt;br /&gt;
*# Modélisation du comportement d&#039;un gaz&lt;br /&gt;
*# Système dynamique discret alternatif au modèle physique des équations aux dérivées partielles&lt;br /&gt;
*# Modélisation de la croissance de tissus cellulaires en biologie&lt;br /&gt;
*# Simulation de la croissance des cristaux&lt;br /&gt;
*# Correction automatique d’erreurs en imagerie&lt;br /&gt;
* Référence: https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
&lt;br /&gt;
=== Programmation bare-metal ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Andrien Montmayeur [[Fichier:VISI401-2022-Montmayeur.pdf]]&lt;br /&gt;
* Tuteur : Colin Weill-Duflos&lt;br /&gt;
* Sujet : l&#039;execution d&#039;un programme compilé peut parfois paraître un peu magique: on ne comprend pas forcément tout ce que fait le compilateur, et le système d&#039;exploitation fournit des abstractions bien pratiques. Comment se débrouille-t-on dans un contexte où il n&#039;y a pas de système d&#039;exploitation, comme certaines applications embarquées ou bien le système d&#039;exploitation lui-même?&lt;br /&gt;
* Objectifs : comprendre en détails la chaîne de compilation du C, l&#039;architecture d&#039;un executable et comment ce dernier est executé par une machine pour parvenir à faire executer un programme directement par un microprocesseur arm et interagir avec des périphériques simples.&lt;br /&gt;
* Référence:&lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Executable_and_Linkable_Format Architecture d&#039;un executable]&lt;br /&gt;
*#[https://aticleworld.com/c-compilation-process/ les étapes de compilation du C] (regarder notamment le linkage)&lt;br /&gt;
*# [https://azeria-labs.com/arm-data-types-and-registers-part-2/ débuter avec l&#039;assembleur arm]&lt;br /&gt;
&lt;br /&gt;
===GeoGebra et algèbre géométrique ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Nolann Sanmarti [[Fichier:VISI401-2022-Sanmarti.pdf]]&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Sujet : l&#039;algèbre géométrique émerge récemment comme un outil prometteur pour la synthèse d&#039;images : avec des points de contrôle, un produit, il est possible de représenter et de manipuler de manière efficace un ensemble d&#039;objets géométriques. Récemment, des bibliothèques c++ ont été développées. Ces bibliothèques autorisent une utilisation générique de l&#039;algèbre géométrique mais sont encore limitées par le manque d&#039;outils intéractifs adaptés. Par ailleurs, le logiciel de visualisation GeoGebra est un outil particulièrement utile pour la visualisation et la résolution de problèmes géométriques. Le but de ce projet serait de travailler un binding entre l&#039;algèbre géométrique et GeoGebra.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# se familiariser avec l&#039;algèbre géométrique, et l&#039;applet Javascript de GeoGebra,&lt;br /&gt;
*# identifier les objets et les opérations géométriques intéressantes à visualiser avec l&#039;algèbre géométrique,&lt;br /&gt;
*# implantations d&#039;une méthode générique permettant de générer des scripts dans l&#039;applet Javascript de GeoGebra.&lt;br /&gt;
* Références :&lt;br /&gt;
*# Projective geometric algebra: A new framework for doing euclidean geometry, Charles G. Gunn, 2019&lt;br /&gt;
*# [http://www.geogebra.org geogebra]&lt;br /&gt;
&lt;br /&gt;
== sujets 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
=== Comment Facebook gère ses données ?  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Pour une base de données, il est impossible d&#039;être cohérent, disponible tout le temps et partitionné. C&#039;est le fameux théorème CAP. Pour autant, les données de Facebook sont cohérentes, disponibles tout le temps, et réparties à travers le monde !? Impossible. Pour l&#039;étudiant, il faudra comprendre pourquoi c&#039;est impossible, et comment Facebook fait en pratique pour gérer ce problème.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le CAP théorème, et sa démonstration&lt;br /&gt;
*# Comprendre comment Facebook gère ce problème, et ses données d&#039;une manière générale&lt;br /&gt;
*# À définir, selon les questions que se pose l&#039;étudiant.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Théorème CAP :&lt;br /&gt;
*## https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_CAP&lt;br /&gt;
*## Brewer&#039;s Conjeture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services (https://awoc.wolski.fi/dlib/big-data/GiLy02-CAP.pdf)&lt;br /&gt;
*# Facebook Social Graph :&lt;br /&gt;
*## TAO : The power of the graph (https://engineering.fb.com/2013/06/25/core-data/tao-the-power-of-the-graph/)&lt;br /&gt;
*## TAO: Facebook’s Distributed Data Store for the Social Graph (https://www.usenix.org/system/files/conference/atc13/atc13-bronson.pdf)&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de calcul de l&#039;enveloppe convexe  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les ensembles convexes ont beaucoup de propriétés géométriques intéressantes, par exemple détecter la collision de deux ensembles convexes est &amp;quot;facile&amp;quot; algorithmiquement. Une étape fréquente dans beaucoup d&#039;algorithmes de traitements de données 2D/3D/nD est donc de calculer l&#039;enveloppe convexe d&#039;un nuage de points, c&#039;est-à-dire le plus petit ensemble convexe contenant ces points. Il existe de nombreux algorithmes de calcul d&#039;enveloppe convexe en 2D (Graham scan, Melkman, balayage de ligne (sweep-line), division-fusion, Chan&#039;s algorithm, Quickhull) et 3D (Chan&#039;s algorithm, Quickhull) et même nD (Quickhull notamment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
|Enveloppe convexe des points à coordonnées entières inclus dans une boule de diamètre 25&lt;br /&gt;
|----&lt;br /&gt;
[[Fichier:Qhull-25.png|300px]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Objectifs: il s&#039;agira de regarder quelques uns de ces algorithmes, d&#039;identifier leurs principales différences ainsi que leurs complexités théoriques et pratiques. On pourra aussi regarder plus précisément l&#039;algorithme Quickhull, dont l&#039;implémentation 2D est facile, et 3D accessible.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Barber, C. B., Dobkin, D. P., &amp;amp; Huhdanpaa, H. (1996). The quickhull algorithm for convex hulls. ACM Transactions on Mathematical Software (TOMS), 22(4), 469-483 [[https://www.researchgate.net/profile/Hannu_Huhdanpaa/publication/242414606_The_Quickhull_Algorithm_for_Convex_Hulls/links/54e5f6970cf2bff5a4f1e7db.pdf (PDF)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Graham_scan Algorithme de Graham (Wikipedia)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Convex_hull_algorithms Convex hull algorithms (Wikipedia)]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes autour des polyominos ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Un polyomino est une forme (sans trou) obtenue en collant des petits carrés de taille 1 par leurs bords. Des exemples connus sont par exemples les pièces du jeu tetris : il s&#039;agit de &amp;quot;tétramino&amp;quot;, c&#039;est à dire de polyomino formés de 4 carrés. Voici également les pentaminos, composés de 5 carrés :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:polyominos.png]]&lt;br /&gt;
&lt;br /&gt;
Une question récurrente est celle de la pavabilité : peut-on (en utilisant certains types de polyominos) paver un domaine donné.&lt;br /&gt;
Lorsque le domaine est fini, on peut utiliser une recherche exhaustive, mais lorsqu&#039;on veut paver tout le plan, le problème devient indécidable en général.&lt;br /&gt;
Nous nous intéresserons au cas le plus simple : est-il possible de paver le plan tout entier en utilisant des polyominos tous identiques, et en utilisant uniquement des translations.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pavages.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les définitions et notions de bases des polyominos, et en particulier leur représentation comme mot de contour&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance de polyominos en Python&lt;br /&gt;
*# comprendre la caractérisation des polyominos &amp;quot;exacts&amp;quot;, càd ceux qui pavent le plan&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance des polyominos exacts en Python&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Bibliographie initiale&lt;br /&gt;
*# [http://www.xprov.org/doc/these-XProvencal.pdf &amp;quot;Combinatoire des mots, géométrie discrète et pavages&amp;quot;], Xavier Provencal (chapitres 1 et 2)&lt;br /&gt;
*# [https://www.lama.univ-smb.fr/pagesmembres/vuillon/IanRAIRO.pdf &amp;quot;An algorithm for deciding if a polyomino tiles the plane by translation&amp;quot;], Ian Gambini et Laurent Vuillon&lt;br /&gt;
&lt;br /&gt;
=== Version algorithmique du lemme local de Lovász  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons un problème standard sur le routage de paquets dans des réseaux. Donnés un réseau et une collection de paquets, chacun venant avec un chemin dans le réseau (de la source vers la destination), le but est d’établir un planning qui minimise le temps pour que tous les paquets atteignent leur destination. Il est naturel de mesurer la qualité d’un tel planning en fonction de deux paramètres : la congestion c qui est le nombre maximum de paquets qui doivent emprunter une même arête du réseau et la dilatation d qui est le nombre maximum d’arêtes d’un chemin. En effet, il est facile de trouver un planning en temps c*d, et tout planning doit prendre comme temps au moins max(c,d). &lt;br /&gt;
&lt;br /&gt;
En 1994, Leighton, Maggsand et Rao ont montré qu’il existait toujours un planning en temps O(c+d). Malheureusement, ce résultat est basé sur le lemme local de Lovász. Il s’agit d’un résultat classique de combinatoire dont la preuve était à l’époque non constructive. Le problème précédent du routage de paquets n’est qu’une application de ce lemme parmi tant d’autres. En 2010, Moser et Tardos donnèrent un algorithme (en plus assez simple et efficace) pour le lemme local de Lovász.&lt;br /&gt;
&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le lemme local de Lovász et certaines de ses applications&lt;br /&gt;
*# Coder la version algorithmique de Moser et Tardos&lt;br /&gt;
*# Coder des applications du lemme (comme par exemple le routage de paquets)&lt;br /&gt;
* Bibliographie initiale : &lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Algorithmic_Lov%C3%A1sz_local_lemma Page wikipedia de la version algorithmique du lemme local de Lovász]&lt;br /&gt;
*# [http://www.scs.cmu.edu/afs/cs.cmu.edu/project/phrensy/pub/papers/LeightonMR94.pdf Application aux routage de paquets par Leighton, Maagsand et Rao]&lt;br /&gt;
*# [https://arxiv.org/pdf/0903.0544.pdf La version algorithmique du lemme local de Lovász par Moser et Tardos]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* Crypto-système de Merkle-Hellman et algorithme de Shamir, Ewan Rakotoanosy (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Reconstruction de surfaces à partir de nuages de points et de normales, Yohan Thépaut (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Algorithmes de super-résolution par apprentissage, Romain Théodet (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Autour de la question de la sensibilité des fonctions Booléennes, Christophe Carmagnac (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Structures de données purement fonctionnelles]], Loïc Dornel (Tuteur : Tom Hirschowitz)&lt;br /&gt;
* Automates cellulaires et décidabilité, Lucas Chardonnet (Tuteur : François Boussion)&lt;br /&gt;
&lt;br /&gt;
== sujets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
=== Crypto-système de Merkle-Hellman et algorithme de Shamir ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Le système de Merkle-Hellman est un système cryptographique de type &amp;quot;clé publique / clé privée&amp;quot;. Il a été inventé juste en 1978, après le système RSA (encore utilisé). Ce système a l&#039;avantage d&#039;être un peu plus simple, mais le **gros** désavantage d&#039;avoir été craqué par A. Shamir en 1984. L&#039;objectif est de comprendre le système, et la faille qu&#039;il contenait. Cela permettra de comprendre l&#039;algorithme de Shamir...&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Shamir, Adi (1984). &amp;quot;A polynomial-time algorithm for breaking the  basic Merkle - Hellman cryptosystem&amp;quot;. IEEE Transactions on Information  Theory. 30 (5): 699–704. doi:10.1109/SFCS.1982.5 [[http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.123.5840&amp;amp;rep=rep1&amp;amp;type=pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Reconstruction de surfaces à partir de nuages de points et de normales ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les lasers d&#039;acquisition de données 3d permettent de fabriquer des données qui approchent le bord d&#039;un objet 3D. Ces données sont souvent sous la forme d&#039;un nuage de points, doublé d&#039;un vecteur associé à chaque point et qui indique la direction normale à la surface de l&#039;objet. On parle de données de Hermite. Il existe des algorithmes dédiés, très efficaces et robustes, pour reconstruire une surface qui passe par ces points. L&#039;objectif est de comprendre les deux principales méthodes, l&#039;une appelée reconstruction de Poisson, l&#039;autre relié à la notion d&#039;indice (ou winding number), leurs qualités et leur défaut.&lt;br /&gt;
* Bibliographie initiale:&lt;br /&gt;
** KAZHDAN, Michael, BOLITHO, Matthew, et HOPPE, Hugues. Poisson surface reconstruction. In : Proceedings of the fourth Eurographics symposium on Geometry processing. 2006 [[http://faculty.cs.tamu.edu/schaefer/teaching/689_Fall2006/poissonrecon.pdf PDF]]&lt;br /&gt;
** BARILL, Gavin, DICKSON, Neil G., SCHMIDT, Ryan, et al. Fast winding numbers for soups and clouds. ACM Transactions on Graphics (TOG), 2018, vol. 37, no 4, p. 43. [[http://www.dgp.toronto.edu/projects/fast-winding-numbers/fast-winding-numbers-for-soups-and-clouds-siggraph-2018-compressed-barill-et-al.pdf]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de super-résolution par apprentissage ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La super-résolution consiste à, étant donné une image M x N, de fabriquer une image &amp;quot;zoomée&amp;quot; de taille kM x kN, où l&#039;information inventée est &amp;quot;crédible&amp;quot;. Le problème est évidemment mal posé mathématiquement, et du coup on rajoute de l&#039;information a priori : continuité des couleurs, continuité des structures géométriques, modèles probabilistes, moyennes non-locales (auto-similarités), etc. Avec l&#039;avènement du deep learning, des méthodes à base d&#039;apprentissage ont vu le jour. En gros, un réseau de neurones (CNN) apprend sur plein d&#039;images en &amp;quot;dézoomant&amp;quot; les images en entrées (facile, on sous-échantillonne), puis on utilise la fonction construite pour faire la super-résolution.&lt;br /&gt;
* L&#039;objectif est de regarder les méthodes de super-résolution, notamment celles par apprentissage et de voir leurs qualités et défauts. On pourra aussi les comparer avec des méthodes purement géométriques de super-résolution, ou des méthodes de moyennes non-locales.&lt;br /&gt;
* Ce sujet a été discuté avec Romain Théodet et conduit à un stage au LAMA pour combiner méthode géométrique et méthode par deep learning pour la super-résolution.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** SHI, Wenzhe, CABALLERO, Jose, HUSZÁR, Ferenc, et al. Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network. In : Proceedings of the IEEE conference on computer vision and pattern recognition. 2016. p. 1874-1883 [[https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf PDF]]?&lt;br /&gt;
** Lachaud, J.-O. and Kerautret, B., Geometric Total Variation for image vectorization, zooming and pixel art depixelizing, In : Proceedings of 5th Asian Conference on Pattern Recognition, 2019 [[Fichier:Paper-GTV.pdf]]&lt;br /&gt;
** [[https://github.com/kerautret/GTVimageVect Démos en ligne d&#039;algorithmes de super-résolution]]&lt;br /&gt;
&lt;br /&gt;
=== Autour de la question de la sensibilité des fonctions Booléennes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : On souhaite s’intéresser aux problèmes résolus par des algorithmes qui répondent par Vrai/Faux. Ces problèmes ont des entrées dans {0,1}^n (entrées codées en binaire) et une sortie dans {0,1) (Vrai ou Faux). Il est donc naturel de s’intéresser aux propriétés de ces fonctions Booléennes. Un certain nombre de paramètres intéressants ont été identifiés, comme la complexité du certificat (nombre minimal de bits nécessaires pour connaître la valeur de sortie), le degré (degré d’un polynôme qui correspond à la fonction sur les entrées Booléennes), la sensibilité (lnombre de bits qui, s’ils sont modifiés, impliquent une modification de la sortie), et bien d’autres (taille d’un arbre de décision, complexité en requêtes classiques ou quantiques, taille des coefficients de Fourier,…). En 1992, Nisan et Szegedy ont montré que tous ces paramètres sont reliés entre eux : si on connait l’un d’eux, par exemple le degré, on sait alors que n’importe quel autre de ces paramètres, par exemple la taille de l’arbre de décision, est limité à un certain intervalle de valeurs. Tous, sauf un : la sensibilité. Aucune méthode de preuve semblait impliquer que ce paramètre ne pouvait pas être beaucoup plus petit que les autres. Nisan et Szegedy posèrent alors la question de savoir si la sensibilité d’une fonction Bolléenne était reliée ou non aux autres paramètres classiques.&lt;br /&gt;
* Cet été, en 2019, un chercheur, Hao Huang, a montré dans une preuve de deux pages que la sensibilité ne pouvait pas être significativement plus petite que les autres paramètres, résolvant le problème posé 27 ans auparavant. Cette &amp;quot;sensitivity&amp;quot; conjecture a été attaquée en vain par de nombreux chercheurs renommés. Or, la nouvelle preuve est si simple qu’un chercheur l’a résumé en un [[https://twitter.com/BooleanAnalysis/status/1145837576487612416 tweet]].&lt;br /&gt;
* L&#039;objectif est de comprendre quels sont les paramètres classiques des fonctions Booléennes et des liens entre eux avant de s&#039;intéresser à la preuve de la conjecture. On pourra essayer de construire des fonctions extrémales (ie, avec des paramètres extrémaux dans leur plage de valeurs).&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** Le papier original où la question a été posée : N. Nisan, M. Szegedy. [[https://www.researchgate.net/profile/Mario_Szegedy/publication/2508255_On_the_Degree_of_Boolean_Functions_as_Real_Polynomials/links/09e41514878e7ef890000000.pdf On the degree of Boolean functions as real polynomials.]] Comput. Complexity, 4 (1992), 462–467.&lt;br /&gt;
** Une référence sur l&#039;analyse des fonctions Booléennes : Ryan O’Donnell. [[http://www.cs.tau.ac.il/~amnon/Classes/2016-PRG/Analysis-Of-Boolean-Functions.pdf Analysis of Boolean Functions]], Cambridge University Press, 2014  &lt;br /&gt;
** La preuve de la conjecture : Hao Huang. [[https://arxiv.org/abs/1907.00847 Induced subgraphs of hypercubes and a proof of the Sensitivity Conjecture]]. Annals of Mathematics, 190 (2019), 949-955&lt;br /&gt;
&lt;br /&gt;
=== Structures de données purement fonctionnelles ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;algorithmique est souvent enseignée sur des langages principalement impératifs tels que C. Les structures de données utilisées ne sont pas toujours évidentes à traduire vers les langages fonctionnels tels que OCaml. L&#039;étudiant s&#039;initiera aux structures de données fonctionnelles et aux concepts liés tels que la persistence, en suivant le livre « Purely functional data structures » d&#039;Okasaki.&lt;br /&gt;
* Liens&lt;br /&gt;
** [[https://www.cs.cmu.edu/~rwh/theses/okasaki.pdf La thèse d&#039;Okasaki (PDF)]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires et décidabilité ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Un automate cellulaire est un modèle de calcul discret, utilisé en dans différentes sciences (informatique, mathématiques, physique, biologie, etc;). Le jeu de la vie est l&#039;exemple emblématique d&#039;automate cellulaire. Les règles de calcul d&#039;un automate cellulaire, et de son évolution au cours du temps sont assez simples, mais mènent cependant à des problèmes complexes dont certains indécidables. Par exemple, déterminer si, étant donné des règles, on arrivera forcément, en un nombre fini d&#039;étapes, dans une configuration donné, quelque soit la configuration initiale (problème de nilopotence).&lt;br /&gt;
* L&#039;objectif est de s&#039;intéresser à ces problèmes indécidables dans les automates cellulaires et de produire un mini-cours sur le sujet.&lt;br /&gt;
* Références &lt;br /&gt;
** K. JARKKO, The nilpotency problem of one-dimensional cellular automata, SIAM J. Comput., Vol. 21, No. 3, pp. 571-586, June 1992.&lt;br /&gt;
** K. CULIK II, J. PACHL, S. Yu, On the limit sets ofcellular automata, SIAM J. Comput., 18 (1989), pp.831-842.&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le &amp;lt;b&amp;gt;lundi 27 mai&amp;lt;/b&amp;gt; de 9h à 11h en salle 115 du chablais.&lt;br /&gt;
Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Tristan_Porteries Tristan Porteries (PDF)]: problèmes avec mémoire restreinte, tuteur S. Tavenas&lt;br /&gt;
* R. Wagner: Reconstruction de surfaces à partir de nuages de points, tuteur J.-O. Lachaud&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Nils_Ruet Nils Ruet (PDF)]: LISP, tuteur P. Hyvernat&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Remy_Bouvier Rémy Bouvier (PDF)]: dancing links, tuteur P. Hyvernat&lt;br /&gt;
&lt;br /&gt;
== sujets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les sujets 1-3 sont encadrés par J.-O. Lachaud, les sujets 4-5 par P. Hyvernat, le sujet 6 par S. Tavenas.&lt;br /&gt;
Un encadrant encadre au max 2 étudiants.&lt;br /&gt;
&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;br /&gt;
# Une question naturelle est de savoir quels sont les problèmes qui peuvent être résolus avec un espace mémoire restreint. Plus formellement, on notera L l&#039;ensemble des problèmes que l&#039;on peut résoudre en utilisant seulement un espace mémoire logarithmique. On s&#039;intéresse à cette classe de problèmes, et plus particulièrement aux problèmes de connectivité dans un graphe.&lt;br /&gt;
#* [https://www.irif.fr/~sperifel/complexite.pdf Sylvain Périfel Complexité algorithmique] : Un livre récent qui survole une grosse partie de la complexité algorithmique. Le chapitre 4 concerne la complexité en espace.&lt;br /&gt;
#* [https://omereingold.files.wordpress.com/2014/10/sl.pdf Omer Reingold Undirected Connectivity in Log-Space]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le vendredi 25 mai 2018, à 9h. Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* ray-tracing au path-tracing, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Raphael_Tournafond.pdf Raphael Tournafond (PDF)]&lt;br /&gt;
* &amp;quot;dancing links&amp;quot; et NP complétude, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Ambroise_Decouttere.pdf Ambroise Decouttere (PDF)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
# Du ray-tracing au path-tracing: il s&#039;agit de comprendre l&#039;évolution des algorithmes de rendu (dits &amp;quot;réalistes&amp;quot;) et de mettre en avant les principales évolutions.&lt;br /&gt;
#* An introduction to ray tracing AS Glassner - 1989 - books.google.com&lt;br /&gt;
#* Energy redistribution path tracing, D Cline, J Talbot, P Egbert - ACM Transactions on Graphics (TOG), 2005 - dl.acm.org&lt;br /&gt;
#* et pour une introduction douce au ray-tracing: TP2 de http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO805/Tests/html/index.html&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; et NP complétude : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
#* [https://arxiv.org/pdf/1203.1895.pdf Classic Nintendo Games are (Computationally) Hard] : preuve que Super Mario et d&#039;autres jeux video classiques sont NP-complets &#039;&#039;Theoretical Computer Science, volume 586, 2015, pages 135–160.&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15140</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15140"/>
		<updated>2024-04-02T07:49:32Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : Préparation des wikis projets 2023-2024&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Projets réalisés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
* Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés par Teva PHILIPPE (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Surfaces polygonales et surfaces de subdivision par Vetea STOLL (tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* Calcul des valeurs de Grundy pour des jeux octaux par Mathieu BRUNOT (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; par Gabriel ESAT (tuteur: Pierre HYVERNAT)&lt;br /&gt;
* Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta par Chloé FAUCON (tuteur: Valentin GLEDEL)&lt;br /&gt;
* Modélisation de la ruine du joueur par Albert KULAS (tuteur: Céline LABART)&lt;br /&gt;
* Planarité de graphes&lt;br /&gt;
* Calibration de caméra et reconstruction 3D par Noah CUNEO (tuteur: Stéphane BREUILS)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== Surfaces polygonales et surfaces de subdivision ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== Calcul des valeurs de Grundy pour des jeux octaux ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== Modélisation de la ruine du joueur ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Planarité de graphes ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Calibration de caméra et reconstruction 3D ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15137</id>
		<title>PROJ002 CMI : Projet en traitement et analyse d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15137"/>
		<updated>2024-01-21T16:46:51Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Objectifs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Ce module constitue une initiation au monde de la recherche dans le laboratoire d&#039;adossement du CMI Info. Plusieurs sujets en lien avec le traitement et l&#039;analyse d&#039;image et les thématiques développées dans le laboratoire sont proposés aux étudiants.&lt;br /&gt;
&lt;br /&gt;
Les étudiants CMI travaillent dans le laboratoire d&#039;accueil sur ces sujets, qui comportent tous:&lt;br /&gt;
* découverte du sujet de recherche à partir de références bibliographiques &lt;br /&gt;
* appropriation du sujet précis visé et développement d&#039;algorithmes répondant au problème posé.&lt;br /&gt;
* un point possible de contribution pour l&#039;étudiant, qui constitue un apport nouveau au sujet.&lt;br /&gt;
&lt;br /&gt;
Le projet se déroule en janvier, après le cours de traitement et analyse d&#039;image, avec environ 25h de présentiel dans le laboratoire. A l&#039;issue du projet, l&#039;étudiant ou le groupe d&#039;étudiant  doit remettre un dépôt (github ou autre) présentant l&#039;avancement de son travail, le code développé, un readme expliquant le sujet, décrivant les points saillants du travail réalisé et ainsi que comment se servir du code développé. Des exemples d&#039;utilisation doivent aussi être donnés.&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2023-2024 =&lt;br /&gt;
&lt;br /&gt;
Cette année, pour faire suite au cours avancé de  [https://codimd.math.cnrs.fr/s/U_hz-OPpK Traitement et Analyse d&#039;Image avec apprentissage profond], les sujets proposés sont en lien avec des techniques d&#039;apprentissage. L&#039;objectif est de recréer le réseau d&#039;apprentissage, l&#039;entrainer sur la base de votre choix (ImageNet ou COCO par exemple), et de mesurer l&#039;efficacité de stratégies d&#039;apprentissage.&lt;br /&gt;
&lt;br /&gt;
* Super-résolution temps-réel: Shi, W., Caballero, J., Huszár, F., Totz, J., Aitken, A. P., Bishop, R., ... &amp;amp; Wang, Z. (2016). [https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network]. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 1874-1883).&lt;br /&gt;
** Il pourra être intéressant de tester l&#039;apprentissage suggéré dans le papier, mais aussi un apprentissage type adverseurial (l&#039;objectif s&#039;y prête bien).&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets / de visages: P. Viola, M. Jones. (2001). [https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf Rapid Object Detection using a Boosted Cascade of Simple Features] In Proceedings of the IEEE conference on computer vision and pattern recognition (CVPR2001).&lt;br /&gt;
** https://www.youtube.com/watch?v=uEJ71VlUmMQ&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets (boîtes englobantes): Chen, S., Sun, P., Song, Y., &amp;amp; Luo, P. (2023). [https://openaccess.thecvf.com/content/ICCV2023/papers/Chen_DiffusionDet_Diffusion_Model_for_Object_Detection_ICCV_2023_paper.pdf DiffusionDet: Diffusion Model for Object Detection]  In Proceedings of the IEEE/CVF International Conference on Computer Vision (pp. 19830-19843).&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets (YOLOv3): Redmon, J., Divvala, S., Girshick, R., &amp;amp; Farhadi, A. (2016). [https://arxiv.org/pdf/1506.02640.pdf You only look once: Unified, real-time object detection]. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 779-788).&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2022-2023 =&lt;br /&gt;
&lt;br /&gt;
*  Segmentation d&#039;image hiérarchique par ensembles échelle (C. Carmagnac, L. Chardonnet)&lt;br /&gt;
*  Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; (R. Théodet, Y. Thépaut)&lt;br /&gt;
*  Scan de page par Webcam, redressement et amélioration d&#039;image&lt;br /&gt;
&lt;br /&gt;
== Segmentation d&#039;image hiérarchique par ensembles échelle ==&lt;br /&gt;
&lt;br /&gt;
La segmentation d&#039;image constitue à découper une image en ses régions d&#039;intérêt. Il se pose alors un problème d&#039;échelle à laquelle on veut voir l&#039;image. Doit-on faire attention aux  détails (e.g. visages, couleurs des yeux) ou à des parties plus globales (nombre de personnes dans la photo, etc). L&#039;approche par ensembles-échelle ou scale-sets construit une hiérarchie de partitions en régions d&#039;une image, paramétrée par une échelle lambda. Cette hiérarchie est causale (les hiérarchies plus fines sont incluses dans les hiérarchies plus grossières). En général la partition la plus fine est celle où chaque pixel  est une région pour  lambda=0. Avec  l&#039;augmentation de lambda, on fusionne deux à deux régions jusqu&#039;à arriver à la partition la plus grossière constituée d&#039;une seule région.&lt;br /&gt;
L&#039;intérêt du modèle de Guigues et al. est d&#039;associer une énergie à chaque région, paramétrée par l&#039;échelle lambda, et qui est représentatif de son homogénéité et de sa forme. Entre 2 régions adjacentes  R_i  et R_j, on peut  déterminer l&#039;échelle lambda_ij à partir de laquelle il vaut mieux fusionner les 2 régions pour diminuer l&#039;énergie totale. L&#039;algorithme de calcul de la hiérarchie consiste donc à regarder les paires de régions et à fusionner les régions dans l&#039;ordre croissant des échelles de fusion lambda_ij.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique des ensemble-échelle et l&#039;algorithme (heuristique) de calcul de sa hiérarchie&lt;br /&gt;
#* comprendre les structures de données utiles pour implémenter cet algorithme : graphe d&#039;adjacence de région, calcul du périmètre d&#039;une région, de son énergie&lt;br /&gt;
#* mettre en place un premier algorithme de fusion de régions&lt;br /&gt;
#* calculer pour 2 régions le lambda_ij optimal&lt;br /&gt;
#* afficher une partition à un lambda donné&lt;br /&gt;
# Etape 2 : optimisation&lt;br /&gt;
#* travailler les structures de données pour accélérer ou réutiliser les calculs&lt;br /&gt;
#* partir d&#039;une segmentation fine initiale moins triviale, genre le résultat d&#039;un watershed/ligne de partage des eaux&lt;br /&gt;
#* tester d&#039;autres énergies pour les régions&lt;br /&gt;
#* tester sur des bases d&#039;image&lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://link.springer.com/content/pdf/10.1007/s11263-005-6299-0.pdf Scale-sets image analysis, L Guigues, JP Cocquerez, H Le Men - International Journal of Computer Vision, 2006]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5i8LT2Gnd Cours INFO001 sur les ensembles échelle]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5IeK4xFhb Cours INFO001 sur les structures de données régions/partitions]&lt;br /&gt;
&lt;br /&gt;
== Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Si on réduit une image de manière  non isotrope, par exemple, on veut passer de 1080x600 à 400x400, les éléments importants de l&#039;image vont être déformés. &lt;br /&gt;
L&#039;approche proposée ici est d&#039;éliminer les parties non importantes de l&#039;image. Il se trouve que notre perception attache peu d&#039;importance aux parties homogènes d&#039;une image alors que nous distinguons très bien les parties à forte variation.&lt;br /&gt;
Le principe du seam carving est d&#039;éliminer 1 pixel par ligne (mettons). On pourrait donc essayer d&#039;éliminer la colonne la plus homogène, mais ce n&#039;est un peu trop rigide. On va plutôt tracer une colonne possiblement zigzaguante du haut vers le bas, qui minimise les variations de couleur. Cette &amp;quot;colonne&amp;quot; serait extraite par un algorithme d&#039;optimisation. Une fois qu&#039;on sait enlever une colonne, on peut recommencer le processus pour enlever plus de colonnes.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique du seam carving.&lt;br /&gt;
#* faire les prétraitements nécessaires à son calcul (gradient notammen)&lt;br /&gt;
#* mettre en place un algorithme  de recherche du meilleur chemin&lt;br /&gt;
#* faire alors les fonctions qui enlèvent une colonne et une ligne d&#039;une image&lt;br /&gt;
#* en déduire l&#039;algorithme de réduction de résolution w x h vers w&#039; x h&#039;, qui commence par une interpolation puis par éliminer seulement des lignes ou des colonnes&lt;br /&gt;
# Etape 2 : traitement temps-réel&lt;br /&gt;
#* la méthode est presque parallélisable naturellement, au sens où l&#039;algorithme d&#039;optimisation peut donner plusieurs chemins candidats&lt;br /&gt;
#* mettre en place cette approche avec élimination de plusieurs chemins  simultanées&lt;br /&gt;
#* voir si on peut aboutir à un traitement temps-réel d&#039;un flux vidéo&lt;br /&gt;
# Etape 3 : amélioration possibles&lt;br /&gt;
#* on peut travailler les énergies mises en place, changer l&#039;espace des couleurs, ou mixer plusieurs modèles de réduction de résolution&lt;br /&gt;
#* on pourra s&#039;inspirer aussi d&#039;articles ayant amélioré cette méthode.&lt;br /&gt;
# Quelques liens pour démarrer&lt;br /&gt;
#* [https://en.wikipedia.org/wiki/Seam_carving Seam carving sur wikipedia]&lt;br /&gt;
#* L&#039;article décrivant la méthode: [https://dl.acm.org/doi/10.1145/1275808.1276390 Avidan, Shai; Shamir, Ariel (July 2007). &amp;quot;Seam carving for content-aware image resizing | ACM SIGGRAPH 2007 papers&amp;quot;. Siggraph 2007]&lt;br /&gt;
&lt;br /&gt;
== Scan de page par Webcam, redressement et amélioration d&#039;image ==&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif est de scanner une page avec une simple webcam ou camera. L&#039;application doit permettre de lire un flux video en entrée, repérer les côtes d&#039;une feuille si elle est présente dans une certaine zone, puis ramener cette géométrie déformée à une feuille A4 (mettons). Ensuite des algorithmes d&#039;amélioration d&#039;image peuvent être utilisés : élimination du bruit, binarisation  (e.g. Otsu). Enfin on peut chercher à reconnaître les caractères (Optical Character Recognition). Ce projet poursuit le travail de R. Bouvier de l&#039;an dernier.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* On pourra commencer par reprendre le travail de Rémi Bouvier&lt;br /&gt;
#* Pour détecter les contours de la feuille, 2 techniques ont été implémentées, Canny ou watershed. &lt;br /&gt;
#* Permettre à l&#039;utilisateur de choisir en cours d&#039;utilisation la technique utilisée, de modifier les paramètres, de visualiser en surimpression le résultat&lt;br /&gt;
#* Reprendre ensuite la méthode de détection de lignes (transformée de Hough)&lt;br /&gt;
#** Indiquez clairement où l&#039;utilisateur doit à peu près placer les coins&lt;br /&gt;
#** Sélectionner les droites données par Hough en ne gardant que celles qui passent par ces zones&lt;br /&gt;
#* Si 4 bords de la page sont détectés, capturer l&#039;image et affichez-là&lt;br /&gt;
#* On pourra enfin redresser l&#039;image par une transformation homographique&lt;br /&gt;
# Etape 2 : améliorations&lt;br /&gt;
#* on peut travailler sur le déclenchement automatique de la capture, e.g.,  repérer que l&#039;histogramme dans la partie correspondant à la feuille comporte essentiellement des blancs/gris clairs et des noirs.&lt;br /&gt;
#* on peut renforcer/aider la détection des bords de l&#039;image en  détectant des coins dans les zones spécifiées.&lt;br /&gt;
#* on peut repérer que la feuille n&#039;est pas très droite (genre courbée d&#039;un côté ou de l&#039;autre :  en fait, elle ne peut pas être courbée des 2 côtés en même temps (car sa courbure gaussienne est nulle !).&lt;br /&gt;
#* on peut améliorer l&#039;image capturée en égalisant l&#039;image, ou proposer sa binarisation optimale par la méthode d&#039;Otsu.&lt;br /&gt;
#* on peut grouper les lignes puis tenter d&#039;utiliser la reconnaissance de caractères pour extraire les textes dans l&#039;image.&lt;br /&gt;
#* si le focus de la caméra n&#039;est pas bon, on peut essayer des techniques de déconvolution pour retrouver une image plus nette (c&#039;est un problème d&#039;optimisation), ou on peut essayer de piloter le focus de la caméra (mais pas toutes les caméras/webcam se laissent piloter). &lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://github.com/RemiB99/Proj002-ScanDocumentWebcam projet de Rémi Bouvier]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/NUd-0HnaB Transformée de Hough]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/A_-AUJ1ql Détection de coins/points saillants]&lt;br /&gt;
&lt;br /&gt;
= Archive des projets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
* R. Bouvier: [https://github.com/RemiB99/Proj002-ScanDocumentWebcam Scan de page par WebCam]&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
* R. Tournafond et A. Decouttère: [https://github.com/Gitravail/Proj002-ColorTransfert Transfert de couleurs entre images par transport optimal par coupes]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15136</id>
		<title>PROJ002 CMI : Projet en traitement et analyse d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15136"/>
		<updated>2024-01-21T16:45:58Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Sujets proposés 2023-2024 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Ce module constitue une initiation au monde de la recherche dans le laboratoire d&#039;adossement du CMI Info. Plusieurs sujets en lien avec le traitement et l&#039;analyse d&#039;image et les thématiques développées dans le laboratoire sont proposés aux étudiants, chacun avec un tuteur identifié. Le projet nécessite de &lt;br /&gt;
&lt;br /&gt;
Les étudiants CMI travaillent dans le laboratoire d&#039;accueil sur ces sujets, qui comportent tous:&lt;br /&gt;
* découverte du sujet de recherche à partir de références bibliographiques &lt;br /&gt;
* appropriation du sujet précis visé et développement d&#039;algorithmes répondant au problème posé.&lt;br /&gt;
* un point possible de contribution pour l&#039;étudiant, qui constitue un apport nouveau au sujet.&lt;br /&gt;
&lt;br /&gt;
Le projet se déroule en janvier, après le cours de traitement et analyse d&#039;image, avec environ 25h de présentiel dans le laboratoire. A l&#039;issue du projet, l&#039;étudiant ou le groupe d&#039;étudiant  doit remettre un dépôt (github ou autre) présentant l&#039;avancement de son travail, le code développé, un readme expliquant le sujet, décrivant les points saillants du travail réalisé et ainsi que comment se servir du code développé. Des exemples d&#039;utilisation doivent aussi être donnés.&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2023-2024 =&lt;br /&gt;
&lt;br /&gt;
Cette année, pour faire suite au cours avancé de  [https://codimd.math.cnrs.fr/s/U_hz-OPpK Traitement et Analyse d&#039;Image avec apprentissage profond], les sujets proposés sont en lien avec des techniques d&#039;apprentissage. L&#039;objectif est de recréer le réseau d&#039;apprentissage, l&#039;entrainer sur la base de votre choix (ImageNet ou COCO par exemple), et de mesurer l&#039;efficacité de stratégies d&#039;apprentissage.&lt;br /&gt;
&lt;br /&gt;
* Super-résolution temps-réel: Shi, W., Caballero, J., Huszár, F., Totz, J., Aitken, A. P., Bishop, R., ... &amp;amp; Wang, Z. (2016). [https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network]. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 1874-1883).&lt;br /&gt;
** Il pourra être intéressant de tester l&#039;apprentissage suggéré dans le papier, mais aussi un apprentissage type adverseurial (l&#039;objectif s&#039;y prête bien).&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets / de visages: P. Viola, M. Jones. (2001). [https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf Rapid Object Detection using a Boosted Cascade of Simple Features] In Proceedings of the IEEE conference on computer vision and pattern recognition (CVPR2001).&lt;br /&gt;
** https://www.youtube.com/watch?v=uEJ71VlUmMQ&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets (boîtes englobantes): Chen, S., Sun, P., Song, Y., &amp;amp; Luo, P. (2023). [https://openaccess.thecvf.com/content/ICCV2023/papers/Chen_DiffusionDet_Diffusion_Model_for_Object_Detection_ICCV_2023_paper.pdf DiffusionDet: Diffusion Model for Object Detection]  In Proceedings of the IEEE/CVF International Conference on Computer Vision (pp. 19830-19843).&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets (YOLOv3): Redmon, J., Divvala, S., Girshick, R., &amp;amp; Farhadi, A. (2016). [https://arxiv.org/pdf/1506.02640.pdf You only look once: Unified, real-time object detection]. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 779-788).&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2022-2023 =&lt;br /&gt;
&lt;br /&gt;
*  Segmentation d&#039;image hiérarchique par ensembles échelle (C. Carmagnac, L. Chardonnet)&lt;br /&gt;
*  Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; (R. Théodet, Y. Thépaut)&lt;br /&gt;
*  Scan de page par Webcam, redressement et amélioration d&#039;image&lt;br /&gt;
&lt;br /&gt;
== Segmentation d&#039;image hiérarchique par ensembles échelle ==&lt;br /&gt;
&lt;br /&gt;
La segmentation d&#039;image constitue à découper une image en ses régions d&#039;intérêt. Il se pose alors un problème d&#039;échelle à laquelle on veut voir l&#039;image. Doit-on faire attention aux  détails (e.g. visages, couleurs des yeux) ou à des parties plus globales (nombre de personnes dans la photo, etc). L&#039;approche par ensembles-échelle ou scale-sets construit une hiérarchie de partitions en régions d&#039;une image, paramétrée par une échelle lambda. Cette hiérarchie est causale (les hiérarchies plus fines sont incluses dans les hiérarchies plus grossières). En général la partition la plus fine est celle où chaque pixel  est une région pour  lambda=0. Avec  l&#039;augmentation de lambda, on fusionne deux à deux régions jusqu&#039;à arriver à la partition la plus grossière constituée d&#039;une seule région.&lt;br /&gt;
L&#039;intérêt du modèle de Guigues et al. est d&#039;associer une énergie à chaque région, paramétrée par l&#039;échelle lambda, et qui est représentatif de son homogénéité et de sa forme. Entre 2 régions adjacentes  R_i  et R_j, on peut  déterminer l&#039;échelle lambda_ij à partir de laquelle il vaut mieux fusionner les 2 régions pour diminuer l&#039;énergie totale. L&#039;algorithme de calcul de la hiérarchie consiste donc à regarder les paires de régions et à fusionner les régions dans l&#039;ordre croissant des échelles de fusion lambda_ij.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique des ensemble-échelle et l&#039;algorithme (heuristique) de calcul de sa hiérarchie&lt;br /&gt;
#* comprendre les structures de données utiles pour implémenter cet algorithme : graphe d&#039;adjacence de région, calcul du périmètre d&#039;une région, de son énergie&lt;br /&gt;
#* mettre en place un premier algorithme de fusion de régions&lt;br /&gt;
#* calculer pour 2 régions le lambda_ij optimal&lt;br /&gt;
#* afficher une partition à un lambda donné&lt;br /&gt;
# Etape 2 : optimisation&lt;br /&gt;
#* travailler les structures de données pour accélérer ou réutiliser les calculs&lt;br /&gt;
#* partir d&#039;une segmentation fine initiale moins triviale, genre le résultat d&#039;un watershed/ligne de partage des eaux&lt;br /&gt;
#* tester d&#039;autres énergies pour les régions&lt;br /&gt;
#* tester sur des bases d&#039;image&lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://link.springer.com/content/pdf/10.1007/s11263-005-6299-0.pdf Scale-sets image analysis, L Guigues, JP Cocquerez, H Le Men - International Journal of Computer Vision, 2006]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5i8LT2Gnd Cours INFO001 sur les ensembles échelle]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5IeK4xFhb Cours INFO001 sur les structures de données régions/partitions]&lt;br /&gt;
&lt;br /&gt;
== Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Si on réduit une image de manière  non isotrope, par exemple, on veut passer de 1080x600 à 400x400, les éléments importants de l&#039;image vont être déformés. &lt;br /&gt;
L&#039;approche proposée ici est d&#039;éliminer les parties non importantes de l&#039;image. Il se trouve que notre perception attache peu d&#039;importance aux parties homogènes d&#039;une image alors que nous distinguons très bien les parties à forte variation.&lt;br /&gt;
Le principe du seam carving est d&#039;éliminer 1 pixel par ligne (mettons). On pourrait donc essayer d&#039;éliminer la colonne la plus homogène, mais ce n&#039;est un peu trop rigide. On va plutôt tracer une colonne possiblement zigzaguante du haut vers le bas, qui minimise les variations de couleur. Cette &amp;quot;colonne&amp;quot; serait extraite par un algorithme d&#039;optimisation. Une fois qu&#039;on sait enlever une colonne, on peut recommencer le processus pour enlever plus de colonnes.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique du seam carving.&lt;br /&gt;
#* faire les prétraitements nécessaires à son calcul (gradient notammen)&lt;br /&gt;
#* mettre en place un algorithme  de recherche du meilleur chemin&lt;br /&gt;
#* faire alors les fonctions qui enlèvent une colonne et une ligne d&#039;une image&lt;br /&gt;
#* en déduire l&#039;algorithme de réduction de résolution w x h vers w&#039; x h&#039;, qui commence par une interpolation puis par éliminer seulement des lignes ou des colonnes&lt;br /&gt;
# Etape 2 : traitement temps-réel&lt;br /&gt;
#* la méthode est presque parallélisable naturellement, au sens où l&#039;algorithme d&#039;optimisation peut donner plusieurs chemins candidats&lt;br /&gt;
#* mettre en place cette approche avec élimination de plusieurs chemins  simultanées&lt;br /&gt;
#* voir si on peut aboutir à un traitement temps-réel d&#039;un flux vidéo&lt;br /&gt;
# Etape 3 : amélioration possibles&lt;br /&gt;
#* on peut travailler les énergies mises en place, changer l&#039;espace des couleurs, ou mixer plusieurs modèles de réduction de résolution&lt;br /&gt;
#* on pourra s&#039;inspirer aussi d&#039;articles ayant amélioré cette méthode.&lt;br /&gt;
# Quelques liens pour démarrer&lt;br /&gt;
#* [https://en.wikipedia.org/wiki/Seam_carving Seam carving sur wikipedia]&lt;br /&gt;
#* L&#039;article décrivant la méthode: [https://dl.acm.org/doi/10.1145/1275808.1276390 Avidan, Shai; Shamir, Ariel (July 2007). &amp;quot;Seam carving for content-aware image resizing | ACM SIGGRAPH 2007 papers&amp;quot;. Siggraph 2007]&lt;br /&gt;
&lt;br /&gt;
== Scan de page par Webcam, redressement et amélioration d&#039;image ==&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif est de scanner une page avec une simple webcam ou camera. L&#039;application doit permettre de lire un flux video en entrée, repérer les côtes d&#039;une feuille si elle est présente dans une certaine zone, puis ramener cette géométrie déformée à une feuille A4 (mettons). Ensuite des algorithmes d&#039;amélioration d&#039;image peuvent être utilisés : élimination du bruit, binarisation  (e.g. Otsu). Enfin on peut chercher à reconnaître les caractères (Optical Character Recognition). Ce projet poursuit le travail de R. Bouvier de l&#039;an dernier.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* On pourra commencer par reprendre le travail de Rémi Bouvier&lt;br /&gt;
#* Pour détecter les contours de la feuille, 2 techniques ont été implémentées, Canny ou watershed. &lt;br /&gt;
#* Permettre à l&#039;utilisateur de choisir en cours d&#039;utilisation la technique utilisée, de modifier les paramètres, de visualiser en surimpression le résultat&lt;br /&gt;
#* Reprendre ensuite la méthode de détection de lignes (transformée de Hough)&lt;br /&gt;
#** Indiquez clairement où l&#039;utilisateur doit à peu près placer les coins&lt;br /&gt;
#** Sélectionner les droites données par Hough en ne gardant que celles qui passent par ces zones&lt;br /&gt;
#* Si 4 bords de la page sont détectés, capturer l&#039;image et affichez-là&lt;br /&gt;
#* On pourra enfin redresser l&#039;image par une transformation homographique&lt;br /&gt;
# Etape 2 : améliorations&lt;br /&gt;
#* on peut travailler sur le déclenchement automatique de la capture, e.g.,  repérer que l&#039;histogramme dans la partie correspondant à la feuille comporte essentiellement des blancs/gris clairs et des noirs.&lt;br /&gt;
#* on peut renforcer/aider la détection des bords de l&#039;image en  détectant des coins dans les zones spécifiées.&lt;br /&gt;
#* on peut repérer que la feuille n&#039;est pas très droite (genre courbée d&#039;un côté ou de l&#039;autre :  en fait, elle ne peut pas être courbée des 2 côtés en même temps (car sa courbure gaussienne est nulle !).&lt;br /&gt;
#* on peut améliorer l&#039;image capturée en égalisant l&#039;image, ou proposer sa binarisation optimale par la méthode d&#039;Otsu.&lt;br /&gt;
#* on peut grouper les lignes puis tenter d&#039;utiliser la reconnaissance de caractères pour extraire les textes dans l&#039;image.&lt;br /&gt;
#* si le focus de la caméra n&#039;est pas bon, on peut essayer des techniques de déconvolution pour retrouver une image plus nette (c&#039;est un problème d&#039;optimisation), ou on peut essayer de piloter le focus de la caméra (mais pas toutes les caméras/webcam se laissent piloter). &lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://github.com/RemiB99/Proj002-ScanDocumentWebcam projet de Rémi Bouvier]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/NUd-0HnaB Transformée de Hough]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/A_-AUJ1ql Détection de coins/points saillants]&lt;br /&gt;
&lt;br /&gt;
= Archive des projets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
* R. Bouvier: [https://github.com/RemiB99/Proj002-ScanDocumentWebcam Scan de page par WebCam]&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
* R. Tournafond et A. Decouttère: [https://github.com/Gitravail/Proj002-ColorTransfert Transfert de couleurs entre images par transport optimal par coupes]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15131</id>
		<title>PROJ002 CMI : Projet en traitement et analyse d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15131"/>
		<updated>2024-01-17T15:52:53Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Sujets proposés 2023-2024 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Ce module constitue une initiation au monde de la recherche dans le laboratoire d&#039;adossement du CMI Info. Plusieurs sujets en lien avec le traitement et l&#039;analyse d&#039;image et les thématiques développées dans le laboratoire sont proposés aux étudiants, chacun avec un tuteur identifié. Le projet nécessite de &lt;br /&gt;
&lt;br /&gt;
Les étudiants CMI travaillent dans le laboratoire d&#039;accueil sur ces sujets, qui comportent tous:&lt;br /&gt;
* découverte du sujet de recherche à partir de références bibliographiques &lt;br /&gt;
* appropriation du sujet précis visé et développement d&#039;algorithmes répondant au problème posé.&lt;br /&gt;
* un point possible de contribution pour l&#039;étudiant, qui constitue un apport nouveau au sujet.&lt;br /&gt;
&lt;br /&gt;
Le projet se déroule en janvier, après le cours de traitement et analyse d&#039;image, avec environ 25h de présentiel dans le laboratoire. A l&#039;issue du projet, l&#039;étudiant ou le groupe d&#039;étudiant  doit remettre un dépôt (github ou autre) présentant l&#039;avancement de son travail, le code développé, un readme expliquant le sujet, décrivant les points saillants du travail réalisé et ainsi que comment se servir du code développé. Des exemples d&#039;utilisation doivent aussi être donnés.&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2023-2024 =&lt;br /&gt;
&lt;br /&gt;
Cette année, pour faire suite au cours avancé de  [https://codimd.math.cnrs.fr/s/U_hz-OPpK Traitement et Analyse d&#039;Image avec apprentissage profond], les sujets proposés sont en lien avec des techniques d&#039;apprentissage. L&#039;objectif est de recréer le réseau d&#039;apprentissage, l&#039;entrainer sur la base de votre choix (ImageNet ou COCO par exemple), et de mesurer l&#039;efficacité de stratégies d&#039;apprentissage.&lt;br /&gt;
&lt;br /&gt;
* Super-résolution temps-réel: Shi, W., Caballero, J., Huszár, F., Totz, J., Aitken, A. P., Bishop, R., ... &amp;amp; Wang, Z. (2016). [https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network]. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 1874-1883).&lt;br /&gt;
** Il pourra être intéressant de tester l&#039;apprentissage suggéré dans le papier, mais aussi un apprentissage type adverseurial (l&#039;objectif s&#039;y prête bien).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets / de visages: P. Viola, M. Jones. (2001). [https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf Rapid Object Detection using a Boosted Cascade of Simple Features] In Proceedings of the IEEE conference on computer vision and pattern recognition (CVPR2001).&lt;br /&gt;
** https://www.youtube.com/watch?v=uEJ71VlUmMQ&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets (boîtes englobantes): Chen, S., Sun, P., Song, Y., &amp;amp; Luo, P. (2023). [https://openaccess.thecvf.com/content/ICCV2023/papers/Chen_DiffusionDet_Diffusion_Model_for_Object_Detection_ICCV_2023_paper.pdf DiffusionDet: Diffusion Model for Object Detection]  In Proceedings of the IEEE/CVF International Conference on Computer Vision (pp. 19830-19843).&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2022-2023 =&lt;br /&gt;
&lt;br /&gt;
*  Segmentation d&#039;image hiérarchique par ensembles échelle (C. Carmagnac, L. Chardonnet)&lt;br /&gt;
*  Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; (R. Théodet, Y. Thépaut)&lt;br /&gt;
*  Scan de page par Webcam, redressement et amélioration d&#039;image&lt;br /&gt;
&lt;br /&gt;
== Segmentation d&#039;image hiérarchique par ensembles échelle ==&lt;br /&gt;
&lt;br /&gt;
La segmentation d&#039;image constitue à découper une image en ses régions d&#039;intérêt. Il se pose alors un problème d&#039;échelle à laquelle on veut voir l&#039;image. Doit-on faire attention aux  détails (e.g. visages, couleurs des yeux) ou à des parties plus globales (nombre de personnes dans la photo, etc). L&#039;approche par ensembles-échelle ou scale-sets construit une hiérarchie de partitions en régions d&#039;une image, paramétrée par une échelle lambda. Cette hiérarchie est causale (les hiérarchies plus fines sont incluses dans les hiérarchies plus grossières). En général la partition la plus fine est celle où chaque pixel  est une région pour  lambda=0. Avec  l&#039;augmentation de lambda, on fusionne deux à deux régions jusqu&#039;à arriver à la partition la plus grossière constituée d&#039;une seule région.&lt;br /&gt;
L&#039;intérêt du modèle de Guigues et al. est d&#039;associer une énergie à chaque région, paramétrée par l&#039;échelle lambda, et qui est représentatif de son homogénéité et de sa forme. Entre 2 régions adjacentes  R_i  et R_j, on peut  déterminer l&#039;échelle lambda_ij à partir de laquelle il vaut mieux fusionner les 2 régions pour diminuer l&#039;énergie totale. L&#039;algorithme de calcul de la hiérarchie consiste donc à regarder les paires de régions et à fusionner les régions dans l&#039;ordre croissant des échelles de fusion lambda_ij.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique des ensemble-échelle et l&#039;algorithme (heuristique) de calcul de sa hiérarchie&lt;br /&gt;
#* comprendre les structures de données utiles pour implémenter cet algorithme : graphe d&#039;adjacence de région, calcul du périmètre d&#039;une région, de son énergie&lt;br /&gt;
#* mettre en place un premier algorithme de fusion de régions&lt;br /&gt;
#* calculer pour 2 régions le lambda_ij optimal&lt;br /&gt;
#* afficher une partition à un lambda donné&lt;br /&gt;
# Etape 2 : optimisation&lt;br /&gt;
#* travailler les structures de données pour accélérer ou réutiliser les calculs&lt;br /&gt;
#* partir d&#039;une segmentation fine initiale moins triviale, genre le résultat d&#039;un watershed/ligne de partage des eaux&lt;br /&gt;
#* tester d&#039;autres énergies pour les régions&lt;br /&gt;
#* tester sur des bases d&#039;image&lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://link.springer.com/content/pdf/10.1007/s11263-005-6299-0.pdf Scale-sets image analysis, L Guigues, JP Cocquerez, H Le Men - International Journal of Computer Vision, 2006]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5i8LT2Gnd Cours INFO001 sur les ensembles échelle]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5IeK4xFhb Cours INFO001 sur les structures de données régions/partitions]&lt;br /&gt;
&lt;br /&gt;
== Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Si on réduit une image de manière  non isotrope, par exemple, on veut passer de 1080x600 à 400x400, les éléments importants de l&#039;image vont être déformés. &lt;br /&gt;
L&#039;approche proposée ici est d&#039;éliminer les parties non importantes de l&#039;image. Il se trouve que notre perception attache peu d&#039;importance aux parties homogènes d&#039;une image alors que nous distinguons très bien les parties à forte variation.&lt;br /&gt;
Le principe du seam carving est d&#039;éliminer 1 pixel par ligne (mettons). On pourrait donc essayer d&#039;éliminer la colonne la plus homogène, mais ce n&#039;est un peu trop rigide. On va plutôt tracer une colonne possiblement zigzaguante du haut vers le bas, qui minimise les variations de couleur. Cette &amp;quot;colonne&amp;quot; serait extraite par un algorithme d&#039;optimisation. Une fois qu&#039;on sait enlever une colonne, on peut recommencer le processus pour enlever plus de colonnes.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique du seam carving.&lt;br /&gt;
#* faire les prétraitements nécessaires à son calcul (gradient notammen)&lt;br /&gt;
#* mettre en place un algorithme  de recherche du meilleur chemin&lt;br /&gt;
#* faire alors les fonctions qui enlèvent une colonne et une ligne d&#039;une image&lt;br /&gt;
#* en déduire l&#039;algorithme de réduction de résolution w x h vers w&#039; x h&#039;, qui commence par une interpolation puis par éliminer seulement des lignes ou des colonnes&lt;br /&gt;
# Etape 2 : traitement temps-réel&lt;br /&gt;
#* la méthode est presque parallélisable naturellement, au sens où l&#039;algorithme d&#039;optimisation peut donner plusieurs chemins candidats&lt;br /&gt;
#* mettre en place cette approche avec élimination de plusieurs chemins  simultanées&lt;br /&gt;
#* voir si on peut aboutir à un traitement temps-réel d&#039;un flux vidéo&lt;br /&gt;
# Etape 3 : amélioration possibles&lt;br /&gt;
#* on peut travailler les énergies mises en place, changer l&#039;espace des couleurs, ou mixer plusieurs modèles de réduction de résolution&lt;br /&gt;
#* on pourra s&#039;inspirer aussi d&#039;articles ayant amélioré cette méthode.&lt;br /&gt;
# Quelques liens pour démarrer&lt;br /&gt;
#* [https://en.wikipedia.org/wiki/Seam_carving Seam carving sur wikipedia]&lt;br /&gt;
#* L&#039;article décrivant la méthode: [https://dl.acm.org/doi/10.1145/1275808.1276390 Avidan, Shai; Shamir, Ariel (July 2007). &amp;quot;Seam carving for content-aware image resizing | ACM SIGGRAPH 2007 papers&amp;quot;. Siggraph 2007]&lt;br /&gt;
&lt;br /&gt;
== Scan de page par Webcam, redressement et amélioration d&#039;image ==&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif est de scanner une page avec une simple webcam ou camera. L&#039;application doit permettre de lire un flux video en entrée, repérer les côtes d&#039;une feuille si elle est présente dans une certaine zone, puis ramener cette géométrie déformée à une feuille A4 (mettons). Ensuite des algorithmes d&#039;amélioration d&#039;image peuvent être utilisés : élimination du bruit, binarisation  (e.g. Otsu). Enfin on peut chercher à reconnaître les caractères (Optical Character Recognition). Ce projet poursuit le travail de R. Bouvier de l&#039;an dernier.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* On pourra commencer par reprendre le travail de Rémi Bouvier&lt;br /&gt;
#* Pour détecter les contours de la feuille, 2 techniques ont été implémentées, Canny ou watershed. &lt;br /&gt;
#* Permettre à l&#039;utilisateur de choisir en cours d&#039;utilisation la technique utilisée, de modifier les paramètres, de visualiser en surimpression le résultat&lt;br /&gt;
#* Reprendre ensuite la méthode de détection de lignes (transformée de Hough)&lt;br /&gt;
#** Indiquez clairement où l&#039;utilisateur doit à peu près placer les coins&lt;br /&gt;
#** Sélectionner les droites données par Hough en ne gardant que celles qui passent par ces zones&lt;br /&gt;
#* Si 4 bords de la page sont détectés, capturer l&#039;image et affichez-là&lt;br /&gt;
#* On pourra enfin redresser l&#039;image par une transformation homographique&lt;br /&gt;
# Etape 2 : améliorations&lt;br /&gt;
#* on peut travailler sur le déclenchement automatique de la capture, e.g.,  repérer que l&#039;histogramme dans la partie correspondant à la feuille comporte essentiellement des blancs/gris clairs et des noirs.&lt;br /&gt;
#* on peut renforcer/aider la détection des bords de l&#039;image en  détectant des coins dans les zones spécifiées.&lt;br /&gt;
#* on peut repérer que la feuille n&#039;est pas très droite (genre courbée d&#039;un côté ou de l&#039;autre :  en fait, elle ne peut pas être courbée des 2 côtés en même temps (car sa courbure gaussienne est nulle !).&lt;br /&gt;
#* on peut améliorer l&#039;image capturée en égalisant l&#039;image, ou proposer sa binarisation optimale par la méthode d&#039;Otsu.&lt;br /&gt;
#* on peut grouper les lignes puis tenter d&#039;utiliser la reconnaissance de caractères pour extraire les textes dans l&#039;image.&lt;br /&gt;
#* si le focus de la caméra n&#039;est pas bon, on peut essayer des techniques de déconvolution pour retrouver une image plus nette (c&#039;est un problème d&#039;optimisation), ou on peut essayer de piloter le focus de la caméra (mais pas toutes les caméras/webcam se laissent piloter). &lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://github.com/RemiB99/Proj002-ScanDocumentWebcam projet de Rémi Bouvier]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/NUd-0HnaB Transformée de Hough]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/A_-AUJ1ql Détection de coins/points saillants]&lt;br /&gt;
&lt;br /&gt;
= Archive des projets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
* R. Bouvier: [https://github.com/RemiB99/Proj002-ScanDocumentWebcam Scan de page par WebCam]&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
* R. Tournafond et A. Decouttère: [https://github.com/Gitravail/Proj002-ColorTransfert Transfert de couleurs entre images par transport optimal par coupes]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15130</id>
		<title>PROJ002 CMI : Projet en traitement et analyse d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15130"/>
		<updated>2024-01-17T15:02:02Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Sujets proposés 2023-2024 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Ce module constitue une initiation au monde de la recherche dans le laboratoire d&#039;adossement du CMI Info. Plusieurs sujets en lien avec le traitement et l&#039;analyse d&#039;image et les thématiques développées dans le laboratoire sont proposés aux étudiants, chacun avec un tuteur identifié. Le projet nécessite de &lt;br /&gt;
&lt;br /&gt;
Les étudiants CMI travaillent dans le laboratoire d&#039;accueil sur ces sujets, qui comportent tous:&lt;br /&gt;
* découverte du sujet de recherche à partir de références bibliographiques &lt;br /&gt;
* appropriation du sujet précis visé et développement d&#039;algorithmes répondant au problème posé.&lt;br /&gt;
* un point possible de contribution pour l&#039;étudiant, qui constitue un apport nouveau au sujet.&lt;br /&gt;
&lt;br /&gt;
Le projet se déroule en janvier, après le cours de traitement et analyse d&#039;image, avec environ 25h de présentiel dans le laboratoire. A l&#039;issue du projet, l&#039;étudiant ou le groupe d&#039;étudiant  doit remettre un dépôt (github ou autre) présentant l&#039;avancement de son travail, le code développé, un readme expliquant le sujet, décrivant les points saillants du travail réalisé et ainsi que comment se servir du code développé. Des exemples d&#039;utilisation doivent aussi être donnés.&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2023-2024 =&lt;br /&gt;
&lt;br /&gt;
Cette année, pour faire suite au cours avancé de  [https://codimd.math.cnrs.fr/s/U_hz-OPpK Traitement et Analyse d&#039;Image avec apprentissage profond], les sujets proposés sont en lien avec des techniques d&#039;apprentissage. L&#039;objectif est de recréer le réseau d&#039;apprentissage, l&#039;entrainer sur la base de votre choix (ImageNet ou COCO par exemple), et de mesurer l&#039;efficacité de stratégies d&#039;apprentissage.&lt;br /&gt;
&lt;br /&gt;
* Super-résolution temps-réel: Shi, W., Caballero, J., Huszár, F., Totz, J., Aitken, A. P., Bishop, R., ... &amp;amp; Wang, Z. (2016). [https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network]. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 1874-1883).&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets / de visages P. Viola, M. Jones. (2001). [https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf Rapid Object Detection using a Boosted Cascade of Simple Features] In Proceedings of the IEEE conference on computer vision and pattern recognition (CVPR2001).&lt;br /&gt;
** https://www.youtube.com/watch?v=uEJ71VlUmMQ&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2022-2023 =&lt;br /&gt;
&lt;br /&gt;
*  Segmentation d&#039;image hiérarchique par ensembles échelle (C. Carmagnac, L. Chardonnet)&lt;br /&gt;
*  Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; (R. Théodet, Y. Thépaut)&lt;br /&gt;
*  Scan de page par Webcam, redressement et amélioration d&#039;image&lt;br /&gt;
&lt;br /&gt;
== Segmentation d&#039;image hiérarchique par ensembles échelle ==&lt;br /&gt;
&lt;br /&gt;
La segmentation d&#039;image constitue à découper une image en ses régions d&#039;intérêt. Il se pose alors un problème d&#039;échelle à laquelle on veut voir l&#039;image. Doit-on faire attention aux  détails (e.g. visages, couleurs des yeux) ou à des parties plus globales (nombre de personnes dans la photo, etc). L&#039;approche par ensembles-échelle ou scale-sets construit une hiérarchie de partitions en régions d&#039;une image, paramétrée par une échelle lambda. Cette hiérarchie est causale (les hiérarchies plus fines sont incluses dans les hiérarchies plus grossières). En général la partition la plus fine est celle où chaque pixel  est une région pour  lambda=0. Avec  l&#039;augmentation de lambda, on fusionne deux à deux régions jusqu&#039;à arriver à la partition la plus grossière constituée d&#039;une seule région.&lt;br /&gt;
L&#039;intérêt du modèle de Guigues et al. est d&#039;associer une énergie à chaque région, paramétrée par l&#039;échelle lambda, et qui est représentatif de son homogénéité et de sa forme. Entre 2 régions adjacentes  R_i  et R_j, on peut  déterminer l&#039;échelle lambda_ij à partir de laquelle il vaut mieux fusionner les 2 régions pour diminuer l&#039;énergie totale. L&#039;algorithme de calcul de la hiérarchie consiste donc à regarder les paires de régions et à fusionner les régions dans l&#039;ordre croissant des échelles de fusion lambda_ij.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique des ensemble-échelle et l&#039;algorithme (heuristique) de calcul de sa hiérarchie&lt;br /&gt;
#* comprendre les structures de données utiles pour implémenter cet algorithme : graphe d&#039;adjacence de région, calcul du périmètre d&#039;une région, de son énergie&lt;br /&gt;
#* mettre en place un premier algorithme de fusion de régions&lt;br /&gt;
#* calculer pour 2 régions le lambda_ij optimal&lt;br /&gt;
#* afficher une partition à un lambda donné&lt;br /&gt;
# Etape 2 : optimisation&lt;br /&gt;
#* travailler les structures de données pour accélérer ou réutiliser les calculs&lt;br /&gt;
#* partir d&#039;une segmentation fine initiale moins triviale, genre le résultat d&#039;un watershed/ligne de partage des eaux&lt;br /&gt;
#* tester d&#039;autres énergies pour les régions&lt;br /&gt;
#* tester sur des bases d&#039;image&lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://link.springer.com/content/pdf/10.1007/s11263-005-6299-0.pdf Scale-sets image analysis, L Guigues, JP Cocquerez, H Le Men - International Journal of Computer Vision, 2006]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5i8LT2Gnd Cours INFO001 sur les ensembles échelle]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5IeK4xFhb Cours INFO001 sur les structures de données régions/partitions]&lt;br /&gt;
&lt;br /&gt;
== Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Si on réduit une image de manière  non isotrope, par exemple, on veut passer de 1080x600 à 400x400, les éléments importants de l&#039;image vont être déformés. &lt;br /&gt;
L&#039;approche proposée ici est d&#039;éliminer les parties non importantes de l&#039;image. Il se trouve que notre perception attache peu d&#039;importance aux parties homogènes d&#039;une image alors que nous distinguons très bien les parties à forte variation.&lt;br /&gt;
Le principe du seam carving est d&#039;éliminer 1 pixel par ligne (mettons). On pourrait donc essayer d&#039;éliminer la colonne la plus homogène, mais ce n&#039;est un peu trop rigide. On va plutôt tracer une colonne possiblement zigzaguante du haut vers le bas, qui minimise les variations de couleur. Cette &amp;quot;colonne&amp;quot; serait extraite par un algorithme d&#039;optimisation. Une fois qu&#039;on sait enlever une colonne, on peut recommencer le processus pour enlever plus de colonnes.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique du seam carving.&lt;br /&gt;
#* faire les prétraitements nécessaires à son calcul (gradient notammen)&lt;br /&gt;
#* mettre en place un algorithme  de recherche du meilleur chemin&lt;br /&gt;
#* faire alors les fonctions qui enlèvent une colonne et une ligne d&#039;une image&lt;br /&gt;
#* en déduire l&#039;algorithme de réduction de résolution w x h vers w&#039; x h&#039;, qui commence par une interpolation puis par éliminer seulement des lignes ou des colonnes&lt;br /&gt;
# Etape 2 : traitement temps-réel&lt;br /&gt;
#* la méthode est presque parallélisable naturellement, au sens où l&#039;algorithme d&#039;optimisation peut donner plusieurs chemins candidats&lt;br /&gt;
#* mettre en place cette approche avec élimination de plusieurs chemins  simultanées&lt;br /&gt;
#* voir si on peut aboutir à un traitement temps-réel d&#039;un flux vidéo&lt;br /&gt;
# Etape 3 : amélioration possibles&lt;br /&gt;
#* on peut travailler les énergies mises en place, changer l&#039;espace des couleurs, ou mixer plusieurs modèles de réduction de résolution&lt;br /&gt;
#* on pourra s&#039;inspirer aussi d&#039;articles ayant amélioré cette méthode.&lt;br /&gt;
# Quelques liens pour démarrer&lt;br /&gt;
#* [https://en.wikipedia.org/wiki/Seam_carving Seam carving sur wikipedia]&lt;br /&gt;
#* L&#039;article décrivant la méthode: [https://dl.acm.org/doi/10.1145/1275808.1276390 Avidan, Shai; Shamir, Ariel (July 2007). &amp;quot;Seam carving for content-aware image resizing | ACM SIGGRAPH 2007 papers&amp;quot;. Siggraph 2007]&lt;br /&gt;
&lt;br /&gt;
== Scan de page par Webcam, redressement et amélioration d&#039;image ==&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif est de scanner une page avec une simple webcam ou camera. L&#039;application doit permettre de lire un flux video en entrée, repérer les côtes d&#039;une feuille si elle est présente dans une certaine zone, puis ramener cette géométrie déformée à une feuille A4 (mettons). Ensuite des algorithmes d&#039;amélioration d&#039;image peuvent être utilisés : élimination du bruit, binarisation  (e.g. Otsu). Enfin on peut chercher à reconnaître les caractères (Optical Character Recognition). Ce projet poursuit le travail de R. Bouvier de l&#039;an dernier.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* On pourra commencer par reprendre le travail de Rémi Bouvier&lt;br /&gt;
#* Pour détecter les contours de la feuille, 2 techniques ont été implémentées, Canny ou watershed. &lt;br /&gt;
#* Permettre à l&#039;utilisateur de choisir en cours d&#039;utilisation la technique utilisée, de modifier les paramètres, de visualiser en surimpression le résultat&lt;br /&gt;
#* Reprendre ensuite la méthode de détection de lignes (transformée de Hough)&lt;br /&gt;
#** Indiquez clairement où l&#039;utilisateur doit à peu près placer les coins&lt;br /&gt;
#** Sélectionner les droites données par Hough en ne gardant que celles qui passent par ces zones&lt;br /&gt;
#* Si 4 bords de la page sont détectés, capturer l&#039;image et affichez-là&lt;br /&gt;
#* On pourra enfin redresser l&#039;image par une transformation homographique&lt;br /&gt;
# Etape 2 : améliorations&lt;br /&gt;
#* on peut travailler sur le déclenchement automatique de la capture, e.g.,  repérer que l&#039;histogramme dans la partie correspondant à la feuille comporte essentiellement des blancs/gris clairs et des noirs.&lt;br /&gt;
#* on peut renforcer/aider la détection des bords de l&#039;image en  détectant des coins dans les zones spécifiées.&lt;br /&gt;
#* on peut repérer que la feuille n&#039;est pas très droite (genre courbée d&#039;un côté ou de l&#039;autre :  en fait, elle ne peut pas être courbée des 2 côtés en même temps (car sa courbure gaussienne est nulle !).&lt;br /&gt;
#* on peut améliorer l&#039;image capturée en égalisant l&#039;image, ou proposer sa binarisation optimale par la méthode d&#039;Otsu.&lt;br /&gt;
#* on peut grouper les lignes puis tenter d&#039;utiliser la reconnaissance de caractères pour extraire les textes dans l&#039;image.&lt;br /&gt;
#* si le focus de la caméra n&#039;est pas bon, on peut essayer des techniques de déconvolution pour retrouver une image plus nette (c&#039;est un problème d&#039;optimisation), ou on peut essayer de piloter le focus de la caméra (mais pas toutes les caméras/webcam se laissent piloter). &lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://github.com/RemiB99/Proj002-ScanDocumentWebcam projet de Rémi Bouvier]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/NUd-0HnaB Transformée de Hough]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/A_-AUJ1ql Détection de coins/points saillants]&lt;br /&gt;
&lt;br /&gt;
= Archive des projets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
* R. Bouvier: [https://github.com/RemiB99/Proj002-ScanDocumentWebcam Scan de page par WebCam]&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
* R. Tournafond et A. Decouttère: [https://github.com/Gitravail/Proj002-ColorTransfert Transfert de couleurs entre images par transport optimal par coupes]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15129</id>
		<title>PROJ002 CMI : Projet en traitement et analyse d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15129"/>
		<updated>2024-01-17T15:01:40Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Sujets proposés 2023-2024 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Ce module constitue une initiation au monde de la recherche dans le laboratoire d&#039;adossement du CMI Info. Plusieurs sujets en lien avec le traitement et l&#039;analyse d&#039;image et les thématiques développées dans le laboratoire sont proposés aux étudiants, chacun avec un tuteur identifié. Le projet nécessite de &lt;br /&gt;
&lt;br /&gt;
Les étudiants CMI travaillent dans le laboratoire d&#039;accueil sur ces sujets, qui comportent tous:&lt;br /&gt;
* découverte du sujet de recherche à partir de références bibliographiques &lt;br /&gt;
* appropriation du sujet précis visé et développement d&#039;algorithmes répondant au problème posé.&lt;br /&gt;
* un point possible de contribution pour l&#039;étudiant, qui constitue un apport nouveau au sujet.&lt;br /&gt;
&lt;br /&gt;
Le projet se déroule en janvier, après le cours de traitement et analyse d&#039;image, avec environ 25h de présentiel dans le laboratoire. A l&#039;issue du projet, l&#039;étudiant ou le groupe d&#039;étudiant  doit remettre un dépôt (github ou autre) présentant l&#039;avancement de son travail, le code développé, un readme expliquant le sujet, décrivant les points saillants du travail réalisé et ainsi que comment se servir du code développé. Des exemples d&#039;utilisation doivent aussi être donnés.&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2023-2024 =&lt;br /&gt;
&lt;br /&gt;
Cette année, pour faire suite au cours avancé de  [https://codimd.math.cnrs.fr/s/U_hz-OPpK Traitement et Analyse d&#039;Image avec apprentissage profond], les sujets proposés sont en lien avec des techniques d&#039;apprentissage. L&#039;objectif est de recréer le réseau d&#039;apprentissage, l&#039;entrainer sur la base de votre choix (ImageNet ou COCO par exemple), et de mesurer l&#039;efficacité de stratégies d&#039;apprentissage.&lt;br /&gt;
&lt;br /&gt;
* Super-résolution temps-réel: Shi, W., Caballero, J., Huszár, F., Totz, J., Aitken, A. P., Bishop, R., ... &amp;amp; Wang, Z. (2016). [https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network]. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 1874-1883).&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets / de visages P. Viola, M. Jones. (2001). [https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf Title] In Proceedings of the IEEE conference on computer vision and pattern recognition (CVPR2001).&lt;br /&gt;
** https://www.youtube.com/watch?v=uEJ71VlUmMQ&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2022-2023 =&lt;br /&gt;
&lt;br /&gt;
*  Segmentation d&#039;image hiérarchique par ensembles échelle (C. Carmagnac, L. Chardonnet)&lt;br /&gt;
*  Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; (R. Théodet, Y. Thépaut)&lt;br /&gt;
*  Scan de page par Webcam, redressement et amélioration d&#039;image&lt;br /&gt;
&lt;br /&gt;
== Segmentation d&#039;image hiérarchique par ensembles échelle ==&lt;br /&gt;
&lt;br /&gt;
La segmentation d&#039;image constitue à découper une image en ses régions d&#039;intérêt. Il se pose alors un problème d&#039;échelle à laquelle on veut voir l&#039;image. Doit-on faire attention aux  détails (e.g. visages, couleurs des yeux) ou à des parties plus globales (nombre de personnes dans la photo, etc). L&#039;approche par ensembles-échelle ou scale-sets construit une hiérarchie de partitions en régions d&#039;une image, paramétrée par une échelle lambda. Cette hiérarchie est causale (les hiérarchies plus fines sont incluses dans les hiérarchies plus grossières). En général la partition la plus fine est celle où chaque pixel  est une région pour  lambda=0. Avec  l&#039;augmentation de lambda, on fusionne deux à deux régions jusqu&#039;à arriver à la partition la plus grossière constituée d&#039;une seule région.&lt;br /&gt;
L&#039;intérêt du modèle de Guigues et al. est d&#039;associer une énergie à chaque région, paramétrée par l&#039;échelle lambda, et qui est représentatif de son homogénéité et de sa forme. Entre 2 régions adjacentes  R_i  et R_j, on peut  déterminer l&#039;échelle lambda_ij à partir de laquelle il vaut mieux fusionner les 2 régions pour diminuer l&#039;énergie totale. L&#039;algorithme de calcul de la hiérarchie consiste donc à regarder les paires de régions et à fusionner les régions dans l&#039;ordre croissant des échelles de fusion lambda_ij.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique des ensemble-échelle et l&#039;algorithme (heuristique) de calcul de sa hiérarchie&lt;br /&gt;
#* comprendre les structures de données utiles pour implémenter cet algorithme : graphe d&#039;adjacence de région, calcul du périmètre d&#039;une région, de son énergie&lt;br /&gt;
#* mettre en place un premier algorithme de fusion de régions&lt;br /&gt;
#* calculer pour 2 régions le lambda_ij optimal&lt;br /&gt;
#* afficher une partition à un lambda donné&lt;br /&gt;
# Etape 2 : optimisation&lt;br /&gt;
#* travailler les structures de données pour accélérer ou réutiliser les calculs&lt;br /&gt;
#* partir d&#039;une segmentation fine initiale moins triviale, genre le résultat d&#039;un watershed/ligne de partage des eaux&lt;br /&gt;
#* tester d&#039;autres énergies pour les régions&lt;br /&gt;
#* tester sur des bases d&#039;image&lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://link.springer.com/content/pdf/10.1007/s11263-005-6299-0.pdf Scale-sets image analysis, L Guigues, JP Cocquerez, H Le Men - International Journal of Computer Vision, 2006]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5i8LT2Gnd Cours INFO001 sur les ensembles échelle]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5IeK4xFhb Cours INFO001 sur les structures de données régions/partitions]&lt;br /&gt;
&lt;br /&gt;
== Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Si on réduit une image de manière  non isotrope, par exemple, on veut passer de 1080x600 à 400x400, les éléments importants de l&#039;image vont être déformés. &lt;br /&gt;
L&#039;approche proposée ici est d&#039;éliminer les parties non importantes de l&#039;image. Il se trouve que notre perception attache peu d&#039;importance aux parties homogènes d&#039;une image alors que nous distinguons très bien les parties à forte variation.&lt;br /&gt;
Le principe du seam carving est d&#039;éliminer 1 pixel par ligne (mettons). On pourrait donc essayer d&#039;éliminer la colonne la plus homogène, mais ce n&#039;est un peu trop rigide. On va plutôt tracer une colonne possiblement zigzaguante du haut vers le bas, qui minimise les variations de couleur. Cette &amp;quot;colonne&amp;quot; serait extraite par un algorithme d&#039;optimisation. Une fois qu&#039;on sait enlever une colonne, on peut recommencer le processus pour enlever plus de colonnes.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique du seam carving.&lt;br /&gt;
#* faire les prétraitements nécessaires à son calcul (gradient notammen)&lt;br /&gt;
#* mettre en place un algorithme  de recherche du meilleur chemin&lt;br /&gt;
#* faire alors les fonctions qui enlèvent une colonne et une ligne d&#039;une image&lt;br /&gt;
#* en déduire l&#039;algorithme de réduction de résolution w x h vers w&#039; x h&#039;, qui commence par une interpolation puis par éliminer seulement des lignes ou des colonnes&lt;br /&gt;
# Etape 2 : traitement temps-réel&lt;br /&gt;
#* la méthode est presque parallélisable naturellement, au sens où l&#039;algorithme d&#039;optimisation peut donner plusieurs chemins candidats&lt;br /&gt;
#* mettre en place cette approche avec élimination de plusieurs chemins  simultanées&lt;br /&gt;
#* voir si on peut aboutir à un traitement temps-réel d&#039;un flux vidéo&lt;br /&gt;
# Etape 3 : amélioration possibles&lt;br /&gt;
#* on peut travailler les énergies mises en place, changer l&#039;espace des couleurs, ou mixer plusieurs modèles de réduction de résolution&lt;br /&gt;
#* on pourra s&#039;inspirer aussi d&#039;articles ayant amélioré cette méthode.&lt;br /&gt;
# Quelques liens pour démarrer&lt;br /&gt;
#* [https://en.wikipedia.org/wiki/Seam_carving Seam carving sur wikipedia]&lt;br /&gt;
#* L&#039;article décrivant la méthode: [https://dl.acm.org/doi/10.1145/1275808.1276390 Avidan, Shai; Shamir, Ariel (July 2007). &amp;quot;Seam carving for content-aware image resizing | ACM SIGGRAPH 2007 papers&amp;quot;. Siggraph 2007]&lt;br /&gt;
&lt;br /&gt;
== Scan de page par Webcam, redressement et amélioration d&#039;image ==&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif est de scanner une page avec une simple webcam ou camera. L&#039;application doit permettre de lire un flux video en entrée, repérer les côtes d&#039;une feuille si elle est présente dans une certaine zone, puis ramener cette géométrie déformée à une feuille A4 (mettons). Ensuite des algorithmes d&#039;amélioration d&#039;image peuvent être utilisés : élimination du bruit, binarisation  (e.g. Otsu). Enfin on peut chercher à reconnaître les caractères (Optical Character Recognition). Ce projet poursuit le travail de R. Bouvier de l&#039;an dernier.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* On pourra commencer par reprendre le travail de Rémi Bouvier&lt;br /&gt;
#* Pour détecter les contours de la feuille, 2 techniques ont été implémentées, Canny ou watershed. &lt;br /&gt;
#* Permettre à l&#039;utilisateur de choisir en cours d&#039;utilisation la technique utilisée, de modifier les paramètres, de visualiser en surimpression le résultat&lt;br /&gt;
#* Reprendre ensuite la méthode de détection de lignes (transformée de Hough)&lt;br /&gt;
#** Indiquez clairement où l&#039;utilisateur doit à peu près placer les coins&lt;br /&gt;
#** Sélectionner les droites données par Hough en ne gardant que celles qui passent par ces zones&lt;br /&gt;
#* Si 4 bords de la page sont détectés, capturer l&#039;image et affichez-là&lt;br /&gt;
#* On pourra enfin redresser l&#039;image par une transformation homographique&lt;br /&gt;
# Etape 2 : améliorations&lt;br /&gt;
#* on peut travailler sur le déclenchement automatique de la capture, e.g.,  repérer que l&#039;histogramme dans la partie correspondant à la feuille comporte essentiellement des blancs/gris clairs et des noirs.&lt;br /&gt;
#* on peut renforcer/aider la détection des bords de l&#039;image en  détectant des coins dans les zones spécifiées.&lt;br /&gt;
#* on peut repérer que la feuille n&#039;est pas très droite (genre courbée d&#039;un côté ou de l&#039;autre :  en fait, elle ne peut pas être courbée des 2 côtés en même temps (car sa courbure gaussienne est nulle !).&lt;br /&gt;
#* on peut améliorer l&#039;image capturée en égalisant l&#039;image, ou proposer sa binarisation optimale par la méthode d&#039;Otsu.&lt;br /&gt;
#* on peut grouper les lignes puis tenter d&#039;utiliser la reconnaissance de caractères pour extraire les textes dans l&#039;image.&lt;br /&gt;
#* si le focus de la caméra n&#039;est pas bon, on peut essayer des techniques de déconvolution pour retrouver une image plus nette (c&#039;est un problème d&#039;optimisation), ou on peut essayer de piloter le focus de la caméra (mais pas toutes les caméras/webcam se laissent piloter). &lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://github.com/RemiB99/Proj002-ScanDocumentWebcam projet de Rémi Bouvier]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/NUd-0HnaB Transformée de Hough]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/A_-AUJ1ql Détection de coins/points saillants]&lt;br /&gt;
&lt;br /&gt;
= Archive des projets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
* R. Bouvier: [https://github.com/RemiB99/Proj002-ScanDocumentWebcam Scan de page par WebCam]&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
* R. Tournafond et A. Decouttère: [https://github.com/Gitravail/Proj002-ColorTransfert Transfert de couleurs entre images par transport optimal par coupes]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15128</id>
		<title>PROJ002 CMI : Projet en traitement et analyse d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15128"/>
		<updated>2024-01-17T14:54:39Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Sujets proposés 2023-2024 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Ce module constitue une initiation au monde de la recherche dans le laboratoire d&#039;adossement du CMI Info. Plusieurs sujets en lien avec le traitement et l&#039;analyse d&#039;image et les thématiques développées dans le laboratoire sont proposés aux étudiants, chacun avec un tuteur identifié. Le projet nécessite de &lt;br /&gt;
&lt;br /&gt;
Les étudiants CMI travaillent dans le laboratoire d&#039;accueil sur ces sujets, qui comportent tous:&lt;br /&gt;
* découverte du sujet de recherche à partir de références bibliographiques &lt;br /&gt;
* appropriation du sujet précis visé et développement d&#039;algorithmes répondant au problème posé.&lt;br /&gt;
* un point possible de contribution pour l&#039;étudiant, qui constitue un apport nouveau au sujet.&lt;br /&gt;
&lt;br /&gt;
Le projet se déroule en janvier, après le cours de traitement et analyse d&#039;image, avec environ 25h de présentiel dans le laboratoire. A l&#039;issue du projet, l&#039;étudiant ou le groupe d&#039;étudiant  doit remettre un dépôt (github ou autre) présentant l&#039;avancement de son travail, le code développé, un readme expliquant le sujet, décrivant les points saillants du travail réalisé et ainsi que comment se servir du code développé. Des exemples d&#039;utilisation doivent aussi être donnés.&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2023-2024 =&lt;br /&gt;
&lt;br /&gt;
Cette année, pour faire suite au cours avancé de  [https://codimd.math.cnrs.fr/s/U_hz-OPpK Traitement et Analyse d&#039;Image avec apprentissage profond], les sujets proposés sont en lien avec des techniques d&#039;apprentissage. L&#039;objectif est de recréer le réseau d&#039;apprentissage, l&#039;entrainer sur la base de votre choix (ImageNet ou COCO par exemple), et de mesurer l&#039;efficacité de stratégies d&#039;apprentissage.&lt;br /&gt;
&lt;br /&gt;
* Super-résolution temps-réel: Shi, W., Caballero, J., Huszár, F., Totz, J., Aitken, A. P., Bishop, R., ... &amp;amp; Wang, Z. (2016). [https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network]. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 1874-1883).&lt;br /&gt;
&lt;br /&gt;
* Détection d&#039;objets / de visages &lt;br /&gt;
** https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf&lt;br /&gt;
** https://www.youtube.com/watch?v=uEJ71VlUmMQ&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2022-2023 =&lt;br /&gt;
&lt;br /&gt;
*  Segmentation d&#039;image hiérarchique par ensembles échelle (C. Carmagnac, L. Chardonnet)&lt;br /&gt;
*  Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; (R. Théodet, Y. Thépaut)&lt;br /&gt;
*  Scan de page par Webcam, redressement et amélioration d&#039;image&lt;br /&gt;
&lt;br /&gt;
== Segmentation d&#039;image hiérarchique par ensembles échelle ==&lt;br /&gt;
&lt;br /&gt;
La segmentation d&#039;image constitue à découper une image en ses régions d&#039;intérêt. Il se pose alors un problème d&#039;échelle à laquelle on veut voir l&#039;image. Doit-on faire attention aux  détails (e.g. visages, couleurs des yeux) ou à des parties plus globales (nombre de personnes dans la photo, etc). L&#039;approche par ensembles-échelle ou scale-sets construit une hiérarchie de partitions en régions d&#039;une image, paramétrée par une échelle lambda. Cette hiérarchie est causale (les hiérarchies plus fines sont incluses dans les hiérarchies plus grossières). En général la partition la plus fine est celle où chaque pixel  est une région pour  lambda=0. Avec  l&#039;augmentation de lambda, on fusionne deux à deux régions jusqu&#039;à arriver à la partition la plus grossière constituée d&#039;une seule région.&lt;br /&gt;
L&#039;intérêt du modèle de Guigues et al. est d&#039;associer une énergie à chaque région, paramétrée par l&#039;échelle lambda, et qui est représentatif de son homogénéité et de sa forme. Entre 2 régions adjacentes  R_i  et R_j, on peut  déterminer l&#039;échelle lambda_ij à partir de laquelle il vaut mieux fusionner les 2 régions pour diminuer l&#039;énergie totale. L&#039;algorithme de calcul de la hiérarchie consiste donc à regarder les paires de régions et à fusionner les régions dans l&#039;ordre croissant des échelles de fusion lambda_ij.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique des ensemble-échelle et l&#039;algorithme (heuristique) de calcul de sa hiérarchie&lt;br /&gt;
#* comprendre les structures de données utiles pour implémenter cet algorithme : graphe d&#039;adjacence de région, calcul du périmètre d&#039;une région, de son énergie&lt;br /&gt;
#* mettre en place un premier algorithme de fusion de régions&lt;br /&gt;
#* calculer pour 2 régions le lambda_ij optimal&lt;br /&gt;
#* afficher une partition à un lambda donné&lt;br /&gt;
# Etape 2 : optimisation&lt;br /&gt;
#* travailler les structures de données pour accélérer ou réutiliser les calculs&lt;br /&gt;
#* partir d&#039;une segmentation fine initiale moins triviale, genre le résultat d&#039;un watershed/ligne de partage des eaux&lt;br /&gt;
#* tester d&#039;autres énergies pour les régions&lt;br /&gt;
#* tester sur des bases d&#039;image&lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://link.springer.com/content/pdf/10.1007/s11263-005-6299-0.pdf Scale-sets image analysis, L Guigues, JP Cocquerez, H Le Men - International Journal of Computer Vision, 2006]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5i8LT2Gnd Cours INFO001 sur les ensembles échelle]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5IeK4xFhb Cours INFO001 sur les structures de données régions/partitions]&lt;br /&gt;
&lt;br /&gt;
== Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Si on réduit une image de manière  non isotrope, par exemple, on veut passer de 1080x600 à 400x400, les éléments importants de l&#039;image vont être déformés. &lt;br /&gt;
L&#039;approche proposée ici est d&#039;éliminer les parties non importantes de l&#039;image. Il se trouve que notre perception attache peu d&#039;importance aux parties homogènes d&#039;une image alors que nous distinguons très bien les parties à forte variation.&lt;br /&gt;
Le principe du seam carving est d&#039;éliminer 1 pixel par ligne (mettons). On pourrait donc essayer d&#039;éliminer la colonne la plus homogène, mais ce n&#039;est un peu trop rigide. On va plutôt tracer une colonne possiblement zigzaguante du haut vers le bas, qui minimise les variations de couleur. Cette &amp;quot;colonne&amp;quot; serait extraite par un algorithme d&#039;optimisation. Une fois qu&#039;on sait enlever une colonne, on peut recommencer le processus pour enlever plus de colonnes.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique du seam carving.&lt;br /&gt;
#* faire les prétraitements nécessaires à son calcul (gradient notammen)&lt;br /&gt;
#* mettre en place un algorithme  de recherche du meilleur chemin&lt;br /&gt;
#* faire alors les fonctions qui enlèvent une colonne et une ligne d&#039;une image&lt;br /&gt;
#* en déduire l&#039;algorithme de réduction de résolution w x h vers w&#039; x h&#039;, qui commence par une interpolation puis par éliminer seulement des lignes ou des colonnes&lt;br /&gt;
# Etape 2 : traitement temps-réel&lt;br /&gt;
#* la méthode est presque parallélisable naturellement, au sens où l&#039;algorithme d&#039;optimisation peut donner plusieurs chemins candidats&lt;br /&gt;
#* mettre en place cette approche avec élimination de plusieurs chemins  simultanées&lt;br /&gt;
#* voir si on peut aboutir à un traitement temps-réel d&#039;un flux vidéo&lt;br /&gt;
# Etape 3 : amélioration possibles&lt;br /&gt;
#* on peut travailler les énergies mises en place, changer l&#039;espace des couleurs, ou mixer plusieurs modèles de réduction de résolution&lt;br /&gt;
#* on pourra s&#039;inspirer aussi d&#039;articles ayant amélioré cette méthode.&lt;br /&gt;
# Quelques liens pour démarrer&lt;br /&gt;
#* [https://en.wikipedia.org/wiki/Seam_carving Seam carving sur wikipedia]&lt;br /&gt;
#* L&#039;article décrivant la méthode: [https://dl.acm.org/doi/10.1145/1275808.1276390 Avidan, Shai; Shamir, Ariel (July 2007). &amp;quot;Seam carving for content-aware image resizing | ACM SIGGRAPH 2007 papers&amp;quot;. Siggraph 2007]&lt;br /&gt;
&lt;br /&gt;
== Scan de page par Webcam, redressement et amélioration d&#039;image ==&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif est de scanner une page avec une simple webcam ou camera. L&#039;application doit permettre de lire un flux video en entrée, repérer les côtes d&#039;une feuille si elle est présente dans une certaine zone, puis ramener cette géométrie déformée à une feuille A4 (mettons). Ensuite des algorithmes d&#039;amélioration d&#039;image peuvent être utilisés : élimination du bruit, binarisation  (e.g. Otsu). Enfin on peut chercher à reconnaître les caractères (Optical Character Recognition). Ce projet poursuit le travail de R. Bouvier de l&#039;an dernier.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* On pourra commencer par reprendre le travail de Rémi Bouvier&lt;br /&gt;
#* Pour détecter les contours de la feuille, 2 techniques ont été implémentées, Canny ou watershed. &lt;br /&gt;
#* Permettre à l&#039;utilisateur de choisir en cours d&#039;utilisation la technique utilisée, de modifier les paramètres, de visualiser en surimpression le résultat&lt;br /&gt;
#* Reprendre ensuite la méthode de détection de lignes (transformée de Hough)&lt;br /&gt;
#** Indiquez clairement où l&#039;utilisateur doit à peu près placer les coins&lt;br /&gt;
#** Sélectionner les droites données par Hough en ne gardant que celles qui passent par ces zones&lt;br /&gt;
#* Si 4 bords de la page sont détectés, capturer l&#039;image et affichez-là&lt;br /&gt;
#* On pourra enfin redresser l&#039;image par une transformation homographique&lt;br /&gt;
# Etape 2 : améliorations&lt;br /&gt;
#* on peut travailler sur le déclenchement automatique de la capture, e.g.,  repérer que l&#039;histogramme dans la partie correspondant à la feuille comporte essentiellement des blancs/gris clairs et des noirs.&lt;br /&gt;
#* on peut renforcer/aider la détection des bords de l&#039;image en  détectant des coins dans les zones spécifiées.&lt;br /&gt;
#* on peut repérer que la feuille n&#039;est pas très droite (genre courbée d&#039;un côté ou de l&#039;autre :  en fait, elle ne peut pas être courbée des 2 côtés en même temps (car sa courbure gaussienne est nulle !).&lt;br /&gt;
#* on peut améliorer l&#039;image capturée en égalisant l&#039;image, ou proposer sa binarisation optimale par la méthode d&#039;Otsu.&lt;br /&gt;
#* on peut grouper les lignes puis tenter d&#039;utiliser la reconnaissance de caractères pour extraire les textes dans l&#039;image.&lt;br /&gt;
#* si le focus de la caméra n&#039;est pas bon, on peut essayer des techniques de déconvolution pour retrouver une image plus nette (c&#039;est un problème d&#039;optimisation), ou on peut essayer de piloter le focus de la caméra (mais pas toutes les caméras/webcam se laissent piloter). &lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://github.com/RemiB99/Proj002-ScanDocumentWebcam projet de Rémi Bouvier]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/NUd-0HnaB Transformée de Hough]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/A_-AUJ1ql Détection de coins/points saillants]&lt;br /&gt;
&lt;br /&gt;
= Archive des projets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
* R. Bouvier: [https://github.com/RemiB99/Proj002-ScanDocumentWebcam Scan de page par WebCam]&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
* R. Tournafond et A. Decouttère: [https://github.com/Gitravail/Proj002-ColorTransfert Transfert de couleurs entre images par transport optimal par coupes]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15127</id>
		<title>PROJ002 CMI : Projet en traitement et analyse d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PROJ002_CMI_:_Projet_en_traitement_et_analyse_d%27image&amp;diff=15127"/>
		<updated>2024-01-17T14:28:10Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Sujets proposés 2022-2023 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Ce module constitue une initiation au monde de la recherche dans le laboratoire d&#039;adossement du CMI Info. Plusieurs sujets en lien avec le traitement et l&#039;analyse d&#039;image et les thématiques développées dans le laboratoire sont proposés aux étudiants, chacun avec un tuteur identifié. Le projet nécessite de &lt;br /&gt;
&lt;br /&gt;
Les étudiants CMI travaillent dans le laboratoire d&#039;accueil sur ces sujets, qui comportent tous:&lt;br /&gt;
* découverte du sujet de recherche à partir de références bibliographiques &lt;br /&gt;
* appropriation du sujet précis visé et développement d&#039;algorithmes répondant au problème posé.&lt;br /&gt;
* un point possible de contribution pour l&#039;étudiant, qui constitue un apport nouveau au sujet.&lt;br /&gt;
&lt;br /&gt;
Le projet se déroule en janvier, après le cours de traitement et analyse d&#039;image, avec environ 25h de présentiel dans le laboratoire. A l&#039;issue du projet, l&#039;étudiant ou le groupe d&#039;étudiant  doit remettre un dépôt (github ou autre) présentant l&#039;avancement de son travail, le code développé, un readme expliquant le sujet, décrivant les points saillants du travail réalisé et ainsi que comment se servir du code développé. Des exemples d&#039;utilisation doivent aussi être donnés.&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2023-2024 =&lt;br /&gt;
&lt;br /&gt;
Cette année, pour faire suite au cours avancé de  [https://codimd.math.cnrs.fr/s/U_hz-OPpK Traitement et Analyse d&#039;Image avec apprentissage profond], les sujets proposés sont en lien avec des techniques d&#039;apprentissage. L&#039;objectif est de recréer le réseau d&#039;apprentissage, l&#039;entrainer sur la base de votre choix (ImageNet ou COCO par exemple), et de mesurer l&#039;efficacité de stratégies d&#039;apprentissage.&lt;br /&gt;
&lt;br /&gt;
* Super-résolution temps-réel: Shi, W., Caballero, J., Huszár, F., Totz, J., Aitken, A. P., Bishop, R., ... &amp;amp; Wang, Z. (2016). [https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network]. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 1874-1883).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés 2022-2023 =&lt;br /&gt;
&lt;br /&gt;
*  Segmentation d&#039;image hiérarchique par ensembles échelle (C. Carmagnac, L. Chardonnet)&lt;br /&gt;
*  Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; (R. Théodet, Y. Thépaut)&lt;br /&gt;
*  Scan de page par Webcam, redressement et amélioration d&#039;image&lt;br /&gt;
&lt;br /&gt;
== Segmentation d&#039;image hiérarchique par ensembles échelle ==&lt;br /&gt;
&lt;br /&gt;
La segmentation d&#039;image constitue à découper une image en ses régions d&#039;intérêt. Il se pose alors un problème d&#039;échelle à laquelle on veut voir l&#039;image. Doit-on faire attention aux  détails (e.g. visages, couleurs des yeux) ou à des parties plus globales (nombre de personnes dans la photo, etc). L&#039;approche par ensembles-échelle ou scale-sets construit une hiérarchie de partitions en régions d&#039;une image, paramétrée par une échelle lambda. Cette hiérarchie est causale (les hiérarchies plus fines sont incluses dans les hiérarchies plus grossières). En général la partition la plus fine est celle où chaque pixel  est une région pour  lambda=0. Avec  l&#039;augmentation de lambda, on fusionne deux à deux régions jusqu&#039;à arriver à la partition la plus grossière constituée d&#039;une seule région.&lt;br /&gt;
L&#039;intérêt du modèle de Guigues et al. est d&#039;associer une énergie à chaque région, paramétrée par l&#039;échelle lambda, et qui est représentatif de son homogénéité et de sa forme. Entre 2 régions adjacentes  R_i  et R_j, on peut  déterminer l&#039;échelle lambda_ij à partir de laquelle il vaut mieux fusionner les 2 régions pour diminuer l&#039;énergie totale. L&#039;algorithme de calcul de la hiérarchie consiste donc à regarder les paires de régions et à fusionner les régions dans l&#039;ordre croissant des échelles de fusion lambda_ij.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique des ensemble-échelle et l&#039;algorithme (heuristique) de calcul de sa hiérarchie&lt;br /&gt;
#* comprendre les structures de données utiles pour implémenter cet algorithme : graphe d&#039;adjacence de région, calcul du périmètre d&#039;une région, de son énergie&lt;br /&gt;
#* mettre en place un premier algorithme de fusion de régions&lt;br /&gt;
#* calculer pour 2 régions le lambda_ij optimal&lt;br /&gt;
#* afficher une partition à un lambda donné&lt;br /&gt;
# Etape 2 : optimisation&lt;br /&gt;
#* travailler les structures de données pour accélérer ou réutiliser les calculs&lt;br /&gt;
#* partir d&#039;une segmentation fine initiale moins triviale, genre le résultat d&#039;un watershed/ligne de partage des eaux&lt;br /&gt;
#* tester d&#039;autres énergies pour les régions&lt;br /&gt;
#* tester sur des bases d&#039;image&lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://link.springer.com/content/pdf/10.1007/s11263-005-6299-0.pdf Scale-sets image analysis, L Guigues, JP Cocquerez, H Le Men - International Journal of Computer Vision, 2006]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5i8LT2Gnd Cours INFO001 sur les ensembles échelle]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/5IeK4xFhb Cours INFO001 sur les structures de données régions/partitions]&lt;br /&gt;
&lt;br /&gt;
== Réduction intelligente de taille d&#039;image par &amp;quot;seam carving&amp;quot; or &amp;quot;liquid rescaling&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Si on réduit une image de manière  non isotrope, par exemple, on veut passer de 1080x600 à 400x400, les éléments importants de l&#039;image vont être déformés. &lt;br /&gt;
L&#039;approche proposée ici est d&#039;éliminer les parties non importantes de l&#039;image. Il se trouve que notre perception attache peu d&#039;importance aux parties homogènes d&#039;une image alors que nous distinguons très bien les parties à forte variation.&lt;br /&gt;
Le principe du seam carving est d&#039;éliminer 1 pixel par ligne (mettons). On pourrait donc essayer d&#039;éliminer la colonne la plus homogène, mais ce n&#039;est un peu trop rigide. On va plutôt tracer une colonne possiblement zigzaguante du haut vers le bas, qui minimise les variations de couleur. Cette &amp;quot;colonne&amp;quot; serait extraite par un algorithme d&#039;optimisation. Une fois qu&#039;on sait enlever une colonne, on peut recommencer le processus pour enlever plus de colonnes.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* comprendre le modèle énergétique du seam carving.&lt;br /&gt;
#* faire les prétraitements nécessaires à son calcul (gradient notammen)&lt;br /&gt;
#* mettre en place un algorithme  de recherche du meilleur chemin&lt;br /&gt;
#* faire alors les fonctions qui enlèvent une colonne et une ligne d&#039;une image&lt;br /&gt;
#* en déduire l&#039;algorithme de réduction de résolution w x h vers w&#039; x h&#039;, qui commence par une interpolation puis par éliminer seulement des lignes ou des colonnes&lt;br /&gt;
# Etape 2 : traitement temps-réel&lt;br /&gt;
#* la méthode est presque parallélisable naturellement, au sens où l&#039;algorithme d&#039;optimisation peut donner plusieurs chemins candidats&lt;br /&gt;
#* mettre en place cette approche avec élimination de plusieurs chemins  simultanées&lt;br /&gt;
#* voir si on peut aboutir à un traitement temps-réel d&#039;un flux vidéo&lt;br /&gt;
# Etape 3 : amélioration possibles&lt;br /&gt;
#* on peut travailler les énergies mises en place, changer l&#039;espace des couleurs, ou mixer plusieurs modèles de réduction de résolution&lt;br /&gt;
#* on pourra s&#039;inspirer aussi d&#039;articles ayant amélioré cette méthode.&lt;br /&gt;
# Quelques liens pour démarrer&lt;br /&gt;
#* [https://en.wikipedia.org/wiki/Seam_carving Seam carving sur wikipedia]&lt;br /&gt;
#* L&#039;article décrivant la méthode: [https://dl.acm.org/doi/10.1145/1275808.1276390 Avidan, Shai; Shamir, Ariel (July 2007). &amp;quot;Seam carving for content-aware image resizing | ACM SIGGRAPH 2007 papers&amp;quot;. Siggraph 2007]&lt;br /&gt;
&lt;br /&gt;
== Scan de page par Webcam, redressement et amélioration d&#039;image ==&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif est de scanner une page avec une simple webcam ou camera. L&#039;application doit permettre de lire un flux video en entrée, repérer les côtes d&#039;une feuille si elle est présente dans une certaine zone, puis ramener cette géométrie déformée à une feuille A4 (mettons). Ensuite des algorithmes d&#039;amélioration d&#039;image peuvent être utilisés : élimination du bruit, binarisation  (e.g. Otsu). Enfin on peut chercher à reconnaître les caractères (Optical Character Recognition). Ce projet poursuit le travail de R. Bouvier de l&#039;an dernier.&lt;br /&gt;
&lt;br /&gt;
# Etape 1 : prototype&lt;br /&gt;
#* On pourra commencer par reprendre le travail de Rémi Bouvier&lt;br /&gt;
#* Pour détecter les contours de la feuille, 2 techniques ont été implémentées, Canny ou watershed. &lt;br /&gt;
#* Permettre à l&#039;utilisateur de choisir en cours d&#039;utilisation la technique utilisée, de modifier les paramètres, de visualiser en surimpression le résultat&lt;br /&gt;
#* Reprendre ensuite la méthode de détection de lignes (transformée de Hough)&lt;br /&gt;
#** Indiquez clairement où l&#039;utilisateur doit à peu près placer les coins&lt;br /&gt;
#** Sélectionner les droites données par Hough en ne gardant que celles qui passent par ces zones&lt;br /&gt;
#* Si 4 bords de la page sont détectés, capturer l&#039;image et affichez-là&lt;br /&gt;
#* On pourra enfin redresser l&#039;image par une transformation homographique&lt;br /&gt;
# Etape 2 : améliorations&lt;br /&gt;
#* on peut travailler sur le déclenchement automatique de la capture, e.g.,  repérer que l&#039;histogramme dans la partie correspondant à la feuille comporte essentiellement des blancs/gris clairs et des noirs.&lt;br /&gt;
#* on peut renforcer/aider la détection des bords de l&#039;image en  détectant des coins dans les zones spécifiées.&lt;br /&gt;
#* on peut repérer que la feuille n&#039;est pas très droite (genre courbée d&#039;un côté ou de l&#039;autre :  en fait, elle ne peut pas être courbée des 2 côtés en même temps (car sa courbure gaussienne est nulle !).&lt;br /&gt;
#* on peut améliorer l&#039;image capturée en égalisant l&#039;image, ou proposer sa binarisation optimale par la méthode d&#039;Otsu.&lt;br /&gt;
#* on peut grouper les lignes puis tenter d&#039;utiliser la reconnaissance de caractères pour extraire les textes dans l&#039;image.&lt;br /&gt;
#* si le focus de la caméra n&#039;est pas bon, on peut essayer des techniques de déconvolution pour retrouver une image plus nette (c&#039;est un problème d&#039;optimisation), ou on peut essayer de piloter le focus de la caméra (mais pas toutes les caméras/webcam se laissent piloter). &lt;br /&gt;
# Liens pour démarrer&lt;br /&gt;
#* [https://github.com/RemiB99/Proj002-ScanDocumentWebcam projet de Rémi Bouvier]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/NUd-0HnaB Transformée de Hough]&lt;br /&gt;
#* [https://codimd.math.cnrs.fr/s/A_-AUJ1ql Détection de coins/points saillants]&lt;br /&gt;
&lt;br /&gt;
= Archive des projets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
* R. Bouvier: [https://github.com/RemiB99/Proj002-ScanDocumentWebcam Scan de page par WebCam]&lt;br /&gt;
&lt;br /&gt;
== Projets réalisés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
* R. Tournafond et A. Decouttère: [https://github.com/Gitravail/Proj002-ColorTransfert Transfert de couleurs entre images par transport optimal par coupes]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15126</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15126"/>
		<updated>2024-01-17T13:09:50Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Surfaces polygonales et surfaces de subdivision */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== Surfaces polygonales et surfaces de subdivision ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polyscope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== Calcul des valeurs de Grundy pour des jeux octaux ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== Modélisation de la ruine du joueur ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Planarité de graphes ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Calibration de caméra et reconstruction 3D ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15125</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15125"/>
		<updated>2024-01-17T12:54:11Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Calibration de caméra et reconstruction 3D */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== Surfaces polygonales et surfaces de subdivision ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polycope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== Calcul des valeurs de Grundy pour des jeux octaux ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== Modélisation de la ruine du joueur ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Planarité de graphes ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Calibration de caméra et reconstruction 3D ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
* Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
* Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15124</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15124"/>
		<updated>2024-01-17T12:53:42Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Calibration de caméra et reconstruction 3D */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== Surfaces polygonales et surfaces de subdivision ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polycope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== Calcul des valeurs de Grundy pour des jeux octaux ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== Modélisation de la ruine du joueur ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Planarité de graphes ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Calibration de caméra et reconstruction 3D ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
- Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
- Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
- Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
* Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15123</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15123"/>
		<updated>2024-01-17T12:53:24Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Calibration de caméra et reconstruction 3D */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== Surfaces polygonales et surfaces de subdivision ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polycope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== Calcul des valeurs de Grundy pour des jeux octaux ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== Modélisation de la ruine du joueur ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Planarité de graphes ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Calibration de caméra et reconstruction 3D ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Stéphane Breuils&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039;&lt;br /&gt;
Nous explorons dans ce projet la calibration de caméras à partir d’un ensemble de points de correspondance et son utilisation pour reconstruire des objets en 3D. L&#039;idée est de pouvoir dimensionner précisément des éléments photographiés. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
- Comprendre la modélisation d&#039;une caméra (paramètres intrinsèques, extrinsèques)&lt;br /&gt;
- Etudier des méthodes de rectification épipôlaires consistant à transformer des images avec des homographies.&lt;br /&gt;
- Effectuer des calibrations de caméras et discuter des méthodes d&#039;estimation de la profondeur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* La bibliothèque OpenCV : https://docs.opencv.org/4.9.0/&lt;br /&gt;
* Tutoriel calibration :  https://docs.opencv.org/4.x/d9/db7/tutorial_py_table_of_contents_calib3d.html&lt;br /&gt;
Hartley, R., &amp;amp; Zisserman, A. (2003). Multiple view geometry in computer vision. Cambridge university press.&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15122</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15122"/>
		<updated>2024-01-17T09:25:20Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Modélisation de la ruine du joueur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== Surfaces polygonales et surfaces de subdivision ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polycope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== Calcul des valeurs de Grundy pour des jeux octaux ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== Modélisation de la ruine du joueur ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Planarité de graphes ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=15090</id>
		<title>VISI401 CMI : bibliographie scientifique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI401_CMI_:_bibliographie_scientifique&amp;diff=15090"/>
		<updated>2024-01-15T12:45:17Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Rendu temps réel avec OpenGL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Responsable:&lt;br /&gt;
* 2017-2021 : Jacques-Olivier Lachaud&lt;br /&gt;
* 2022-- : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
Ce module amène l&#039;étudiant à effectuer des recherches bibliographiques sur un sujet donné, et à synthétiser ses résultats sous la forme d&#039;un exposé construit.&lt;br /&gt;
&lt;br /&gt;
L&#039;étudiant, à partir d&#039;un sujet et d&#039;un ou plusieurs articles initiaux, doit approfondir le sujet, appréhender son historique, ses évolutions, et son état actuel. &lt;br /&gt;
&lt;br /&gt;
A côté des ressources fournies par les bibliothèques, quelques pointeurs très utiles pour faire des recherches bibliographiques:&lt;br /&gt;
* [https://scholar.google.fr Scholar Google] (libre)&lt;br /&gt;
* [https://researchgate.net ResearchGate] (libre)&lt;br /&gt;
* [https://mathscinet.ams.org/mathscinet/ MashSciNet] (plus math)&lt;br /&gt;
* [https://www.springerlink.com  Springer] (accès via USMB)&lt;br /&gt;
* [https://www.sciencedirect.com Elsevier Sciencedirect] (accès via USMB)&lt;br /&gt;
* SciHub lorsqu&#039;on ne trouve pas&lt;br /&gt;
&lt;br /&gt;
La synthèse bibliographique se fait en interaction avec le tuteur par des visites régulières et/ou des compte-rendus d&#039;avancement par email. La synthèse finale fait l&#039;objet d&#039;un exposé final (15-20 minutes + questions) et d&#039;un document de présentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2023-2024 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Génération de labyrinthes &amp;quot;organiques&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; la génération de labyrinthes est un problème classique, notamment abordé dans les cours d&#039;algorithmes de graphes. Ces méthodes permettent de générer des labyrinthes sur des &#039;&#039;grilles&#039;&#039;, typiquement carrées :&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze_grid.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
La création de labyrinthe &amp;quot;organiques&amp;quot;, du style&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;[[File:maze.png|300px]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
utilise une méthode très différente. Les détails sont décrits dans un article publié en  2006: http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf. La description peut sembler très abstraite, mais l&#039;idée initiale est assez simple : une courbe initiale est, petit à petit, déformée aléatoirement.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; comprendre la méthode de base, et l&#039;implémenter pour générer des labyrinthes organiques. La première version pourra être codée en Python, mais comme la méthode nécessite une &#039;&#039;grosse&#039;&#039; quantité de calculs, il pourra être intéressant de coder une seconde version en utilisant un langage compilé si l&#039;on souhaite obtenir de &amp;quot;gros&amp;quot; labyrinthes. De nombreuses améliorations sont décrites dans l&#039;article de H. Pedersen et K. Singh, et il serait intéressant de d&#039;en implémenter certaines, soient en Python (en les testant sur de petits labyrinthes) soit dans un autre langage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039; Hans Pedersen et Karan Singh, &#039;&#039;Organic Labyrinths and Mazes&#039;&#039;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== Tramage artistique d&#039;images ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le tramage d&#039;une image (en anglais *dithering* ou *half-toning*) consiste à esquisser une image en niveaux de gris ou en couleur à l&#039;aide de très peu d&#039;encres ou couleurs différentes. Historiquement, l&#039;utilisation la plus courante est en impression: un fax ne dispose que d&#039;une encre noire (donc 2 couleurs noir et blanc pour transférer une image), les imprimantes n&#039;ont que 4 encres (et donc cinq couleurs jaune, cyan, magenta, noir et le blanc du papier). Les premiers ordinateurs avaient des écrans avec très peu de couleurs, donc les photos étaient approchées avec 8 ou 16 couleurs. &lt;br /&gt;
&lt;br /&gt;
En informatique, les algorithmes de tramage par diffusion d&#039;erreur [https://fr.wikipedia.org/wiki/Algorithme_de_Floyd-Steinberg#:~:text=L%27algorithme%20de%20Floyd%2DSteinberg,un%20pixel%20à%20ses%20voisins. Floyd-Steinberg] sont faciles à implémenter et rapide, donc très utilisés.&lt;br /&gt;
&lt;br /&gt;
Néanmoins, il existe des algorithmes qui donnent des résultats beaucoup plus jolis, notamment celui proposé par Ostromoukhov et Hersch (1999). Nous proposons de l&#039;étudier et de l&#039;implémenter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-david.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:dithering-photo.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Floyd-Steinberg&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Ostromoukhov-Hersch&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre les principes du tramage, éventuellement coder en python/opencv l&#039;algorithme basique. Comprendre ensuite l&#039;algorithme d&#039;Ostromoukhov et Hersch (1999), et l&#039;implémenter en python, d&#039;abord en noir et blanc, et si le temps le permet, en couleur.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://dl.acm.org/doi/pdf/10.1145/311535.311605 Ostromoukhov et Hersch, Multi-Color and Artistic Dithering, ACM SIGGRAPH 1999]&lt;br /&gt;
* [https://opencv.org OpenCV], pratique pour lire une image, l&#039;afficher, faire des traitements.&lt;br /&gt;
&lt;br /&gt;
=== Rendu réaliste de scènes 3D par lancé de rayons ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le rendu réaliste de scène 3D a été (et reste) un des objectifs majeurs de l&#039;informatique graphique, notamment grâce à ses nombreuses applications dans différents domaines : le cinéma (effets spéciaux), mais aussi le marketing, la publicité, l&#039;architecture, ou l&#039;art. L&#039;algorithme le plus utilisé est appelé &amp;quot;lancer de rayons&amp;quot;, avec un objectif de simuler le trajet des rayons lumineux dans une scène 3D afin de déterminer les couleurs perçues par un observateur. Plutôt que de calculer tous les rayons lumineux d&#039;une scène, cet algorithme calcule seulement le trajet inverse des rayons lumineux qui arrivent dans l&#039;oeil de l&#039;observateur, ce qui est beaucoup plus économique. On verra que cet algorithme permet de simuler des matériaux réfléchissants ou (semi-)transparents, de calculer des ombres portées, de simuler du brouillard...&lt;br /&gt;
&lt;br /&gt;
[[file:ray-tracing.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Il s&#039;agit de comprendre d&#039;où vient la couleur perçue d&#039;un objet, d&#039;implémenter l&#039;algorithme récursif classique du lancé de rayons, au moins avec des objets simples (sphères, tétraèdres), et de voir comment optimiser les calculs (car ça devient vite coûteux). On pourra s&#039;appuyer sur ce [https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html TP] pour l&#039;implémentation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://en.wikipedia.org/wiki/Ray_tracing_(graphics)&lt;br /&gt;
* https://jacquesolivierlachaud.github.io/lectures/info804/Tests/html/ig_tp2.html&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note : &#039;&#039;&#039; Sujet demandé par Lukas Rey.&lt;br /&gt;
&lt;br /&gt;
=== Rendu temps réel avec OpenGL ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Colin Weill-Duflos&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; On cherche à utiliser une API graphique (OpenGL) afin de faire du rendu de scène 3d en utilisant la carte graphique. Cela permet d&#039;utiliser les techniques de rendu 3d en temps réel (rastérisation) et de les faire effectivement fonctionner en temps réel, permettant d&#039;afficher une scène avec laquelle on peut intéragir : en déplaçant la caméré, en bougeant des éléments...&lt;br /&gt;
Ces techniques ont déjà été utilisée dans des années précédentes, sans utiliser la carte graphique (le résultat était assez lent). Grâce à OpenGL, la plupart de ces opérations peuvent s&#039;effectuer sur la carte graphique, ce qui permet de ne pas avoir à en recoder une partie (grâce à des composants capables de faire uniquement ces opérations) et d&#039;être plus rapide.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* comprendre les techniques de raterisation&lt;br /&gt;
* comprendre la pipeline OpenGL&lt;br /&gt;
* implémenter une scène avec un objet et une caméra controlable&lt;br /&gt;
* rajouter des shaders pour simuler la lumière (Phong shading), variantes stylisées (Toon shading)&lt;br /&gt;
* rajouter des textures sur la scène&lt;br /&gt;
* faire des shadow maps pour les ombres&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [Travaux précédents](http://os-vps418.infomaniak.ch:1250/mediawiki/images/0/0d/Gossin-2023.pdf)&lt;br /&gt;
* [Pipeline OpenGL](https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview)&lt;br /&gt;
* [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
* [Toon shading](https://fr.wikipedia.org/wiki/Ombrage_de_cellulo%C3%AFd)&lt;br /&gt;
* [Shadow maps](https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping)&lt;br /&gt;
&lt;br /&gt;
=== Problèmes indécidables ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Quand on a un calcul à faire, on peut se demander de la meilleure implémentation pour faire faire ce calcul par un ordinateur. On pense généralement moins à la question - pourtant primordiale - de savoir si ce calcul peut être effectué par l’ordinateur. Pourtant, on sait depuis l’origine de l’informatique qu’il existe des fonctions que l’on ne peut pas calculer à l’aide d’un ordinateur.  On cherchera à comprendre ce que serait un programme qui résoudrait le problème de l’arrêt et pourquoi, il ne marchera pas. On pourra se demander alors s’il y a un lien entre les différents problèmes non-calculables : avec une librairie qui résout le problème de l’arrêt, peut-on écrire un problème qui résout le problème de correspondance de Post ? Peut-on imaginer un problème qu’on ne pourrait pas résoudre même si on avait une fonction qui résolvait le problème de l’arrêt ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de fonction calculable (et donc de fonction non-calculable). Donner des exemples. &amp;quot;Coder&amp;quot; l’argument diagonal de la non-calculabilité de l’arrêt. Coder une réduction entre deux problèmes non-calculables.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Th%C3%A9orie_de_la_calculabilit%C3%A9 Wikipédia - Théorie de la calculabilité]&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_l%27arr%C3%AAt Wikipédia - Problème de l&#039;arrêt]&lt;br /&gt;
* [https://ludovicpatey.com/courses/comp-thy-2023/cr11-fr.pdf Livre récent en français sur la théorie de la calculabilité]&lt;br /&gt;
&lt;br /&gt;
== sujets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
=== algorithmes de recherche de chaines ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : rechercher si une chaine &#039;&#039;s1&#039;&#039; apparait à l&#039;intérieur d&#039;une chaine &#039;&#039;s2&#039;&#039; est assez simple, mais l&#039;algorithme naïf n&#039;est pas très rapide. L&#039;objectif de ce sujet est de s&#039;intéresser à certains algorithmes de recherche de sous-chaines plus efficaces. Le plus simple est probablement l&#039;algorithme KMP (du noms de ses inventeurs : Knuth, Morris et Pratt) qui évite des comparaisons inutiles de l&#039;algorithme naïf. L&#039;algorithme de Boyer-Moore utilise des idées similaires mais considère la sous-chaine (&#039;&#039;s1&#039;&#039;) à l&#039;envers, ce qui lui permet d&#039;aller en général plus vite. Ces algorithmes restent assez lents lorsque la chaine &#039;&#039;s2&#039;&#039; est très grande. C&#039;est par exemple le cas en bio-informatique lorsque l&#039;on doit rechercher des chaines dans le génome. Dans ce cas, la chaine &#039;&#039;s2&#039;&#039; est fixe et on rercherche de nombreuses sous-chaines &#039;&#039;s1&#039;&#039;. Il est alors possible de faire un &#039;&#039;pré-traitement&#039;&#039; pour faire une recherche beaucoup plus rapide qui ne dépend pas de la taille de &#039;&#039;s2&#039;&#039; !&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de quelques uns de ces algorithmes&lt;br /&gt;
*# les implémenter (par exemple en Python)&lt;br /&gt;
*# essayer de les comparer&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
# https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm&lt;br /&gt;
# https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm&lt;br /&gt;
# transformé de Burrows-Wheeler et recherche de sous-chaines https://www.youtube.com/watch?v=P3ORBMon8aw&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== génération de labyrinthes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : il existe de nombreuses méthodes algorithmiques pour générer des labyrinthes aléatoires. La plupart de ces méthodes sont expliquées sur des grilles carrées mais il est possible de les implémenter sur d&#039;autres types de grilles. Il est possible des les adapter par exemple pour générer des labyrinthes circulaires, cylindriques, ou sphériques ; ou bien des labyrinthes en plusieurs parties (de grandes pièces contenant des labyrinthes, reliées par des couloirs formant un autre labyrinthe).&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre le fonctionnement de plusieurs algorithmes de génération de labyrinthes&lt;br /&gt;
*# les étendres à des grilles plus intéressantes&lt;br /&gt;
*# &#039;&#039;expérimenter et chercher des manières simples de générer un labyrinthe &amp;quot;continu&amp;quot;&#039;&#039; (La solution décrite dans &amp;quot;How to Generate Perfect Mazes?&amp;quot; est probablement un peu trop complexe.)&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** le livre &amp;quot;Mazes for programmers&amp;quot;, https://pragprog.com/titles/jbmaze/mazes-for-programmers/&lt;br /&gt;
** l&#039;article &amp;quot;How to Generate Perfect Mazes?&amp;quot;, https://hal.uca.fr/hal-03174952/file/article-journal-2020.pdf&lt;br /&gt;
** l&#039;article &amp;quot;Organic Labyrinths and Mazes&amp;quot;, http://www.dgp.toronto.edu/~karan/artexhibit/mazes.pdf&lt;br /&gt;
&lt;br /&gt;
=== L’infâme GOTO ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : L’instruction goto n’a aujourd’hui plus la côte parmi les informaticiens, et est souvent considérée comme une instruction à bannir. L&#039;idée est d&#039;explorer ce que permet cette instruction, et comment a évolué son utilisation.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# remplacer des structures de contrôles simples simples par des goto&lt;br /&gt;
*# faire un programme plus complexe utilisant un maximum de goto&lt;br /&gt;
*# expliquer l&#039;évolution de l&#039;utilisation du goto&lt;br /&gt;
*# avantages/inconvénients de son utilisation&lt;br /&gt;
*# comparaison des langages prenant en charge ou non cette instruction et pourquoi&lt;br /&gt;
*# utilisation actuelle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Blockchains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
&lt;br /&gt;
* Résumé : les blockchains sont de plus en plus populaires, utilisées initialement pour les cryptomonnaies, elles peuvent être utilisées pour stocker des données, gérer les contrats intelligents, etc.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre le fonctionnement des blockchains (par exemple avec l&#039;article de Satoshi Nakamoto)&lt;br /&gt;
*# implémenter une blockchaine&lt;br /&gt;
*# ...&lt;br /&gt;
&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de reconstruction de surfaces à partir d&#039;images 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les images 3D sont devenues courantes avec les outils d&#039;acquisition comme les scanners X ou les scanners IRM. On peut aussi modéliser des objets 3D sous forme de volumes, pour ensuite en extraire des surfaces (e.g. modélisation de fluides, de feu ou de fumées). Un enjeu est de pouvoir construire des surfaces qui représentent le bord d&#039;objets d&#039;intérêt dans ces données volumiques. Les algorithmes les plus classiques reconstruisent une surface composée de triangles qui approchent un niveau de gris donné dans le volume 3D :  c&#039;est une iso-surface, comparable à une courbe d&#039;iso-altitude dans une carte topographique, mais en 3D ! On  s&#039;intéreressera à deux algorithmes particulièrement : le marching-tetrahedra et le marching-cubes.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre ce qu&#039;est une iso-surface dans une image 3D ou dans une fonction implicite.&lt;br /&gt;
*# Comprendre les points communs et différences des algorithmes Marching Tetrahedra et Marching Cubes&lt;br /&gt;
*# Implémenter un des deux algorithmes. On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python. &lt;br /&gt;
*# On lira des fichiers .vol pour les images 3D, qui vous seront fournies.&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_tetrahedra Marching Tetrahedra sur wikipedia]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Marching_cubes Marching Cubes sur wikipedia]&lt;br /&gt;
** [https://dl.acm.org/doi/pdf/10.1145/37402.37422 Lorensen, Cline, Marching cubes: a high resolutions 3D surface construction algorithm, Computer Graphics, 21(4), 1987]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-slices.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; [[Fichier: dragon-isosurface.png|300px]] &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Coupes dans une image 3D &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Isosurface dans cette image &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Invitation à la complexité algorithmique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
&lt;br /&gt;
* Résumé : on abordera le thème de la complexité algorithmique : étant donné un programme implémentant une fonction, peut-on borner son temps de calcul en fonction de la taille de ses entrées. On procédera par l&#039;exemple, en tentant de confirmer la théorie par des expériences concrets de petits programmes (par exemple en Python). Comme point d&#039;entrée, on pourra par exemple examiner les différences de complexité entre quelques algorithmes de tri.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre l&#039;intérêt de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;,&lt;br /&gt;
*# se familiariser avec les notions et notations utilisées pour décrire la complexité en temps de calcul (ou en mémoire) des algorithmes,&lt;br /&gt;
*# apprendre à vers de &amp;quot;benchmarks&amp;quot; pour évaluer l&#039;efficacité réelle d&#039;une fonction dans un langage de programmation,&lt;br /&gt;
*# comprendre les limites de la complexités &amp;quot;à un facteur de proportionalité près&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== sujets 2021-2022 ==&lt;br /&gt;
&lt;br /&gt;
===Rust et la notion d&#039;appartenance (&amp;quot;ownership&amp;quot;)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Théo Connetable : [[Fichier:VISI401-2022-Connetable.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : dans la plupart des langages &amp;quot;haut niveau&amp;quot; (Python, Java, Javascript, ...), la mémoire est gérée automatiquement. Par exemple, Python détecte qu&#039;une liste ne sert plus à rien pour libérer la mémoire qu&#039;elle occupait. Dans les langages &amp;quot;bas niveau&amp;quot; (C), c&#039;est au programmeur de libérer explicitement la mémoire qu&#039;il utilise. (S&#039;il ne le fait pas, son programme risque d&#039;avoir des &amp;quot;fuites de mémoire&amp;quot;.) Rust est un nouveau (première version en 2010) langage de programmation. Un des objectifs de Rust est d&#039;offrir des garanties de sécurité sur la mémoire avec la notion d&#039;appartenance. Ces garanties sont testées à la compilation et ne dégradent donc pas l&#039;efficacité du programme final.&lt;br /&gt;
* Objectifs : l&#039;objectif, après s&#039;être familiarisé avec le langage Rust, est de comprendre à quoi correspond la notion de &amp;quot;ownership&amp;quot; (&amp;quot;appartenance&amp;quot;) et de l&#039;illustrer sur quelques exemples. Si l&#039;étudiant ne les connait pas, les notions de pointeurs (en C), d&#039;allocation sur la pile, sur le tas, et le concept de &amp;quot;ramasse miettes&amp;quot; (garbage collector&amp;quot; en anglais) seront des étapes préliminaires importantes.&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# The Rust Programming Language https://doc.rust-lang.org/book/title-page.html, avec en particulier la section 4, &amp;quot;Understanding Ownership&amp;quot;&lt;br /&gt;
*# Safe Systems Programming in Rust https://cacm.acm.org/magazines/2021/4/251364-safe-systems-programming-in-rust/fulltext&lt;br /&gt;
*# Rust Ownership by Example https://depth-first.com/articles/2020/01/27/rust-ownership-by-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Bitcoin &amp;amp; blockchain===&lt;br /&gt;
* Présentation : Baptiste Griva [[Fichier:VISI401-2022-Griva.pdf]]&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Les blockchain sont de plus en plus populaires. Avec l&#039;article de Satoshi Nakamoto, l&#039;étudiant devra comprendre son fonctionnement. On pourra dans un second temps s&#039;intéresser aux attaques habituelles face à une blockchain.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre le fonctionnement de la blockchain bitcoin&lt;br /&gt;
*# S&#039;intéresser à ses vulnérabilités (51% attack,...)&lt;br /&gt;
* Références: pour commencer https://bitcoin.org/bitcoin.pdf&lt;br /&gt;
&lt;br /&gt;
===Débruitage d&#039;image===&lt;br /&gt;
* Présentation : Lucas Policastro [[Fichier:VISI401-2022-Policastro.pdf]]&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La plupart des procédés d&#039;acquisition d&#039;image (typiquement capteurs CCD ou CMOS des caméras ou téléphones) ne sont pas parfaits et introduisent du bruit (des perturbations) dans les images résultantes. Ce bruit ressemble en général à une perturbation aléatoire locale par capteur, indépendante de ce  qui se passe sur un capteur proche. Peut-on alors améliorer la qualité visuelle d&#039;une photo dégradée par un tel bruit (typiquement gaussien) ? On regardera notamment les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les algorithmes basées sur la variation totale et sur les moyennes non locales.&lt;br /&gt;
*# On pourra s&#039;appuyer sur les démos IPOL en ligne de ces algorithmes et leur description. http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
*# L&#039;algorithme des moyennes non locales est implémentable relativement facilement (même en numpy).&lt;br /&gt;
* Références:&lt;br /&gt;
** http://www.ipol.im/pub/art/2011/bcm_nlm/&lt;br /&gt;
** Le site https://www.ipol.im contient plein d&#039;algos de restauration d&#039;image (suivre Enhancement &amp;amp; Restoration, puis Denoising).&lt;br /&gt;
&lt;br /&gt;
===Sécurité des cartes RFID : le cas Mifare===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Paul Aubry [[Fichier:VISI401-2022-Aubry.pdf]]&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : les cartes RFID (Radio Frequency IDentification) sont des cartes à puce qui peuvent communiquer avec un lecteur distant (mais proche). De nombreuses cartes de transport en commun ou d&#039;ouverture de portes utilisent cette technologie. La carte Mifare classic, très répandue, utilise un protocole cryptographique pour éviter les &amp;quot;replay attacks&amp;quot; (enregistrer un échange pour le réutiliser) et le clonage de la carte. Le détails du protocole est longtemps resté un secret industriel, mais ceci n&#039;a pas empéché la découverte de *grosses* failles. Il est maintenant possible de cloner une carte Mifare en quelques secondes avec du matériel grand public.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre fonctionne la protection contre les &amp;quot;replay attacks&amp;quot; à partir de challenges cryptographiques&lt;br /&gt;
*# comprendre le protocole Mifare classic&lt;br /&gt;
*# comprendre les attaques sur le protocole&lt;br /&gt;
*# expérimenter avec des puces RFID existante *(facultatif)*&lt;br /&gt;
*# regarder les évolutions du protocole pour se protéger de ces attaques&lt;br /&gt;
* Référence : F. D. Garcia, P. van Rossum, R. Verdult, R. Wichers Schreur : &amp;quot;Wirelessly Pickpocketing a Mifare Classic Card&amp;quot; https://www.cs.ru.nl/~flaviog/publications/Pickpocketing.Mifare.pdf&lt;br /&gt;
&lt;br /&gt;
===Ingénierie Dirigée par les Modèles (IDM)===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Alexandre Desbos [[Fichier:VISI-401-2022-Desbos.pdf]]&lt;br /&gt;
* Tuteur : Philippe Pernelle&lt;br /&gt;
* Résumé : l&#039;ingénierie dirigée par les modèles (ou MDE Model Driven Engineering) est une approche de conception basée sur la transformation de modèle sur des niveaux d&#039;abstraction différents (modèle, méta-modèle, méta-méta-modèle ...). l&#039;OMG propose une approche MDE basée sur 3 niveaux  d&#039;abstraction (CIM,PIM, PSM)  permettant de bâtir une application  en partant du niveaux d&#039;abstraction le plus haut (CIM) et en procédant par transformation / raffinement pour arriver au PSM puis à la génération de code. Il existe par ailleurs différents langages  (ATL, OCL) qui vont faciliter la transformation de modèle. A noter que la fondation Eclipse propose un environnement spécifique pour manipuler des modèles avec des implémentations d&#039;ATL et d&#039;OCL&lt;br /&gt;
* Objectifs :  L&#039;objectif est d&#039;étudier ces mécanismes de transformation / raffinement par l&#039;implémentation d&#039;un cas d&#039;étude dans eclipse en utilisant les langages ATL et OCL. Après une étude bibliographique des principes de MDA, l&#039;idée est de mettre en oeuvre dans Eclipse des extrait des modèles CIM, PIM et PSM proposés par les articles ci-dessous puis d&#039;essayer de construire des OCL et des scripts ATL afin de faciliter la transformation (sans aller jusqu&#039;à la génération de code)&lt;br /&gt;
* Références : pour commencer&lt;br /&gt;
*# These : https://hal.archives-ouvertes.fr/tel-01247610 (uniquement les pages 35 à 47)&lt;br /&gt;
*# Models and Mechanisms for implementing playful scenarios https://hal.archives-ouvertes.fr/hal-01372311&lt;br /&gt;
*# Digital Twin and Ecological Transition Integration in Training Process https://hal.archives-ouvertes.fr/hal-03375508&lt;br /&gt;
*# Eclipse Modeling Tools https://www.eclipse.org/downloads/packages/release/2021-12/r/eclipse-modeling-tools&lt;br /&gt;
&lt;br /&gt;
===[[Couvrir un polygone rectilinéaire avec des rectangles]]===&lt;br /&gt;
* Présentation : Maxent Bernier [[Fichier:VISI401-2022-Bernier.pdf]]&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Un polygone est dit rectilinéaire si les seuls angles qui apparaissent sont des angles droits. On considérera des polygones simples (i.e., sans trous et qui ne s&#039;auto-intersectent pas). Un tel polygone peut donc être recouvert par des carrés ou par des rectangles. On cherchera à écrire un algorithme qui trouve une couverture minimale (i.e., avec le moins de carrés/rectangles possibles). Dans le cas des carrés, on va pouvoir trouver un algorithme efficace pour ce problème. Malheureusement, le cas de la couverture minimale par les rectangles est NP-complète. &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme de recouvrement par des carrés&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet et le lien avec la couverture par les rectangles&lt;br /&gt;
*# Contourner la difficulté de la NP-complétude (heuristique ou cas des polygones orthogonalement convexes)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polygon_covering#cite_note-cr88-4  Couvertures de polygones (Wikipedia)]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/NP-completeness NP-complétude (Wikipedia)]]&lt;br /&gt;
** [[http://webdocs.cs.ualberta.ca/~joe/Preprints/Cover/paper.ps La couverture par rectangles est NP-complète]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires ===&lt;br /&gt;
&lt;br /&gt;
*Présentation : Emilien Boitouzet [[Fichier:VISI401-2022-Boitouzet.pdf]]&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
[[Fichier:automate_1.png]] [[Fichier:automate_2.jpeg]]&lt;br /&gt;
* Sujet : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser des calculs. Cependant les réalisations pratiques manquent, ce sujet se propose d’étudier l’utilisation des automates cellulaires dans les domaines suivant par exemple :&lt;br /&gt;
*# Modélisation des systèmes complexes (propagation des feux de forêt, processus de percolation, écoulement du sable ...)&lt;br /&gt;
*# Modélisation du comportement d&#039;un gaz&lt;br /&gt;
*# Système dynamique discret alternatif au modèle physique des équations aux dérivées partielles&lt;br /&gt;
*# Modélisation de la croissance de tissus cellulaires en biologie&lt;br /&gt;
*# Simulation de la croissance des cristaux&lt;br /&gt;
*# Correction automatique d’erreurs en imagerie&lt;br /&gt;
* Référence: https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
&lt;br /&gt;
=== Programmation bare-metal ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Andrien Montmayeur [[Fichier:VISI401-2022-Montmayeur.pdf]]&lt;br /&gt;
* Tuteur : Colin Weill-Duflos&lt;br /&gt;
* Sujet : l&#039;execution d&#039;un programme compilé peut parfois paraître un peu magique: on ne comprend pas forcément tout ce que fait le compilateur, et le système d&#039;exploitation fournit des abstractions bien pratiques. Comment se débrouille-t-on dans un contexte où il n&#039;y a pas de système d&#039;exploitation, comme certaines applications embarquées ou bien le système d&#039;exploitation lui-même?&lt;br /&gt;
* Objectifs : comprendre en détails la chaîne de compilation du C, l&#039;architecture d&#039;un executable et comment ce dernier est executé par une machine pour parvenir à faire executer un programme directement par un microprocesseur arm et interagir avec des périphériques simples.&lt;br /&gt;
* Référence:&lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Executable_and_Linkable_Format Architecture d&#039;un executable]&lt;br /&gt;
*#[https://aticleworld.com/c-compilation-process/ les étapes de compilation du C] (regarder notamment le linkage)&lt;br /&gt;
*# [https://azeria-labs.com/arm-data-types-and-registers-part-2/ débuter avec l&#039;assembleur arm]&lt;br /&gt;
&lt;br /&gt;
===GeoGebra et algèbre géométrique ===&lt;br /&gt;
&lt;br /&gt;
* Présentation : Nolann Sanmarti [[Fichier:VISI401-2022-Sanmarti.pdf]]&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Sujet : l&#039;algèbre géométrique émerge récemment comme un outil prometteur pour la synthèse d&#039;images : avec des points de contrôle, un produit, il est possible de représenter et de manipuler de manière efficace un ensemble d&#039;objets géométriques. Récemment, des bibliothèques c++ ont été développées. Ces bibliothèques autorisent une utilisation générique de l&#039;algèbre géométrique mais sont encore limitées par le manque d&#039;outils intéractifs adaptés. Par ailleurs, le logiciel de visualisation GeoGebra est un outil particulièrement utile pour la visualisation et la résolution de problèmes géométriques. Le but de ce projet serait de travailler un binding entre l&#039;algèbre géométrique et GeoGebra.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# se familiariser avec l&#039;algèbre géométrique, et l&#039;applet Javascript de GeoGebra,&lt;br /&gt;
*# identifier les objets et les opérations géométriques intéressantes à visualiser avec l&#039;algèbre géométrique,&lt;br /&gt;
*# implantations d&#039;une méthode générique permettant de générer des scripts dans l&#039;applet Javascript de GeoGebra.&lt;br /&gt;
* Références :&lt;br /&gt;
*# Projective geometric algebra: A new framework for doing euclidean geometry, Charles G. Gunn, 2019&lt;br /&gt;
*# [http://www.geogebra.org geogebra]&lt;br /&gt;
&lt;br /&gt;
== sujets 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
=== Comment Facebook gère ses données ?  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Pour une base de données, il est impossible d&#039;être cohérent, disponible tout le temps et partitionné. C&#039;est le fameux théorème CAP. Pour autant, les données de Facebook sont cohérentes, disponibles tout le temps, et réparties à travers le monde !? Impossible. Pour l&#039;étudiant, il faudra comprendre pourquoi c&#039;est impossible, et comment Facebook fait en pratique pour gérer ce problème.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le CAP théorème, et sa démonstration&lt;br /&gt;
*# Comprendre comment Facebook gère ce problème, et ses données d&#039;une manière générale&lt;br /&gt;
*# À définir, selon les questions que se pose l&#039;étudiant.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Théorème CAP :&lt;br /&gt;
*## https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_CAP&lt;br /&gt;
*## Brewer&#039;s Conjeture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services (https://awoc.wolski.fi/dlib/big-data/GiLy02-CAP.pdf)&lt;br /&gt;
*# Facebook Social Graph :&lt;br /&gt;
*## TAO : The power of the graph (https://engineering.fb.com/2013/06/25/core-data/tao-the-power-of-the-graph/)&lt;br /&gt;
*## TAO: Facebook’s Distributed Data Store for the Social Graph (https://www.usenix.org/system/files/conference/atc13/atc13-bronson.pdf)&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de calcul de l&#039;enveloppe convexe  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les ensembles convexes ont beaucoup de propriétés géométriques intéressantes, par exemple détecter la collision de deux ensembles convexes est &amp;quot;facile&amp;quot; algorithmiquement. Une étape fréquente dans beaucoup d&#039;algorithmes de traitements de données 2D/3D/nD est donc de calculer l&#039;enveloppe convexe d&#039;un nuage de points, c&#039;est-à-dire le plus petit ensemble convexe contenant ces points. Il existe de nombreux algorithmes de calcul d&#039;enveloppe convexe en 2D (Graham scan, Melkman, balayage de ligne (sweep-line), division-fusion, Chan&#039;s algorithm, Quickhull) et 3D (Chan&#039;s algorithm, Quickhull) et même nD (Quickhull notamment).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
|Enveloppe convexe des points à coordonnées entières inclus dans une boule de diamètre 25&lt;br /&gt;
|----&lt;br /&gt;
[[Fichier:Qhull-25.png|300px]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Objectifs: il s&#039;agira de regarder quelques uns de ces algorithmes, d&#039;identifier leurs principales différences ainsi que leurs complexités théoriques et pratiques. On pourra aussi regarder plus précisément l&#039;algorithme Quickhull, dont l&#039;implémentation 2D est facile, et 3D accessible.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Barber, C. B., Dobkin, D. P., &amp;amp; Huhdanpaa, H. (1996). The quickhull algorithm for convex hulls. ACM Transactions on Mathematical Software (TOMS), 22(4), 469-483 [[https://www.researchgate.net/profile/Hannu_Huhdanpaa/publication/242414606_The_Quickhull_Algorithm_for_Convex_Hulls/links/54e5f6970cf2bff5a4f1e7db.pdf (PDF)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Graham_scan Algorithme de Graham (Wikipedia)]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Convex_hull_algorithms Convex hull algorithms (Wikipedia)]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes autour des polyominos ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Un polyomino est une forme (sans trou) obtenue en collant des petits carrés de taille 1 par leurs bords. Des exemples connus sont par exemples les pièces du jeu tetris : il s&#039;agit de &amp;quot;tétramino&amp;quot;, c&#039;est à dire de polyomino formés de 4 carrés. Voici également les pentaminos, composés de 5 carrés :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:polyominos.png]]&lt;br /&gt;
&lt;br /&gt;
Une question récurrente est celle de la pavabilité : peut-on (en utilisant certains types de polyominos) paver un domaine donné.&lt;br /&gt;
Lorsque le domaine est fini, on peut utiliser une recherche exhaustive, mais lorsqu&#039;on veut paver tout le plan, le problème devient indécidable en général.&lt;br /&gt;
Nous nous intéresserons au cas le plus simple : est-il possible de paver le plan tout entier en utilisant des polyominos tous identiques, et en utilisant uniquement des translations.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:pavages.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les définitions et notions de bases des polyominos, et en particulier leur représentation comme mot de contour&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance de polyominos en Python&lt;br /&gt;
*# comprendre la caractérisation des polyominos &amp;quot;exacts&amp;quot;, càd ceux qui pavent le plan&lt;br /&gt;
*# implémenter différents algorithmes de reconnaissance des polyominos exacts en Python&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Bibliographie initiale&lt;br /&gt;
*# [http://www.xprov.org/doc/these-XProvencal.pdf &amp;quot;Combinatoire des mots, géométrie discrète et pavages&amp;quot;], Xavier Provencal (chapitres 1 et 2)&lt;br /&gt;
*# [https://www.lama.univ-smb.fr/pagesmembres/vuillon/IanRAIRO.pdf &amp;quot;An algorithm for deciding if a polyomino tiles the plane by translation&amp;quot;], Ian Gambini et Laurent Vuillon&lt;br /&gt;
&lt;br /&gt;
=== Version algorithmique du lemme local de Lovász  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons un problème standard sur le routage de paquets dans des réseaux. Donnés un réseau et une collection de paquets, chacun venant avec un chemin dans le réseau (de la source vers la destination), le but est d’établir un planning qui minimise le temps pour que tous les paquets atteignent leur destination. Il est naturel de mesurer la qualité d’un tel planning en fonction de deux paramètres : la congestion c qui est le nombre maximum de paquets qui doivent emprunter une même arête du réseau et la dilatation d qui est le nombre maximum d’arêtes d’un chemin. En effet, il est facile de trouver un planning en temps c*d, et tout planning doit prendre comme temps au moins max(c,d). &lt;br /&gt;
&lt;br /&gt;
En 1994, Leighton, Maggsand et Rao ont montré qu’il existait toujours un planning en temps O(c+d). Malheureusement, ce résultat est basé sur le lemme local de Lovász. Il s’agit d’un résultat classique de combinatoire dont la preuve était à l’époque non constructive. Le problème précédent du routage de paquets n’est qu’une application de ce lemme parmi tant d’autres. En 2010, Moser et Tardos donnèrent un algorithme (en plus assez simple et efficace) pour le lemme local de Lovász.&lt;br /&gt;
&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# Comprendre le lemme local de Lovász et certaines de ses applications&lt;br /&gt;
*# Coder la version algorithmique de Moser et Tardos&lt;br /&gt;
*# Coder des applications du lemme (comme par exemple le routage de paquets)&lt;br /&gt;
* Bibliographie initiale : &lt;br /&gt;
*# [https://en.wikipedia.org/wiki/Algorithmic_Lov%C3%A1sz_local_lemma Page wikipedia de la version algorithmique du lemme local de Lovász]&lt;br /&gt;
*# [http://www.scs.cmu.edu/afs/cs.cmu.edu/project/phrensy/pub/papers/LeightonMR94.pdf Application aux routage de paquets par Leighton, Maagsand et Rao]&lt;br /&gt;
*# [https://arxiv.org/pdf/0903.0544.pdf La version algorithmique du lemme local de Lovász par Moser et Tardos]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* Crypto-système de Merkle-Hellman et algorithme de Shamir, Ewan Rakotoanosy (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Reconstruction de surfaces à partir de nuages de points et de normales, Yohan Thépaut (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Algorithmes de super-résolution par apprentissage, Romain Théodet (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Autour de la question de la sensibilité des fonctions Booléennes, Christophe Carmagnac (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Structures de données purement fonctionnelles]], Loïc Dornel (Tuteur : Tom Hirschowitz)&lt;br /&gt;
* Automates cellulaires et décidabilité, Lucas Chardonnet (Tuteur : François Boussion)&lt;br /&gt;
&lt;br /&gt;
== sujets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
=== Crypto-système de Merkle-Hellman et algorithme de Shamir ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : Le système de Merkle-Hellman est un système cryptographique de type &amp;quot;clé publique / clé privée&amp;quot;. Il a été inventé juste en 1978, après le système RSA (encore utilisé). Ce système a l&#039;avantage d&#039;être un peu plus simple, mais le **gros** désavantage d&#039;avoir été craqué par A. Shamir en 1984. L&#039;objectif est de comprendre le système, et la faille qu&#039;il contenait. Cela permettra de comprendre l&#039;algorithme de Shamir...&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
*# Shamir, Adi (1984). &amp;quot;A polynomial-time algorithm for breaking the  basic Merkle - Hellman cryptosystem&amp;quot;. IEEE Transactions on Information  Theory. 30 (5): 699–704. doi:10.1109/SFCS.1982.5 [[http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.123.5840&amp;amp;rep=rep1&amp;amp;type=pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Reconstruction de surfaces à partir de nuages de points et de normales ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : Les lasers d&#039;acquisition de données 3d permettent de fabriquer des données qui approchent le bord d&#039;un objet 3D. Ces données sont souvent sous la forme d&#039;un nuage de points, doublé d&#039;un vecteur associé à chaque point et qui indique la direction normale à la surface de l&#039;objet. On parle de données de Hermite. Il existe des algorithmes dédiés, très efficaces et robustes, pour reconstruire une surface qui passe par ces points. L&#039;objectif est de comprendre les deux principales méthodes, l&#039;une appelée reconstruction de Poisson, l&#039;autre relié à la notion d&#039;indice (ou winding number), leurs qualités et leur défaut.&lt;br /&gt;
* Bibliographie initiale:&lt;br /&gt;
** KAZHDAN, Michael, BOLITHO, Matthew, et HOPPE, Hugues. Poisson surface reconstruction. In : Proceedings of the fourth Eurographics symposium on Geometry processing. 2006 [[http://faculty.cs.tamu.edu/schaefer/teaching/689_Fall2006/poissonrecon.pdf PDF]]&lt;br /&gt;
** BARILL, Gavin, DICKSON, Neil G., SCHMIDT, Ryan, et al. Fast winding numbers for soups and clouds. ACM Transactions on Graphics (TOG), 2018, vol. 37, no 4, p. 43. [[http://www.dgp.toronto.edu/projects/fast-winding-numbers/fast-winding-numbers-for-soups-and-clouds-siggraph-2018-compressed-barill-et-al.pdf]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes de super-résolution par apprentissage ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé : La super-résolution consiste à, étant donné une image M x N, de fabriquer une image &amp;quot;zoomée&amp;quot; de taille kM x kN, où l&#039;information inventée est &amp;quot;crédible&amp;quot;. Le problème est évidemment mal posé mathématiquement, et du coup on rajoute de l&#039;information a priori : continuité des couleurs, continuité des structures géométriques, modèles probabilistes, moyennes non-locales (auto-similarités), etc. Avec l&#039;avènement du deep learning, des méthodes à base d&#039;apprentissage ont vu le jour. En gros, un réseau de neurones (CNN) apprend sur plein d&#039;images en &amp;quot;dézoomant&amp;quot; les images en entrées (facile, on sous-échantillonne), puis on utilise la fonction construite pour faire la super-résolution.&lt;br /&gt;
* L&#039;objectif est de regarder les méthodes de super-résolution, notamment celles par apprentissage et de voir leurs qualités et défauts. On pourra aussi les comparer avec des méthodes purement géométriques de super-résolution, ou des méthodes de moyennes non-locales.&lt;br /&gt;
* Ce sujet a été discuté avec Romain Théodet et conduit à un stage au LAMA pour combiner méthode géométrique et méthode par deep learning pour la super-résolution.&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** SHI, Wenzhe, CABALLERO, Jose, HUSZÁR, Ferenc, et al. Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network. In : Proceedings of the IEEE conference on computer vision and pattern recognition. 2016. p. 1874-1883 [[https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Shi_Real-Time_Single_Image_CVPR_2016_paper.pdf PDF]]?&lt;br /&gt;
** Lachaud, J.-O. and Kerautret, B., Geometric Total Variation for image vectorization, zooming and pixel art depixelizing, In : Proceedings of 5th Asian Conference on Pattern Recognition, 2019 [[Fichier:Paper-GTV.pdf]]&lt;br /&gt;
** [[https://github.com/kerautret/GTVimageVect Démos en ligne d&#039;algorithmes de super-résolution]]&lt;br /&gt;
&lt;br /&gt;
=== Autour de la question de la sensibilité des fonctions Booléennes ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : On souhaite s’intéresser aux problèmes résolus par des algorithmes qui répondent par Vrai/Faux. Ces problèmes ont des entrées dans {0,1}^n (entrées codées en binaire) et une sortie dans {0,1) (Vrai ou Faux). Il est donc naturel de s’intéresser aux propriétés de ces fonctions Booléennes. Un certain nombre de paramètres intéressants ont été identifiés, comme la complexité du certificat (nombre minimal de bits nécessaires pour connaître la valeur de sortie), le degré (degré d’un polynôme qui correspond à la fonction sur les entrées Booléennes), la sensibilité (lnombre de bits qui, s’ils sont modifiés, impliquent une modification de la sortie), et bien d’autres (taille d’un arbre de décision, complexité en requêtes classiques ou quantiques, taille des coefficients de Fourier,…). En 1992, Nisan et Szegedy ont montré que tous ces paramètres sont reliés entre eux : si on connait l’un d’eux, par exemple le degré, on sait alors que n’importe quel autre de ces paramètres, par exemple la taille de l’arbre de décision, est limité à un certain intervalle de valeurs. Tous, sauf un : la sensibilité. Aucune méthode de preuve semblait impliquer que ce paramètre ne pouvait pas être beaucoup plus petit que les autres. Nisan et Szegedy posèrent alors la question de savoir si la sensibilité d’une fonction Bolléenne était reliée ou non aux autres paramètres classiques.&lt;br /&gt;
* Cet été, en 2019, un chercheur, Hao Huang, a montré dans une preuve de deux pages que la sensibilité ne pouvait pas être significativement plus petite que les autres paramètres, résolvant le problème posé 27 ans auparavant. Cette &amp;quot;sensitivity&amp;quot; conjecture a été attaquée en vain par de nombreux chercheurs renommés. Or, la nouvelle preuve est si simple qu’un chercheur l’a résumé en un [[https://twitter.com/BooleanAnalysis/status/1145837576487612416 tweet]].&lt;br /&gt;
* L&#039;objectif est de comprendre quels sont les paramètres classiques des fonctions Booléennes et des liens entre eux avant de s&#039;intéresser à la preuve de la conjecture. On pourra essayer de construire des fonctions extrémales (ie, avec des paramètres extrémaux dans leur plage de valeurs).&lt;br /&gt;
* Bibliographie initiale :&lt;br /&gt;
** Le papier original où la question a été posée : N. Nisan, M. Szegedy. [[https://www.researchgate.net/profile/Mario_Szegedy/publication/2508255_On_the_Degree_of_Boolean_Functions_as_Real_Polynomials/links/09e41514878e7ef890000000.pdf On the degree of Boolean functions as real polynomials.]] Comput. Complexity, 4 (1992), 462–467.&lt;br /&gt;
** Une référence sur l&#039;analyse des fonctions Booléennes : Ryan O’Donnell. [[http://www.cs.tau.ac.il/~amnon/Classes/2016-PRG/Analysis-Of-Boolean-Functions.pdf Analysis of Boolean Functions]], Cambridge University Press, 2014  &lt;br /&gt;
** La preuve de la conjecture : Hao Huang. [[https://arxiv.org/abs/1907.00847 Induced subgraphs of hypercubes and a proof of the Sensitivity Conjecture]]. Annals of Mathematics, 190 (2019), 949-955&lt;br /&gt;
&lt;br /&gt;
=== Structures de données purement fonctionnelles ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;algorithmique est souvent enseignée sur des langages principalement impératifs tels que C. Les structures de données utilisées ne sont pas toujours évidentes à traduire vers les langages fonctionnels tels que OCaml. L&#039;étudiant s&#039;initiera aux structures de données fonctionnelles et aux concepts liés tels que la persistence, en suivant le livre « Purely functional data structures » d&#039;Okasaki.&lt;br /&gt;
* Liens&lt;br /&gt;
** [[https://www.cs.cmu.edu/~rwh/theses/okasaki.pdf La thèse d&#039;Okasaki (PDF)]]&lt;br /&gt;
&lt;br /&gt;
=== Automates cellulaires et décidabilité ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : François Boussion&lt;br /&gt;
* Résumé : Un automate cellulaire est un modèle de calcul discret, utilisé en dans différentes sciences (informatique, mathématiques, physique, biologie, etc;). Le jeu de la vie est l&#039;exemple emblématique d&#039;automate cellulaire. Les règles de calcul d&#039;un automate cellulaire, et de son évolution au cours du temps sont assez simples, mais mènent cependant à des problèmes complexes dont certains indécidables. Par exemple, déterminer si, étant donné des règles, on arrivera forcément, en un nombre fini d&#039;étapes, dans une configuration donné, quelque soit la configuration initiale (problème de nilopotence).&lt;br /&gt;
* L&#039;objectif est de s&#039;intéresser à ces problèmes indécidables dans les automates cellulaires et de produire un mini-cours sur le sujet.&lt;br /&gt;
* Références &lt;br /&gt;
** K. JARKKO, The nilpotency problem of one-dimensional cellular automata, SIAM J. Comput., Vol. 21, No. 3, pp. 571-586, June 1992.&lt;br /&gt;
** K. CULIK II, J. PACHL, S. Yu, On the limit sets ofcellular automata, SIAM J. Comput., 18 (1989), pp.831-842.&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le &amp;lt;b&amp;gt;lundi 27 mai&amp;lt;/b&amp;gt; de 9h à 11h en salle 115 du chablais.&lt;br /&gt;
Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Tristan_Porteries Tristan Porteries (PDF)]: problèmes avec mémoire restreinte, tuteur S. Tavenas&lt;br /&gt;
* R. Wagner: Reconstruction de surfaces à partir de nuages de points, tuteur J.-O. Lachaud&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Nils_Ruet Nils Ruet (PDF)]: LISP, tuteur P. Hyvernat&lt;br /&gt;
* [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Remy_Bouvier Rémy Bouvier (PDF)]: dancing links, tuteur P. Hyvernat&lt;br /&gt;
&lt;br /&gt;
== sujets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
Les sujets 1-3 sont encadrés par J.-O. Lachaud, les sujets 4-5 par P. Hyvernat, le sujet 6 par S. Tavenas.&lt;br /&gt;
Un encadrant encadre au max 2 étudiants.&lt;br /&gt;
&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;br /&gt;
# Une question naturelle est de savoir quels sont les problèmes qui peuvent être résolus avec un espace mémoire restreint. Plus formellement, on notera L l&#039;ensemble des problèmes que l&#039;on peut résoudre en utilisant seulement un espace mémoire logarithmique. On s&#039;intéresse à cette classe de problèmes, et plus particulièrement aux problèmes de connectivité dans un graphe.&lt;br /&gt;
#* [https://www.irif.fr/~sperifel/complexite.pdf Sylvain Périfel Complexité algorithmique] : Un livre récent qui survole une grosse partie de la complexité algorithmique. Le chapitre 4 concerne la complexité en espace.&lt;br /&gt;
#* [https://omereingold.files.wordpress.com/2014/10/sl.pdf Omer Reingold Undirected Connectivity in Log-Space]&lt;br /&gt;
&lt;br /&gt;
== travaux réalisés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
Les exposés auront lieu le vendredi 25 mai 2018, à 9h. Prévoyez 15-20min suivi de questions.&lt;br /&gt;
&lt;br /&gt;
* ray-tracing au path-tracing, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Raphael_Tournafond.pdf Raphael Tournafond (PDF)]&lt;br /&gt;
* &amp;quot;dancing links&amp;quot; et NP complétude, [http://www.lama.univ-savoie.fr/~lachaud/Cours/VISI401/VISI401_Ambroise_Decouttere.pdf Ambroise Decouttere (PDF)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== sujets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
# Du ray-tracing au path-tracing: il s&#039;agit de comprendre l&#039;évolution des algorithmes de rendu (dits &amp;quot;réalistes&amp;quot;) et de mettre en avant les principales évolutions.&lt;br /&gt;
#* An introduction to ray tracing AS Glassner - 1989 - books.google.com&lt;br /&gt;
#* Energy redistribution path tracing, D Cline, J Talbot, P Egbert - ACM Transactions on Graphics (TOG), 2005 - dl.acm.org&lt;br /&gt;
#* et pour une introduction douce au ray-tracing: TP2 de http://www.lama.univ-savoie.fr/~lachaud/Cours/INFO805/Tests/html/index.html&lt;br /&gt;
# Débruitage de surfaces maillées (mesh denoising): Etant donné une surface triangulées, dont la position des sommets est &amp;quot;bruité&amp;quot; (en général par les moyens d&#039;acquisitions utilisés pour la fabriquer), ces algorithmes tentent de retrouver la surface initiale, en supposant par exemple qu&#039;elle était lisse ou lisse par morceaux.&lt;br /&gt;
#* Bilateral mesh denoising, S Fleishman, I Drori, D Cohen-Or - ACM transactions on graphics (TOG), 2003 - dl.acm.org&lt;br /&gt;
#* Mesh denoising via L0 minimization, L He, S Schaefer - ACM Transactions on Graphics (TOG), 2013 - dl.acm.org&lt;br /&gt;
#* Variational mesh denoising using total variation and piecewise constant function space, H Zhang, C Wu, J Zhang, J Deng - IEEE transactions on …, 2015 - ieeexplore.ieee.org&lt;br /&gt;
# Approximation de formes: il s&#039;agit de fabriquer, à partir d&#039;une surface maillée précise, une nouvelle surface composée de beaucoup moins de sommets qui l&#039;approche et qui conserve ses caractéristiques principales. Cela sert aussi en compression de formes.&lt;br /&gt;
#* Progressive meshes, H Hoppe - Proceedings of the 23rd annual conference on SIGGRAPH, 1996 - dl.acm.org&lt;br /&gt;
#* Variational shape approximation, D Cohen-Steiner, P Alliez, M Desbrun - ACM Transactions on Graphics …, 2004 - dl.acm.org&lt;br /&gt;
# Reconstruction de surfaces à partir de nuages de points: il s&#039;agit de trouver comment fabriquer une surface qui approche un ensemble de points dans l&#039;espace.&lt;br /&gt;
#* Delaunay triangulation based surface reconstruction.F Cazals, J Giesen - Effective computational geometry for curves and …, 2006 - Springer&lt;br /&gt;
#* State of the art in surface reconstruction from point clouds, M Berger, A Tagliasacchi, L Seversky, P Alliez… - EUROGRAPHICS star …, 2014 - hal.inria.fr&lt;br /&gt;
#* Bayesian point cloud reconstruction, P Jenke, M Wand, M Bokeloh… - Computer Graphics …, 2006 - Wiley Online Library&lt;br /&gt;
# &amp;quot;dancing links&amp;quot; et NP complétude : l&#039;algorithme X de Knuth est un algorithme élégant et &amp;quot;efficace&amp;quot; pour chercher une solution au problème combinatoire de la [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte]. Cet algorithme peut s&#039;appliquer à des problèmes aussi divers que la résolution de sudoku ou le pavage par polyominos. Ce problème fait partie de la classe des problèmes NP-complets qui sont intrinsequement difficiles&lt;br /&gt;
#* [https://arxiv.org/abs/cs/0011047 &amp;quot;Dancing links&amp;quot;] : description de l&#039;algorithme X de Knuth et de quelques applications &#039;&#039;Millennial Perspectives in Computer Science : Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare, Palgrave, coll. « Cornerstones of Computing », 2000&#039;&#039;&lt;br /&gt;
#* [https://arxiv.org/pdf/1203.1895.pdf Classic Nintendo Games are (Computationally) Hard] : preuve que Super Mario et d&#039;autres jeux video classiques sont NP-complets &#039;&#039;Theoretical Computer Science, volume 586, 2015, pages 135–160.&#039;&#039;&lt;br /&gt;
# Le langage LISP est un des plus vieux langages de programmation encore (un peu) utilisé. (LISP: 1958, C: 1972, Python: 1989). Il s&#039;agit d&#039;un langage fonctionnel avec une syntaxe très simple. La programmation fonctionnelle s&#039;est ensuite developpé dans plusieurs directions, notamment avec la notion de typage fort (Hindley-Milner) utilisé par les langages de la famille ML (SML, Caml)&lt;br /&gt;
#* [http://jmc.stanford.edu/articles/recursive/recursive.pdf John McCarthy Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I] description du langage LISP&lt;br /&gt;
#* [https://www.research.ed.ac.uk/portal/en/publications/a-theory-of-type-polymorphism-in-programming(d16745d7-f113-44f0-a7a3-687c2b709f66).html Robin Milner, A Theory of Type Polymorphism in Programming] : description de l&#039;algorithme de typage d&#039;un langage fonctionnel&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15089</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=15089"/>
		<updated>2024-01-15T12:43:37Z</updated>

		<summary type="html">&lt;p&gt;Wiki-lama : /* Planarité de graphes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2023--2024: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable 2016--2023 : Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (environ 5 par an). [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/CMI_html/news Planning séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé, et du code si le sujet s&#039;y prête.&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2023-2024) =&lt;br /&gt;
&lt;br /&gt;
== Calcul approché de l&#039;élément majoritaire, et autres algorithmes approchés ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; en informatique, il est parfois préférable d&#039;accepter un résultat &amp;quot;pas complètement correct&amp;quot;, si cela permet d&#039;être plus rapide. Un des premiers problèmes de ce genre est le problème du voyageur de commerce : aucune méthode efficace pour calculer le meilleur trajet n&#039;est connue, mais sous certaines conditions, il existe une méthode efficace qui donne un résultat &amp;quot;pas trop éloigné de l&#039;optimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un autre exemple est celui de la recherche de l&#039;élément majoritaire : c&#039;est l&#039;élément qui apparait le plus souvent dans une liste. Ici, il est facile d&#039;écrire une fonction qui le calcule exactement, mais dans le cas du &amp;quot;big data&amp;quot; qui évolue constamment, la méthode naïve prend trop de temps, et trop de mémoire. En 2005, A. Metwally, D. Agrawal et A. El Abbadi on décrit une méthode approchée pour ce problème. Le programme correspondant est beaucoup plus rapide que la méthode naïve et n&#039;a besoin que d&#039;une quantité de mémoire bornée. Le résultat n&#039;est pas toujours le bon, mais l&#039;erreur faite est connue.&lt;br /&gt;
&lt;br /&gt;
Ce qui est surprenant dans cette méthode est qu&#039;elle semble fausse à première lecture !&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; comprendre la méthode générale en lisant l&#039;article de A. Metwally, D. Agrawal et A. El Abbadi, et l&#039;implémenter en Python (ou un autre langage). Pour valider la méthode, il serait intéressant de voir si cette méthode approchée peut être plus rapide qu&#039;un générateur aléatoire adéquat de valeurs sur lequel on la brancherait.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;  Ahmed Metwally, Divyakant Agrawal et Amr El Abbadi, &#039;&#039;Efficient Computation of Frequent and Top-k Elements in Data Streams&#039;&#039;, https://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf&lt;br /&gt;
&lt;br /&gt;
== Surfaces polygonales et surfaces de subdivision ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les surfaces polygonales, et notamment les surfaces triangulées ou quadrangulées, sont la brique de base des modèles géométriques 3D, utilisés par exemple dans tous les jeux vidéos 3D, les effets spéciaux pour les films, ou la conception et fabrication assistée par ordinateur. Parfois ces surfaces ont une géométrie un peu trop facettée. Les processus de subdivision de surface permettent de raffiner progressivement une surface polygonale (en subdivisant les faces et en replaçant les sommets) de manière à obtenir une surface de plus en plus lisse. D&#039;ailleurs on peut montrer que la surface limite est bien est une surface lisse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s1.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s2.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s3.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[File:Suzanne-s4.png|200px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Surface polygonale&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;1 subdivision&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;2 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;3 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;4 subdivisions&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Il s&#039;agira de comprendre comment représenter une surface polygonale en mémoire (pour l&#039;affichage on utilisera polycope, une bibliothèque python), comment charger une surface à partir d&#039;un format simple (wavefront OBJ). Ensuite on étudiera plus particulièrement les surfaces de subdivision dite Catmull-Clark, que l&#039;on implémentera. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface Catmull-Clark subdivision]&lt;br /&gt;
* On utilisera [https://polyscope.run/py/ Polyscope] pour visualiser les surfaces en 3D avec python.&lt;br /&gt;
* Un [https://codimd.math.cnrs.fr/s/TmrOWEmyJ tutorial] pour créer/charger les surfaces polygonales en python et polyscope. &lt;br /&gt;
* [https://www.blender.org Blender] un logiciel open-source pour créer des modèles 3D et calculer des rendus par lancer de rayons.&lt;br /&gt;
&lt;br /&gt;
== Calcul des valeurs de Grundy pour des jeux octaux ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Les jeux combinatoires impartiaux sont des jeux à deux joueurs, à informations parfaites (pas de hasard ni d&#039;information cachée) et dans lesquels dans chaque position les joueurs disposent toujours du même ensemble de coups l&#039;un que l&#039;autre. Par exemple les échecs ne rentrent pas dans cette catégorie car si c&#039;est aux blancs de jouer, ils ne peuvent bouger que les pièces blanches tandis que si c&#039;est au noirs de jouer, ils ne peuvent jouer que les pièces noires. Les ensembles de coups possibles ne sont pas les mêmes.&lt;br /&gt;
Dans l&#039;étude de ces jeux, la question qu&#039;on se pose est de savoir quel joueur gagnerait si les deux joueurs jouaient parfaitement. Un outil pratique dans la résolution de cette question est la notion de valeur de Grundy d&#039;un jeu. En effet, si on connait la valeur de Grundy d&#039;un jeu J1 et d&#039;un jeu J2 alors on sait quel joueur gagne si on joue en même temps sur J1 et sur J2.&lt;br /&gt;
Les jeux octaux forment une sous-classe des jeux combinatoires impartiaux qui contient des jeux proches du célèbre jeu de Nim et, en particulier, le &amp;quot;jeu de Fort Boyard&amp;quot; fait partie de cette catégorie.&lt;br /&gt;
Dans ce sujet on se propose de calculer la valeur de Grundy pour des jeux octaux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039; Comprendre ce qu&#039;est la valeur de Grundy d&#039;un jeu et calculer la valeur de Grundy de plusieurs jeux octaux. On pourra ensuite écrire un programme générique qui trouve la valeur de Grundy de jeux octaux sous forme générique, voire même prouver la périodicité des valeurs de Grundy de certains jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Jeu_octal&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cryptanalyse informatique de quelques systèmes de chiffrement &amp;quot;historiques&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; pendant longtemps, &amp;quot;craquer&amp;quot; les systèmes de chiffrement (&amp;quot;codes secrets&amp;quot;) se faisait essentiellement à la main, et les outils informatiques ont rendu la plupart des systèmes historiques obsolète. Pourtant, sauf dans quelques cas particuliers, l&#039;ordinateur ne peut pas casser un code simplement en testant toutes les possibilités. Il faut trouver une méthode plus efficace.&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif sera d&#039;étudier et d&#039;implémenter quelques uns de ces systèmes simples :&lt;br /&gt;
* chiffrement,&lt;br /&gt;
* déchiffrement,&lt;br /&gt;
* décryptage (càd déchiffrement sans utiliser la clé secrète).&lt;br /&gt;
&lt;br /&gt;
Les systèmes de chiffrement considérés seront&lt;br /&gt;
* substitutions monoalphabétiques, décryptées en utilisant la méthode &amp;quot;aléatoire&amp;quot; du [https://fr.wikipedia.org/wiki/M%C3%A9thode_hill-climbing &amp;quot;hill-climbing&amp;quot;],&lt;br /&gt;
* le [https://en.wikipedia.org/wiki/Straddling_checkerboard &amp;quot;straddling checkerboard&amp;quot;], décrypté par recherche exhaustive sur les positions des &amp;quot;blancs&amp;quot; dans la clé, et en le transformant en substitutions monoalphabétique,&lt;br /&gt;
* le [https://fr.wikipedia.org/wiki/Chiffre_de_Hill code de Hill], décrypté en utilisant un mot probable, ou la conjonction d&#039;une recherche exhaustive sur les lignes de la clé suivie des tests exhaustifs de toutes leurs permutations.&lt;br /&gt;
&lt;br /&gt;
Suivant le temps et l&#039;intérêt, on pourra soit regarder d&#039;autres systèmes de chiffrement, soit essayer d&#039;améliorer l&#039;analyse du chiffre de Hill en combinant la seconde méthode avec la méthode du Hill-climbing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* [https://pierre-hyvernat.apps.math.cnrs.fr/data/Enseignement/1920/info910/tp1.html Parties 1 et 2 d&#039;un TP de cryptographie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implémentation d&#039;une IA pour le jeu Puissance 4 à l&#039;aide de l&#039;algorithme alpha-beta ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Valentin Gledel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Le jeu Puissance 4 est un jeu bien connu dans lequel deux &lt;br /&gt;
joueurs placent alternativement des jetons dans une grille 7 par 6. Le &lt;br /&gt;
premier joueur qui réussit à aligner 4 jetons gagne la partie.&lt;br /&gt;
La simplicité des règles du jeu et le nombre restreint de coups &lt;br /&gt;
possibles à chaque moment de la partie font de ce jeu un bon candidat &lt;br /&gt;
pour implémenter les algorithmes de jeux minimax et alpha-beta. Ces &lt;br /&gt;
algorithmes effectuent une recherche jusqu&#039;à une certaine profondeur &lt;br /&gt;
dans l&#039;arbre des coups possibles. Ils évaluent ensuite les positions à &lt;br /&gt;
la profondeur choisie à partir d&#039;une &amp;quot;mesure&amp;quot; choisie par le &lt;br /&gt;
programmeur. Puis, ils choisissent un coup à jouer en fonction de la &lt;br /&gt;
position donnant le meilleur résultat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Implémenter le jeu Puissance 4, trouver des mesures pour &lt;br /&gt;
évaluer des positions de ce jeu, implémenter l&#039;algorithme minimax et &lt;br /&gt;
l&#039;algorithme alpha-beta, comparer les résultats de ces algorithmes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039;&lt;br /&gt;
* https://fr.wikipedia.org/wiki/Algorithme_minimax &lt;br /&gt;
* https://fr.wikipedia.org/wiki/%C3%89lagage_alpha-b%C3%AAta&lt;br /&gt;
&lt;br /&gt;
== Modélisation de la ruine du joueur ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Céline Labart&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
&#039;&#039;&#039;Objectifs :&#039;&#039;&#039;&lt;br /&gt;
* Simulation d&#039;une partie&lt;br /&gt;
* Calcul de la probabilité de gagner&lt;br /&gt;
* Calcul du temps moyen de jeu&lt;br /&gt;
* Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
&#039;&#039;&#039;Références :&#039;&#039;&#039; &lt;br /&gt;
* Lien pour commencer : [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Planarité de graphes ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuteur :&#039;&#039;&#039; Sébastien Tavenas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Résumé :&#039;&#039;&#039; Un graphe est dit planaire si on peut le &amp;quot;dessiner&amp;quot; dans le plan de façon à ce que les arêtes ne se croisent pas. Donné un graphe, est-il facile de tester s’il est planaire ? Pour commencer, il est facile de certifier qu’un graphe est planaire en donnant le &amp;quot;dessin&amp;quot; du graphe dans le plan. Mais comment montrer qu’un graphe n’est pas planaire ? Kuratowski a montré qu’un graphe n’est pas planaire si et seulement si il contient un mineur (ie, un sous-graphe) qui est K5 (le graphe complet avec 5 sommets) ou K3,3 (le graphe biparti complet avec chaque partie ayant 3 sommets). Ainsi, pour montrer qu’un graphe n’est pas planaire, il suffit de montrer une subdivision qui est K5 ou K3,3. Il semble alors possible de trouver un algorithme qui donné un graphe, soit retourne un &amp;quot;dessin&amp;quot; du graphe planaire dans le plan, soit trouve une subdivision K5 ou K3,3 garantissant que le graphe n’est pas planaire.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Objectif :&#039;&#039;&#039; Comprendre la notion de graphe planaire et le théorème de Kuratowski. Coder un programme de détection de planarité (plusieurs algorithmes linéaires existent pour ce problème).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Référence :&#039;&#039;&#039;&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Graphe_planaire Wikipédia - Graphe planaire]&lt;br /&gt;
&lt;br /&gt;
= Archive des sujets réalisés =&lt;br /&gt;
&lt;br /&gt;
== Projets 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* [[media:Mcmanus-2023.pdf|Programmation du robot NAO]] par Ronan MCMANUS (Tuteur : Christophe CARMAGNAC)&lt;br /&gt;
* [[media:Cusumano-2023.pdf|Vision en relief, anaglyphes et auto-stéréogrammes à partir d&#039;images RGB+profondeur]] par Lilian CUSUMANO (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* Tables de hachage et dictionnaires par Morgane FAREZ (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Réductions de problèmes par Solène BELISSARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka par Franz-Maximilien CERON (Tuteur : David TELISSON)&lt;br /&gt;
* [[media:Kant-aliagas-2023.pdf|Recherche de chemin en temps réel par A*]] par Cassandre KANT-ALIAGAS (Tuteur : Lucas CHARDONNET)&lt;br /&gt;
* [[media:Gossin-2023.pdf|Rendu rapide de scènes 3D]] par Cassiopée GOSSIN (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
* [[media:Moiroud-2023.pdf|Détection de droites dans les images avec la transformée de Hough]] par Elliott MOIROUD (Tuteur : Stéphane BREUILS)&lt;br /&gt;
* [[media:Rexhepi-2023.pdf|Stratégies mixtes et programmation linéaire par Ilirian REXHEPI]] (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[media:Rey-2023.pdf|Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Lukas REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
== Projets 2021-2022 ==&lt;br /&gt;
* [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] par Mila DESMET (Tuteur : David TELISSON)&lt;br /&gt;
* [[Machines de Turing]] par Emeline CHOLLET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] par Joris DUBOIS (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] par Mathys AUBERT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Les &amp;quot;claviers&amp;quot;]] par Amélie HACQUE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Fractales de Newton et sensibilité aux conditions initiales]] par Paul SCHULTZ (Tuteur: Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Approximation numérique de calculs intégraux]] par Enzo MAUTI (Tuteur : Dionysos GRAPSAS)&lt;br /&gt;
* [[Instant Insanity]] par Numa Ciribino (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Automates cellulaires]] par Mattéo LUQUE (Tuteur : Gérald CAVALLINI et  Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Simulation de fluides]] par Maxime ROUSSEAU (Tuteur : Colin WEILL-DUFLOS)&lt;br /&gt;
&lt;br /&gt;
== Projets 2020-2021 ==&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette] par Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]] par Paul AUBRY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs] par Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales] par Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]] par Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] par Nolann SANMARTI (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]] par Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur] par Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
== Projets 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler] par Simon LEONARD (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking] par Simon PICHENOT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)] par Florian DUFAURE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération fractale de terrains]] par Hugo REY (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services] par Romain NEGRO (David TELISSON)&lt;br /&gt;
* [[Apprentissage automatique]] par Evan L&#039;HUISSIER (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]] par Juliette NEYRAT (Tuteur : Sébastien TAVENAS)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]] par Romain PAJEAN (Gérald CAVALLINI)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]] par Théo GUESDON (Tuteur : Jimmy GARNIER)&lt;br /&gt;
&lt;br /&gt;
== Projets 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] par Lucas CHARDONNET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] par Romain THEODET (Tuteur : François BOUSSION)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] par Ewan RAKOTOANOSY (Tuteur : David TELISSON)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] par Yohann THEPAUT (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] par Loïc DORNET (Tuteur : Tom HIRSCHOWITZ)&lt;br /&gt;
* [[Dilemme du prisonnier]] par Christophe CARMAGNAC (Tuteur : Gérald CAVALLINI)&lt;br /&gt;
&lt;br /&gt;
== Projets 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]] par Tristan PORTERIES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] par Nils RUET (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] par Rémi BOUVIER (Tuteur : Laurent VUILLON)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] par Robin WAGNER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Pavages de Penrose]] par Brunelle CORDIER-PIERRE-BES (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Projets 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]] par Raphaël TOURNAFOND (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Traitement d&#039;image]] par Ambroise DECOUTTERE (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]] par Luca CHAPELLE (Tuteur : Pierre HYVERNAT)&lt;br /&gt;
* [[Calculabilité et modèles de calcul]] par Thibaut CHAMINADE (Tuteur : Rodolphe LEPIGRE)&lt;br /&gt;
* [[Génération et résolution de labyrinthes]] par Candice ROBERT (Tuteur : Xavier PROVENCAL)&lt;br /&gt;
&lt;br /&gt;
= Archive des projets proposés =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2022-2023 ==&lt;br /&gt;
&lt;br /&gt;
* Programmation du robot Nao&lt;br /&gt;
* Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur&lt;br /&gt;
* Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur&lt;br /&gt;
* Tables de hachage et dictionnaires&lt;br /&gt;
* Réductions de problèmes&lt;br /&gt;
* Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka&lt;br /&gt;
* [[Recherche de chemin en temps réel par A* ]]&lt;br /&gt;
* Rendu rapide de scènes 3D&lt;br /&gt;
* Détection de droites dans les images avec la transformée de Hough&lt;br /&gt;
* Stratégies mixtes et programmation linéaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation du robot Nao ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Christophe Carmagnac&lt;br /&gt;
* Résumé : Nao est un robot programmable. Il dispose d&#039;une API qui permet de le controler à distance. Il possède divers capteurs qui remontent des données en temps réel. Nao est donc une base intéressante pour faire des projets axés sur la robotique sans avoir à se soucier des contraintes électroniques. Dans ce projet, on cherchera à créer des programmes permettant à Nao d&#039;analyser et d&#039;intéragir avec son environnement.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter un algorithme permettant à Nao de se déplacer&lt;br /&gt;
*# Reconnaître différents objets tels qu&#039;une tasse de café en utilisant Python&lt;br /&gt;
*# Faire en sorte que Nao prenne un objet&lt;br /&gt;
*# Créer un programme permettant de déplacer un objet de manière autonome&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://www.aldebaran.com/fr/nao Présentation de Nao]&lt;br /&gt;
** [http://doc.aldebaran.com/2-8/index_dev_guide.html Documentation de l&#039;API de Nao] (seulement disponible en http)&lt;br /&gt;
&lt;br /&gt;
=== [[ Vision en relief, anaglyphes à partir d&#039;images RGB+profondeur ]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. A moins d&#039;avoir des dispositifs particuliers, le procédé le plus simple pour construire et visualiser une image en relief est l&#039;anaglyphe, c&#039;est-à-dire construire une seule image mélangeant les 2 vues, la vue gauche en rouge, la vue droite en cyan, et d&#039;utiliser de simples lunettes colorées rouge-cyan. Nous allons construire de tels anaglyphes, mais à partir d&#039;images couleurs (RGB) qui ont aussi une profondeur par pixel. Ces images sont devenues très courantes avec la Kinect de la Xbox. On verra que l&#039;on peut ainsi donner une impression de relief, mais que ces images ont aussi des défauts.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé anaglyphe et la différence de point de vue entre nos deux yeux&lt;br /&gt;
*# Lire les images RGB+Z et fabriquer une image anaglyphe (on utilisera OpenCV avec python)&lt;br /&gt;
*# Faire la même chose en flux video.&lt;br /&gt;
*# Corriger l&#039;entrée en profondeur pour améliorer le rendu.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Anaglyphe Anaglyphe sur wikipedia]&lt;br /&gt;
** [https://paperswithcode.com/datasets?mod=rgb-d Datasets RGB+Z (films)]&lt;br /&gt;
** [https://rgbd-dataset.cs.washington.edu/dataset.html Dataset RGB+Z (formes plus simples)]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; RGB &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Anaglyphe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Rgb.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Anaglyph.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vision en relief, auto-stéréogrammes à partir d&#039;une image de profondeur ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La vision en relief nécessite de construire 2 images d&#039;une scène 3D, une pour l&#039;oeil gauche, l&#039;autre pour l&#039;oeil droit. Nous proposons ici d&#039;étudier une technique qui permet d&#039;avoir une vision en relief à partir d&#039;une seule image ! Le procédé, appelé (auto-)stéréogramme encode l&#039;image pour l&#039;oeil gauche et l&#039;image pour l&#039;oeil droit dans la même image. L&#039;idée est d&#039;utiliser une image qui se répète par bandes verticales régulièrement (genre tous les 60 pixels). Ensuite, c&#039;est l&#039;observateur qui, en faisant converger ses yeux au-delà de l&#039;écran, ne fait pas voir les mêmes bandes à ses yeux. En modifiant légèrement les motifs de répétition, nos 2 yeux ne voient pas la même chose et nous voyons la scène en relief !&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre le procédé stéréogramme&lt;br /&gt;
*# Mettre au point l&#039;algorithme de calcul d&#039;une telle image à partir d&#039;un motif (donné ou généré) et d&#039;une image de profondeur.&lt;br /&gt;
*# On pourra utiliser OpenCV avec python&lt;br /&gt;
*# On peut même faire la même chose avec un flux video d&#039;images de profondeur.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Autostéréogramme Auto-stéréogramme sur wikipedia]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Profondeur &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 1 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Stéréogramme 2 &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; On voit ci-dessous le procédé qui consiste en des décalages de motifs. Malheureusement sous cette forme, notre cerveau a beaucoup de peine à le reconstruire&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-depth.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Stereogram-3.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Tables de hachage et dictionnaires]] ===&lt;br /&gt;
&lt;br /&gt;
* tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : les ordinateur peuvent facilement représenter un tableau de &#039;&#039;n&#039;&#039; cases par une zone de &#039;&#039;n&#039;&#039; cases mémoires consécutives. Le plus simple pour représenter un &#039;&#039;dictionnaire&#039;&#039; (comme un Python) est d&#039;utiliser un tableau où chaque case contient à la fois la clé et la valeur. Ceci est particulièrement inefficace car savoir si une clé est valide (càd apparait dans le dictionnaire) est lent.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# regarder comment implémenter les &#039;&#039;tables de hachage&#039;&#039;. Cette structure permet de représenter les dictionnaire de manière plus efficace,&lt;br /&gt;
*# comprendre comment fonctionnent quelques &#039;&#039;fonctions de hachage&#039;&#039;. Ces fonctions permettent de transformer chaque clé en indice de case d&#039;un tableau standard. Les clés deviennent donc des nombres entiers, et il alors possible de faire des recherche par dichotomie pour accélérer la recherche.&lt;br /&gt;
*# regarder différentes manières de gérer les &#039;&#039;collisions&#039;&#039;, car même avec une fois la fonction de hachage bien choisie, 2 clés différentes peuvent donner le même indice.&lt;br /&gt;
&lt;br /&gt;
* liens utiles :&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Table_de_hachage tables de hachage sur Wikipedia] [https://en.wikipedia.org/wiki/Hash_table (plus complet, mais en anglais)]&lt;br /&gt;
** [https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/ des explications sur les] [https://stackoverflow.com/questions/327311/how-are-pythons-built-in-dictionaries-implemented/9022835#9022835 tables de hachage] [https://stackoverflow.com/questions/56097997/how-does-python-implement-dictionaries/56098068 et les dictionnaires en python]&lt;br /&gt;
&lt;br /&gt;
=== [[Réductions de problèmes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : en complexité algorithmique, le concept de &amp;quot;réduction de problème&amp;quot; est fondamentale. L&#039;idée est simplement de transformer un type de problèmes que l&#039;on souhaite résoudre en un problème que l&#039;on sait résoudre. Le problème &amp;quot;couverture exacte&amp;quot; est le suivant : étant donné un tableau à 2 dimensions de booléens, on cherche une liste de lignes pour mettre &#039;&#039;exactement une valeur &amp;quot;vraie&amp;quot; sur chaque colonne&#039;&#039;. Malgré son apparence abstraite, de nombreux problèmes peuvent être transformés en une instance de &amp;quot;couverture exacte&amp;quot; :&lt;br /&gt;
** les sudokus&lt;br /&gt;
** le recouvrement d&#039;une région par des polyominos&lt;br /&gt;
** le problème des &#039;&#039;n&#039;&#039; reines (&amp;quot;comment placer &#039;&#039;n&#039;&#039; reines sur un échiquier &#039;&#039;n*n&#039;&#039;&amp;quot; sans qu&#039;elles ne s&#039;attaquent)&lt;br /&gt;
** le casse-tête [https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/dominosa.html dominosa]&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre un peu le problème &amp;quot;couverture exacte&amp;quot;&lt;br /&gt;
*# programmer quelques réductions (en python) qui permettront d&#039;utiliser un solveur pour la couverture exacte afin de résoudre d&#039;autres problèmes.&lt;br /&gt;
&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_la_couverture_exacte couverture exacte sur Wikipedia]&lt;br /&gt;
&lt;br /&gt;
=== Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Depuis une dizaine d’années, l’avènement de l’Internet des Objets (IoT) a fait apparaitre de nouvelles problématiques en matière de détection d’anomalies dans un flux de données « temps réel ». En effet, les capteurs disséminés peuvent transmettre des données erronées : dérive de sonde, problème d’alimentation, malveillance, etc. La plupart de ces anomalies sont détectées a posteriori en analysant les données stockées en base. Idéalement, il faudrait détecter ces anomalies dès qu’elles se produisent, avant même d’être insérées en base de données.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*#   Déployer une maquette simple (arduino + capteurs) qui alimente une plateforme de streaming d’événements Kafka et simuler des anomalies (ex : approcher une source de chaleur d&#039;un capteur de température).&lt;br /&gt;
*#   Implémenter l&#039;algorithme isolation forest en Python (librairie Scikit-Learn) dans un consommateur Kafka pour de détecter une donnée anormale en « temps réel »&lt;br /&gt;
* Liens utiles&lt;br /&gt;
** https://kafka.apache.org/documentation/&lt;br /&gt;
** https://kafka-python.readthedocs.io/en/master/&lt;br /&gt;
** https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
&lt;br /&gt;
=== Recherche de chemin en temps réel par A* ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Lucas Chardonnet&lt;br /&gt;
* Résumé : Il existe plusieurs méthodes de recherche de chemin entre un point d&#039;arrivé et un point de départ, qui se basent sur des données représentées par graphe. L&#039;algorithme A* (A étoile ou A star en anglais) permet de trouver un chemin parmi les plus courts entre ces deux points, en temps réel. On propose ici d&#039;implémenter et de visualiser cet algorithme.&lt;br /&gt;
*  Objectifs:&lt;br /&gt;
*# Créer une structure de données pour représenter un graphe.&lt;br /&gt;
*# Implémenter l&#039;algorithme A* en utilisant cette structure.&lt;br /&gt;
*# Visualiser l&#039;algorithme au travers d&#039;une interface graphique.&lt;br /&gt;
* Liens utiles :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Algorithme_A*&lt;br /&gt;
&lt;br /&gt;
=== Rendu rapide de scènes 3D ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé :  On cherche à implémenter des méthodes permettant de faire du rendu de scène 3D. On se base sur la rastérisation de triangles, qui est la méthode employée pour faire du rendu en temps réel (par exemple jeux vidéos). D&#039;autres méthodes existent comme le path tracing, plutôt utilisé dans le rendu différé (pour un film d&#039;animation par exemple). Une implémentation de rastérisation de triangles et de z-buffer (technique de gestion de la profondeur) a déjà été réalisée une année précédente, permettant donc d&#039;afficher des triangles en rendant compte de la profondeur. On cherche à la poursuivre pour afficher une scène illuminée.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre les travaux réalisés autour de la rastérisation et du z-buffer&lt;br /&gt;
*# rajouter une lumière et modifier l&#039;affichage des triangles pour prendre en compte l&#039;illumination&lt;br /&gt;
*# utiliser des textures pour le calcul des couleurs&lt;br /&gt;
*# rajouter des calculs d&#039;ombres à l&#039;aide de shadow maps&lt;br /&gt;
* Pour aller plus loin:&lt;br /&gt;
*# Afficher des modèles 3D&lt;br /&gt;
*# Utiliser une pipeline graphique (type OpenGL) pour faire ces calculs&lt;br /&gt;
*# Contrôles de la caméra&lt;br /&gt;
* Liens:&lt;br /&gt;
** [Travaux réalisés](https://www.lama.univ-savoie.fr/mediawiki/index.php/Algorithme_de_rendu_de_sc%C3%A8ne_3D_par_Z-buffer)&lt;br /&gt;
** [Modèle d&#039;illumination](https://fr.wikipedia.org/wiki/Ombrage_de_Phong)&lt;br /&gt;
&lt;br /&gt;
=== Détection de droites dans les images avec la transformée de Hough ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Stéphane Breuils&lt;br /&gt;
* Résumé : La détection de droites est un sujet vaste en traitement d’images et vision par ordinateur. Le problème est de détecter des droites dans une image. Ces droites font en général plus d’un pixel de large, et sont parfois coupées par d’autres objets de l’image. Ce projet consiste à traiter le problème de la détection de lignes avec une implantation de la transformée de Hough, introduite par Paul Hough.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter la transformée de Hough,&lt;br /&gt;
*# Montrer son intérêt et ses limites sur différentes images,&lt;br /&gt;
*# Appliquer le même principe que Hough pour la détection de cercles et d&#039;ellipses.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Hough](https://fr.wikipedia.org/wiki/Transform%C3%A9e_de_Hough)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stratégies mixtes  et programmation linéaire ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Considérons le jeu à deux joueurs suivant. Chacun des deux joueurs écrivent un nombre entier entre 1 et 10 sur une feuille. Puis ils comparent les deux nombres. Si les deux joueurs ont écrit le même nombre, rien ne se passe. Si les deux nombres se suivent, le joueur ayant inscrit le plus petit donne 5 jetons à l&#039;autre. Dans tous les autres cas, c&#039;est le joueur ayant inscrit le plus grand nombre qui donne 1 jeton à l&#039;autre joueur. Pour la même raison que pour le jeu Pierre-Feuille-Ciseau, jouer tout le temps le même coup ne semble pas optimal. Des stratégies optimales pour ces jeux sont appelées mixtes. En fait, trouver la stratégie optimale d&#039;un tel jeu (plus précisément, d&#039;un jeu à somme nulle) revient à résoudre un problème de programmation linéaire associé.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre les notions de stratégie mixte, de programmation linéaire et leur lien,&lt;br /&gt;
*# En utilisant une librairie de programmation linéaire, écrire un programme qui calcule les stratégies optimales de différents jeux,&lt;br /&gt;
*# Comprendre (et essayer d&#039;implémenter) la méthode du simplexe.&lt;br /&gt;
* Lien pour démarrer&lt;br /&gt;
** [Stratégies mixtes](https://en.wikipedia.org/wiki/Strategy_(game_theory)#Mixed_strategy)&lt;br /&gt;
** [Programmation linéaire] (https://en.wikipedia.org/wiki/Linear_programming)&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2021-2022 == &lt;br /&gt;
&lt;br /&gt;
* Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0 &lt;br /&gt;
* Machines de Turing&lt;br /&gt;
* Géométrie discrète, Convexité des polyominos, Combinatoire des mots&lt;br /&gt;
* Origami, axiomes de Huzita/Justin et ReferenceFinder&lt;br /&gt;
* Les &amp;quot;claviers&amp;quot;&lt;br /&gt;
* Fractales de Newton et sensibilité aux conditions initiales&lt;br /&gt;
* Approximation numérique de calculs intégraux&lt;br /&gt;
* Instant Insanity&lt;br /&gt;
* Automates cellulaires&lt;br /&gt;
* Simulation de fluides&lt;br /&gt;
&lt;br /&gt;
=== [[ Détection d’anomalies par Isolation Forest : application pour l’industrie 4.0]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Cette 4ième ère de l’industrie se définit comme la convergence du monde numérique virtuel avec les produits et objets du monde réel. Ainsi, l’Internet of Things (IoT) se diffuse progressivement dans toutes les strates de l’industrie en intégrant des capteurs et des services qui se connectent à d’autres équipements pour échanger des données. Ce déploiement massif d’objets entraine la collecte puis le traitement de données plus ou moins sensibles selon le contexte. Pour diverses raisons (pannes de capteurs, erreurs de paramétrages, évolution de l’environnement,…) un certain nombre de données peuvent être erronées et entrainer des conséquences sur l’usage. Des méthodes d&#039;apprentissage automatique, permettent la détection d&#039;anomalies. Ainsi l’algorithme non supervisé « Isolation Forest » permet de détecter des anomalies dans un jeu de données en isolant les données atypiques (celles qui sont trop différentes de la plupart des autres données). Cet algorithme calcule, pour chaque donnée du jeu, un score qui reflète à quel point la donnée en question est atypique. &lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre l’algorithme « Isolation Forest »&lt;br /&gt;
*# Tester les lib dédiées du framework Scikit-learn sur un jeu de données type&lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Isolation Forest Presentation: https://www.youtube.com/watch?v=cRzeotaFDwk&lt;br /&gt;
** Scikit-learn: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html&lt;br /&gt;
** Dataset : https://www.kaggle.com/nphantawee/pump-sensor-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Machines de Turing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé : Une machine de Turing est un modèle de calcul, qui représente de manière abstraite le fonctionnement des ordinateurs. Toutes les fonctions calculables (ie. tous les algorithmes qui terminent) peuvent être simulées par une machine de Turing. L&#039;objectif est de comprendre ce modèle théorique, et de l&#039;implémenter dans le langage de son choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# comprendre les machines de Turing&lt;br /&gt;
*# coder (dans le langage de son choix) une machine de Turing, réalisant une opération basique (ajouter 1, soustraire 1, multiplier par 2...)&lt;br /&gt;
*# coder une machine de Turing universelle&lt;br /&gt;
* Liens pour débuter :&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** http://zanotti.univ-tln.fr/turing/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Géométrie discrète, Convexité des polyominos, Combinatoire des mots]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les régions d&#039;intérêt ou formes dans les images ont une géométrie particulière. Leur contour est un chemin avec seulement 4 directions possibles, car les points du chemin n&#039;ont que des coordonnées entières. Comment faire pour retrouver des éléments de la géométrie Euclidienne classique dans ce cas ? Par exemple, quid de l&#039;aire du périmètre, de la convexité, des tangentes, des points d&#039;inflexion ? Comment reconnaître que la forme est un rectangle tourné de 30 degrés ? Nous verrons comment nous pouvons aborder ce problème au travers d&#039;un outil commun, appelé mot de Christoffel. Il conduit à des algorithmes simples et rapides pour analyser la géométrie des contours dans les images.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre les difficultés d&#039;appliquer la géométrie classique sur les formes définies dans les images&lt;br /&gt;
*# Comprendre les mots de Christoffel, ses différentes définitions combinatoires et géométriques, la pente d&#039;un tel mot, et lien avec les fractions continues&lt;br /&gt;
*# Déterminer la convexité d&#039;un contour en utilisant les mots de Christoffel. &lt;br /&gt;
*# Si le temps le permet, savoir calculer un mot de contour à partir d&#039;une image noir et blanc&lt;br /&gt;
*# Coder tout ça pour faire un peu d&#039;analyse d&#039;image, genre identifier combien de côtés à un polygone rasterisé dans une image.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://bollu.github.io/lyndon-christoffel-convex-hull.html Petit topo Mot de Christoffel et convexité]]&lt;br /&gt;
** [[https://www.lama.univ-savoie.fr/pagesmembres/lachaud/People/LACHAUD-JO/Talks/chambery-ejc-2010.pdf Plus avancé (partie droites et applications)]]&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Triangle digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Pentagone digital &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt; Forme non convexe &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diverses définitions de polyominos convexes&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Mots de Christoffel&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Triangle-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Pentagon-50-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Flower-50-3-n.png|100px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Convex-polyominos.gif|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Christoffel-word.png|500px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Origami, axiomes de Huzita/Justin et ReferenceFinder]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : la trisection (exacte) d&#039;un angle quelconque n&#039;est pas possible en utilisant uniquement un compas et une règle (non graduée). Si cet angle est tracé sur une feuille de papier, il existe pourtant une séquence de plis pour le découper en 3 angles égaux ! En étant volontairement provocateur, on peut donc dire que l&#039;origami (pliage depapier) est plus puissant que la géométrie (utilisation du compas et de la règle) !&lt;br /&gt;
* Objectifs : comprendre comment on modélise les plis autorisés (axiomes de Justin/Huzita) et visualiser les (approximation des) points constructibles par un petit nombre de plits. On pourra pour ceci utiliser la base de données générée par le programme ReferenceFinder. Idéalement, il faudrait ensuite développer un programme qui reconstruit une telle base de données.&lt;br /&gt;
* Références : &lt;br /&gt;
*# Jacques Justin, Résolution par le pliage de l&#039;équation du troisième degré et applications géométriques https://publimath.univ-irem.fr/numerisation/ST/IST86008/IST86008.pdf&lt;br /&gt;
*# George Martin, *Geometric Constructions* (partie 10)&lt;br /&gt;
*# Jean-Paul Delahaye, les mathématiques de l&#039;origami https://www.cristal.univ-lille.fr/~jdelahay/pls/255.pdf&lt;br /&gt;
*# Robert Lang, ReferenceFinder https://www.langorigami.com/article/referencefinder/&lt;br /&gt;
*# Roger Alperin et Robert Lang, One- Two- and Multi-Fold Origami Axioms https://langorigami.com/wp-content/uploads/2015/09/o4_multifold_axioms.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Les &amp;quot;claviers&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : chaque touche d&#039;un clavier affiche un caractère. On peut alors écrire tous les mots possibles en appuyant successivement sur les touches pertinentes. Sur un clavier cassé (par exemple, parce qu&#039;il a reçu du café), les touches n&#039;ont plus forcément le comportement attendu : la première touche peut inscrire &amp;quot;ktjh&amp;quot;, le seconde &amp;quot;uta&amp;quot;, etc. Il n&#039;est alors plus forcément possible d&#039;écrire tous les mots possibles, mais il est facile de comprendre ce que l&#039;on peut faire. Lorsque le comportement de ces touches peut inclure des déplacement (gauche / droite) et la touche &amp;quot;backspace&amp;quot;, la situation peut devenir infernale ! Quatre jeunes étudiants en thèse ont récemment développé cette théorie.&lt;br /&gt;
* Objectifs : l&#039;objectif est de se familiariser avec les notions de théorie des langages et de regarder les premiers résultats de cette théorie, les astuces mises en œuvre pour étudier les langages engendrés et les questions ouvertes. L&#039;implémentation de petits programmes pour faciliter l&#039;étude de ces langages n&#039;est pas obligatoire, mais forcément recommandé !&lt;br /&gt;
* Références :&lt;br /&gt;
*# Yoan Géran, Bastien Laboureix, Corto Mascle, Valentin D. Richard, Keyboards as a New Model of Computation Keyboards as a New Model of Computation https://drops.dagstuhl.de/opus/volltexte/2021/14489/pdf/LIPIcs-MFCS-2021-49.pdf (ou la version longue : https://arxiv.org/abs/2102.10182)&lt;br /&gt;
*# diapos d&#039;un exposé donné au LAMA en décembre 2021&lt;br /&gt;
&lt;br /&gt;
=== [[Fractales de Newton et sensibilité aux conditions initiales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: De modèles en apparence simples peuvent naître des comportements complexes. On parle souvent de Chaos ou d&#039;effet papillon. Nous allons ici étudier un algorithme simple et itératif pour trouver des solutions à l&#039;équation f(z)=0 (où z est un nombre complexe). Comme en général f a plusieurs solutions, cet algorithme qui part d&#039;une position z0 va arriver (s&#039;il arrive) sur une des solutions. Or cet algorithme est sensible aux conditions initiales (pas trop surprenant), mais cette sensibilité est très curieuse et parfois une variation infinitésimale amène sur n&#039;importe quelle solution ! L&#039;image ci-dessous montre cette sensibilité aux conditions initiales, en mettant la couleur de la solution trouvée au point de départ (rappelons que z0 est un nombre complexe, donc un point du plan).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme de Newton de recherche de solutions à f(z)=0&lt;br /&gt;
*# Implémenter cet algorithme et afficher pour chaque pixel d&#039;un domaine choisi la solution trouvée (avec une couleur) pour faire de jolies images&lt;br /&gt;
*# Si le temps le permet, on verra comment aussi faire des images 3D !&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Fractale_de_Newton  Fractale de Newton (Wikipedia)]]&lt;br /&gt;
** [[https://images.math.cnrs.fr/La-methode-de-Newton-et-son-fractal-en-3D.html?lang=fr Images des mathématiques: fractales de Newton]]&lt;br /&gt;
[[fichier:Fractale-newton.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Approximation numérique de calculs intégraux]] ===&lt;br /&gt;
* Tuteur : Dionysios Grapsas&lt;br /&gt;
* Résumé : L’utilisation de l’ordinateur comme une supercalculette est le moyen que nous disposons aujourd’hui pour calculer les solutions des problèmes “compliqués” de la mécanique, dont les solutions exactes ne sont pas connues (aéronautique, météorologie, éléctromagnétisme, …). Le calcul intégral permet de s’initier à cet approche, de se rendre compte de sa puissance (résolution rapide de problèmes difficiles / impossible à calculer manuellement), de ses limitations (les solutions ne sont jamais “exactes”), ainsi que l’importance de tous les choix qu’on fait pendant la construction et l’implémentation des méthodes numériques aux résultats finaux.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Implémenter des méthodes de calcul intégral déterministes (méthodes de quadrature) et probabilistes (Monte-Carlo)&lt;br /&gt;
*# Comparer leurs résultats et leur efficacité sur plusieurs cas de figure&lt;br /&gt;
*# Calcul intégral en plusieurs dimensions&lt;br /&gt;
&lt;br /&gt;
=== [[Instant Insanity]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Instant Insanity est un puzzle qui a été vendu sous différents noms. Le but est, étant donnés 4 cubes dont les faces sont coloriées (par exemple, en rouge, jaune, vert et bleu), on veut empiler les 4 cubes de telle sorte à ce que chaque &amp;quot;côté&amp;quot; de la colonne contienne les 4 couleurs. Par exemple, vous pouvez essayer avec ces 4 patrons de cubes : &lt;br /&gt;
[[Fichier:Instant_insanity_Cube.png]]&lt;br /&gt;
&lt;br /&gt;
Ce puzzle peut facilement être généralisé à n cubes et n couleurs. On cherche à écrire un algorithme qui, si c&#039;est possible trouve un bon empilement. Toutefois, ce jeu a été un des premiers puzzles à avoir été montré NP-complet (par Robertson et Munro en 1978). &lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre ce qu&#039;est un problème NP-complet&lt;br /&gt;
*# Comprendre pourquoi ce puzzle est NP-complet&lt;br /&gt;
*# Coder une heuristique ou utiliser un SAT-solveur&lt;br /&gt;
*# Chercher si d&#039;autres puzzles sont aussi NP-complets&lt;br /&gt;
* Références pour commencer : &lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/Instant_Insanity Page wikipedia du jeu]]&lt;br /&gt;
*# [[https://en.wikipedia.org/wiki/NP-completeness Page wikipedia sur la NP-complétude]]&lt;br /&gt;
&lt;br /&gt;
=== [[Automates cellulaires]] ===&lt;br /&gt;
*Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : La théorie des automates cellulaires est relativement simple, une série de règles permet de modifier l’état spatial et temporel d’une cellule en fonction de son voisinage. Cette théorie se décline en de nombreux cas d’étude, automate circulaire cyclique, 2D, 3D … En théorie, les automates cellulaires permettent aussi de réaliser toutes sortes de calculs.Le jeu de la vie imaginé par John Horton Conway en 1970 est un automate cellulaire.&lt;br /&gt;
* Objectifs : Le but de ce sujet est d’expliquer si possible au moyen de programmes simples :&lt;br /&gt;
*# la classification des automates cellulaires&lt;br /&gt;
*# les automates cellulaires remarquables &lt;br /&gt;
*# l’équivalence avec les machines de Turing&lt;br /&gt;
*# la notion d’universalité &lt;br /&gt;
*# les caractéristiques du jeu de la vie&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://mathworld.wolfram.com/CellularAutomaton.html&lt;br /&gt;
** https://www.techno-science.net/glossaire-definition/Automate-cellulaire-page-6.html&lt;br /&gt;
** https://lig-membres.imag.fr/prost/L3_INFO_MCAL_MT/projet.html&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Automate_1.png|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[fichier:Simuca.gif|300px]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Simulation de fluides]] ===&lt;br /&gt;
* Tuteur: Colin Weill-Duflos&lt;br /&gt;
* Résumé : Lorsque l&#039;on veut afficher de l&#039;eau sur un écran, on veut généralement représenter son mouvement sans qu&#039;un animateur n&#039;ait à préciser à la main le déplacement de chaque polygone représentant la surface de l&#039;eau. Pour cela, on emploie des modélisation physiques du fluide pour simuler son comportement, puis on effectue un rendu du fluide ainsi modélisé. Les modèles physiques employés pour simuler un fluide sont complexes (voir les équations de Navier-Stokes) et font apparaître des phénomènes comme des vortex, des vagues... Il faut donc des méthodes de simulation fines capturant la complexité de ces phénomènes.&lt;br /&gt;
* Objectifs : &lt;br /&gt;
*# implémenter un simulateur physique de fluide suivant la méthode &amp;quot;SPH&amp;quot; pour des scènes simples &lt;br /&gt;
*# implémenter une méthode pour afficher le fluide ainsi simulé.&lt;br /&gt;
* Références&lt;br /&gt;
** Video demo : https://www.youtube.com/watch?v=3de4YLqlMFQ&lt;br /&gt;
** http://www.cs.columbia.edu/~batty/teaching/COMS6998/SPH_overview.pdf&lt;br /&gt;
** https://en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sph.png|500px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2020-2021 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
=== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
=== [[Clustering par K-means, segmentation d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Ensemble de Mandelbrot et autres fractales]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Complexité pratique contre complexité théorique]] ===&lt;br /&gt;
 &lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
=== [[Etude du protocole gRPC]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
=== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Modélisation de la ruine du joueur]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2019-2020 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
=== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
=== Transfert de couleur (version 2) ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération fractale de terrains ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
=== Architectures Orientées Micro-Services ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Apprentissage automatique ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Base de données orientées Graphe, similarité et modèles prédictifs ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2018-2019 ==&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
=== Transport optimal par coupe 1D et transfert de couleurs entre images ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
=== Génération et résolution de labyrinthes II ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== REST + Pub/Sub : protocole hybride pour l’IoT ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
=== Dilemme du prisonnier ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2017-2018 ==&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
=== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
=== [[Pavages de Penrose]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithmes d&#039;analyse syntaxique]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés 2016-2017 ==&lt;br /&gt;
&lt;br /&gt;
=== [[Algorithme de rendu de scène 3D par Z-buffer]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
=== [[Traitement d&#039;image]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Nim et la théorie des jeux impartiaux]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
=== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
=== Initiation à la démonstration sur ordinateur et certification de logiciel ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
=== [[Calculabilité et modèles de calcul]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
=== [[Génération et résolution de labyrinthes]] ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
=== Pavages par polyomino ===&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Wiki-lama</name></author>
	</entry>
</feed>