diff --git a/config.yaml b/config.yaml index 3d15d08..94ea487 100755 --- a/config.yaml +++ b/config.yaml @@ -1,5 +1,5 @@ --- -baseURL: 'https://blog.samuel.ortion.fr/' +baseURL: 'https://samuel.ortion.fr/' languageCode: en-us title: A blog from a juvenile Geekus biologicus theme: 'mus' diff --git a/content/images/R/languages_count.png b/content/images/R/languages_count.png deleted file mode 100755 index ecac2be..0000000 Binary files a/content/images/R/languages_count.png and /dev/null differ diff --git a/content/pages/news.org b/content/pages/news.org index 96942fd..88b5740 100644 --- a/content/pages/news.org +++ b/content/pages/news.org @@ -2,7 +2,17 @@ #+author: Samuel Ortion #+date: <2024-04-14 Sun> #+updated: <2024-04-14 Sun> -#+draft: true +#+draft: false + + +* <2025-10-01 Wed> +Je commence une thèse au Laboratoire d'Analyses Bioinformatiques pour la Génomique et le Métabolisme au Génoscope ([[https://labgem.genoscope.cns.fr/][LABGeM]]). +Je vais travailler sur une méthode de reconstruction de réseaux métaboliques à l'échelle des pangénomes de bactéries et d'archées. + +* <2025-01-01 Wed> + +Je commence un stage de Master 2 au LaMME, sous la direction de Carène Rizzon, Marie Szafranski et Franck Samson du LaMME et de Emmanuelle Lerat du LBBE (CNRS / Lyon). Il porte sur la prédiction de la redondance fonctionelle de paire de gènes dupliqués chez /Arabidopsis thaliana/ avec des approches de /machine learning/. + * <2024-04-15 Mon> Je commence un stage au Laboratoire de Mathématiques et Modélisation d'Évry (LaMME), pour travailler sur un pipeline de détection de gènes dupliqués en tandem sous la supervision de Carène Rizzon et Franck Samson. diff --git a/content/posts/20251101_vertex_cover_linear_programming.fr.md b/content/posts/20251101_vertex_cover_linear_programming.fr.md new file mode 100644 index 0000000..d7324b0 --- /dev/null +++ b/content/posts/20251101_vertex_cover_linear_programming.fr.md @@ -0,0 +1,88 @@ ++++ +title = "Le problème de couverture par sommets en Integer Linear Programming avec LP-solve" +author = ["Samuel Ortion"] +date = 2025-11-01 +slug = "couverture-par-sommets-optimisation-linéaire" +tags = [["graph"]] +draft = false ++++ + +Le [problème de couverture par sommets](https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_couverture_par_sommets) (ou _Vertex Cover_ en anglais) consiste, étant donné un graphe, à trouver un ensemble minimum de sommets de sorte que toutes les arêtes soient couvertes. + +Formellement: soit \\(G(V, E)\\) un graphe, une couverture est un ensemble \\(S\\) tel que: +\\[ +S \subseteq V \text{ tel que } \forall e = (u, v) \in E, u \in S, \text{ ou } v \in S +\\] + +L'objectif est de miniser la taille de \\(S\\). + +{{< figure src="/ox-hugo/vertex-cover-example.svg" >}} + +Le problème de la couverture par sommets est NP-complet. + +Dans ce post, nous allons tenter d'utiliser l'integer programming pour résoudre ce problème. + + +## Encodage du problème en Integer Programming {#encodage-du-problème-en-integer-programming} + +En Integer Programming, on peut utiliser des variables entières, et des contraintes, telles que \\(a + b \geq c\\). + +Pour encoder notre problème en Integer Programming, on va se donner une variable Booléenne \\(x\_v\\) pour chaque sommet \\(v\\), sur \\(\\{0, 1\\}\\), évaluée à 1 si \\(v\\) est sélectionné dans \\(S\\). + +Puis, pour chaque arête \\((u, v)\\), on crée une contrainte pour s'assurer qu'elle soit couverte: + +\\[ +x\_u + x\_v \geq 1 +\\] + +Dans cette condition, la contrainte est satisfaite si au moins une des variables \\(x\_u\\) et \\(x\_v\\) est vraie (c'est-à-dire égale à 1). + +La fonction à miniser, correspondant au cardinal de \\(S\\) est simplement: +\\[ +\sum\_{v \in V} x\_v +\\] + +Les valeurs de \\(x\_v\\) en sortie du solveur d'Integer Programming indiquent quel est l'ensemble \\(S\\) de la solution. + + +## Implementation avec LP-solve {#implementation-avec-lp-solve} + +[LP-solve](https://lp-solve.github.io/) est un solveur pour le problème Mixed Integer Linear Programming. + +Pour l'exemple présenté au début de ce post, le graphe est composé des arrêtes suivantes: \\((a, c), + (c, b), + (d, e), + (a, e), + (a, d)\\) + +```lp_solve +min: a + b + c + d + e; + +r_1: a + c >= 1; +r_2: d + e >= 1; +r_3: c + b >= 1; +r_4: a + e >= 1; +r_5: a + d >= 1; + +bin a; +bin b; +bin c; +bin d; +bin e; +``` + +```text + +Value of objective function: 3.00000000 + +Actual values of the variables: +a 1 +b 0 +c 1 +d 0 +e 1 +``` + +Ce qui correspond à la couverture suivante (sommets jaunes), sur le graphe initial. + +{{< figure src="/ox-hugo/vertex-cover-example-lp_solve.svg" >}} diff --git a/content/posts/cameratraps/camera-traps-PiCameraTrap.fr.md b/content/posts/cameratraps/camera-traps-PiCameraTrap.fr.md index 35e7ee1..a594c86 100755 --- a/content/posts/cameratraps/camera-traps-PiCameraTrap.fr.md +++ b/content/posts/cameratraps/camera-traps-PiCameraTrap.fr.md @@ -17,7 +17,31 @@ J'ai donc utilisé le logiciel [Motion](https://motion-project.github.io/), qui - Alimentation pour Raspberry Pi; - Batterie externe USB (optionnel, utile pour obtenir un piège photo autonome); - Caméra Raspberry Pi (avec sa nâpe de câblage), ou une caméra USB; -- Carte SD (avec assez de stockage pour les photos et l'OS); +- Carte micro SD (avec assez de stockage pour les photos et l'OS); - Une boîte (étanche de préférence). +## Installation du système d'exploitation + +Pour un piège photo, un système d'exploitation sans interface graphique suffit. On peut installer, par exemple [Raspberry Pi OS Lite](https://www.raspberrypi.com/software/operating-systems/). + +L'installation du système d'exploitation est en dehors du cadre de ce tuto. Le plus simple est d'utiliser l'outil Raspberry Pi Imager. Pensez à mettre en place le service SSH, à entrer les identifiants / mots de passes de votre point d'accès WiFi. + +## Installation de Motion et configuration + +Motion est un logiciel qui analyse en continue le flux vidéo de la caméra et peux déclencher la prise de vue lorsqu'il détecte un changement important de couleur de pixel (quand un oiseau ou un chat passe devant la caméra par exemple). + +Pour installer motion, on utilise la commande suivante: + +```console +sudo apt install motion +``` + + +Sur les versions récente de Raspberry Pi OS (basées sur Bookworm), la gestion des caméras nécessite l'utilisation de `libcamera`. + +On installe donc `libcamera`: + +```console +sudo apt install libcamera-tools libcamera-v4l2 +``` diff --git a/content/posts/cameratraps/camera-traps-arduino.en.fr.md b/content/posts/cameratraps/camera-traps-arduino.en.fr.md index 5a1dfe9..13c6660 100755 --- a/content/posts/cameratraps/camera-traps-arduino.en.fr.md +++ b/content/posts/cameratraps/camera-traps-arduino.en.fr.md @@ -135,4 +135,4 @@ Voici deux images prise par le piège photo Arduino, à l'occasion: ![Mésange Charbonière au nichoir - Photo 1 prise par le piège photo Arduino](https://framagit.org/BioloGeeks/WildBytes/CameraTraps/www/-/raw/main/static/media/images/arduino/photo-mesange-1.jpg) -![Mésange Charbonière au nichoir - Photo 1 prise par le piège photo Arduino](https://framagit.org/BioloGeeks/WildBytes/CameraTraps/www/-/raw/main/static/media/images/arduino/photo-mesange-2.jpg) \ No newline at end of file +![Mésange Charbonière au nichoir - Photo 1 prise par le piège photo Arduino](https://framagit.org/BioloGeeks/WildBytes/CameraTraps/www/-/raw/main/static/media/images/arduino/photo-mesange-2.jpg) diff --git a/content/posts/cameratraps/camera-traps-arduino.en.md b/content/posts/cameratraps/camera-traps-arduino.en.md index b810a76..17b1854 100755 --- a/content/posts/cameratraps/camera-traps-arduino.en.md +++ b/content/posts/cameratraps/camera-traps-arduino.en.md @@ -134,7 +134,7 @@ void loop() { ## Results -I had the change to have a family of great tit, that were in a birdhouse I made. +I had the chance to have a family of great tit, that were in a birdhouse I made. Here are two images taken by the Arduino Camera Trap. diff --git a/org/20251101_vertex_cover_linear_programming.fr.org b/org/20251101_vertex_cover_linear_programming.fr.org new file mode 100644 index 0000000..3073962 --- /dev/null +++ b/org/20251101_vertex_cover_linear_programming.fr.org @@ -0,0 +1,125 @@ +#+title: Le problème de couverture par sommets en Integer Linear Programming avec LP-solve +#+date: 2025-11-01 +#+lastmod: 2025-11-01 +#+hugo_tags: [graph] +#+author: Samuel Ortion +#+hugo_lang: fr +#+hugo_draft: nil +#+hugo_base_dir: .. +#+hugo_pseudocode: true +#+hugo_slug: couverture-par-sommets-optimisation-linéaire + +Le [[https://fr.wikipedia.org/wiki/Probl%C3%A8me_de_couverture_par_sommets][problème de couverture par sommets]] (ou /Vertex Cover/ en anglais) consiste, étant donné un graphe, à trouver un ensemble minimum de sommets de sorte que toutes les arêtes soient couvertes. + +Formellement: soit $G(V, E)$ un graphe, une couverture est un ensemble $S$ tel que: +$$ +S \subseteq V \text{ tel que } \forall e = (u, v) \in E, u \in S, \text{ ou } v \in S +$$ + +L'objectif est de miniser la taille de $S$. + +#+begin_src dot :file vertex-cover-example.svg :results file graphics +graph G { + { + node [width=0.25 shape=circle style=filled] + a + b + c + d + e + } + a -- c + c -- b + d -- e + a -- e + a -- d +} +#+end_src + +#+RESULTS: +[[file:vertex-cover-example.svg]] + +Le problème de la couverture par sommets est NP-complet. + +Dans ce post, nous allons tenter d'utiliser l'integer programming pour résoudre ce problème. + +* Encodage du problème en Integer Programming + +En Integer Programming, on peut utiliser des variables entières, et des contraintes, telles que $a + b \geq c$. + +Pour encoder notre problème en Integer Programming, on va se donner une variable Booléenne $x_v$ pour chaque sommet $v$, sur $\{0, 1\}$, évaluée à 1 si $v$ est sélectionné dans $S$. + +Puis, pour chaque arête \((u, v)\), on crée une contrainte pour s'assurer qu'elle soit couverte: + +$$ +x_u + x_v \geq 1 +$$ + +Dans cette condition, la contrainte est satisfaite si au moins une des variables $x_u$ et $x_v$ est vraie (c'est-à-dire égale à 1). + +La fonction à miniser, correspondant au cardinal de $S$ est simplement: +\[ +\sum_{v \in V} x_v +\] + +Les valeurs de $x_v$ en sortie du solveur d'Integer Programming indiquent quel est l'ensemble $S$ de la solution. + +* Implementation avec LP-solve + +[[https://lp-solve.github.io/][LP-solve]] est un solveur pour le problème Mixed Integer Linear Programming. + +Pour l'exemple présenté au début de ce post, le graphe est composé des arrêtes suivantes: \((a, c), + (c, b), + (d, e), + (a, e), + (a, d)\) + +#+begin_src lp_solve :exports both +min: a + b + c + d + e; + +r_1: a + c >= 1; +r_2: d + e >= 1; +r_3: c + b >= 1; +r_4: a + e >= 1; +r_5: a + d >= 1; + +bin a; +bin b; +bin c; +bin d; +bin e; +#+end_src + +#+RESULTS: +: +: Value of objective function: 3.00000000 +: +: Actual values of the variables: +: a 1 +: b 0 +: c 1 +: d 0 +: e 1 + +Ce qui correspond à la couverture suivante (sommets jaunes), sur le graphe initial. + +#+begin_src dot :file vertex-cover-example-lp_solve.svg :results file graphics +graph G { + { + node [width=0.25 shape=circle style=filled] + a [fillcolor=yellow] + b + c [fillcolor=yellow] + d + e [fillcolor=yellow] + } + a -- c + c -- b + d -- e + a -- e + a -- d +} +#+end_src + +#+RESULTS: +[[file:vertex-cover-example-lp_solve.svg]] diff --git a/org/vertex-cover-example-lp_solve.svg b/org/vertex-cover-example-lp_solve.svg new file mode 100644 index 0000000..a939764 --- /dev/null +++ b/org/vertex-cover-example-lp_solve.svg @@ -0,0 +1,68 @@ + + + + + + +G + + + +a + +a + + + +c + +c + + + +a--c + + + + +d + +d + + + +a--d + + + + +e + +e + + + +a--e + + + + +b + +b + + + +c--b + + + + +d--e + + + + diff --git a/org/vertex-cover-example.svg b/org/vertex-cover-example.svg new file mode 100644 index 0000000..762ab19 --- /dev/null +++ b/org/vertex-cover-example.svg @@ -0,0 +1,68 @@ + + + + + + +G + + + +a + +a + + + +c + +c + + + +a--c + + + + +d + +d + + + +a--d + + + + +e + +e + + + +a--e + + + + +b + +b + + + +c--b + + + + +d--e + + + + diff --git a/static/ox-hugo/example.svg b/static/ox-hugo/example.svg new file mode 100644 index 0000000..d927fd4 --- /dev/null +++ b/static/ox-hugo/example.svg @@ -0,0 +1,63 @@ + + + + + + +G + + + +a + + + + +c + + + + +a--c + + + + +d + + + + +a--d + + + + +e + + + + +a--e + + + + +b + + + + +c--b + + + + +d--e + + + + diff --git a/static/ox-hugo/vertex-cover-example-lp_solve.svg b/static/ox-hugo/vertex-cover-example-lp_solve.svg new file mode 100644 index 0000000..a939764 --- /dev/null +++ b/static/ox-hugo/vertex-cover-example-lp_solve.svg @@ -0,0 +1,68 @@ + + + + + + +G + + + +a + +a + + + +c + +c + + + +a--c + + + + +d + +d + + + +a--d + + + + +e + +e + + + +a--e + + + + +b + +b + + + +c--b + + + + +d--e + + + + diff --git a/static/ox-hugo/vertex-cover-example.svg b/static/ox-hugo/vertex-cover-example.svg new file mode 100644 index 0000000..762ab19 --- /dev/null +++ b/static/ox-hugo/vertex-cover-example.svg @@ -0,0 +1,68 @@ + + + + + + +G + + + +a + +a + + + +c + +c + + + +a--c + + + + +d + +d + + + +a--d + + + + +e + +e + + + +a--e + + + + +b + +b + + + +c--b + + + + +d--e + + + +