Skip to content
Snippets Groups Projects
Commit 6515b51e authored by dlesignac's avatar dlesignac
Browse files

Move some code and add kata.md

parent 0b364f9b
No related branches found
No related tags found
No related merge requests found
Showing
with 72 additions and 26 deletions
kata.md 0 → 100644
Au programme aujourd'hui, il ne s'agira pas tellement de cercle mais plutôt de sinus: ceux des equations de
[Lotka-Volterra](https://en.wikipedia.org/wiki/Lotka%E2%80%93Volterra_equations).
```
Kezako ?
```
En résumé, il s'agit d'une modélisation mathématique de la relation qui existe entre l'évolution d'une population de
proie et l'évolution de la population de ses prédateurs.
![lotka-volterra](https://upload.wikimedia.org/wikipedia/commons/7/70/Lotka_Volterra_Dynamique.gif "Lotka Volterra")
En 4 phrases:
* lorsque les proies sont peu nombreuses, le manque de nourriture entraine la diminution de la population de prédateurs
* lorsque les prédateurs sont peu nombreux, la diminution du danger entraine l'augmentation de la population de proies
* lorsque les proies sont nombreuses, l'abondance de nourriture entraine l'augmentation de la population de prédateurs
* lorsque les prédateurs sont nombreux, l'augmentation du danger entraine la diminituion de la population de proies.
```
D'accord, mais moi je code quoi ?
```
Rien de moins qu'un écosystème virtuel. Une simulation mettant en jeu une population de proie, une population de
prédateurs, une relation de prédation et une relation de reproduction, dont la complexité se limitera à ton imagination.
Par exemple, une relation de prédation simple:
* dans `x` % des cas, la prédation est réussie: le prédateur survit et la proie meurt
* dans `(100 - x)` % des cas, la prédation échoue: le prédateur meurt et la proie survit.
Bien sûr, cette version ultra-simplifiée est très peu représentative de la réalité. Tu peux par exemple décider
d'ajouter une notion de distance entre les entités, un système de *points de vie* pour que les prédateurs ne meurent pas
au premier échec, ... Cet exercice est volontairement libre pour que ton imagination puisse s'exprimer.
```
Et le rapport avec Lotka-Volterra ?
```
Si ta simulation est stable, alors elle ne devrait aboutir ni à l'extinction, ni à la prolifération (croissance infinie
qui ne peut correspondre à la réalité) de l'une ou l'autre des deux (ou plus ;) ) espèces. En traçant la courbe de
l'évolution des populations, tu devrais donc retrouver des formes familières.
Voici un [petit exemple](https://gitlab.takima.io/dlesignac/lotka-volterra) en Java de simulation pas encore stabilisée.
Pas facile... De quoi faire réfléchir sur la complexité et la fragilité de notre écosystème.
package fr.takima.lotka_volterra.common.measure; package fr.takima.lotka_volterra.common;
import fr.takima.lotka_volterra.common.value.PositiveInt; import fr.takima.lotka_volterra.common.value.PositiveInt;
import fr.takima.lotka_volterra.validator.LowerThanValidator; import fr.takima.lotka_volterra.validator.LowerThanValidator;
......
package fr.takima.lotka_volterra.common.measure; package fr.takima.lotka_volterra.common;
import fr.takima.lotka_volterra.common.value.BigDecimalValue; import fr.takima.lotka_volterra.common.value.BigDecimalValue;
import fr.takima.lotka_volterra.validator.GreaterThanValidator; import fr.takima.lotka_volterra.validator.GreaterThanValidator;
......
package fr.takima.lotka_volterra.common.measure; package fr.takima.lotka_volterra.common;
import fr.takima.lotka_volterra.common.value.BigDecimalValue; import fr.takima.lotka_volterra.common.value.BigDecimalValue;
import fr.takima.lotka_volterra.validator.GreaterThanValidator; import fr.takima.lotka_volterra.validator.GreaterThanValidator;
......
package fr.takima.lotka_volterra.common.measure; package fr.takima.lotka_volterra.common;
import fr.takima.lotka_volterra.validator.NotNullValidator; import fr.takima.lotka_volterra.validator.NotNullValidator;
......
package fr.takima.lotka_volterra.common.measure; package fr.takima.lotka_volterra.common;
import fr.takima.lotka_volterra.validator.NotNullValidator; import fr.takima.lotka_volterra.validator.NotNullValidator;
......
package fr.takima.lotka_volterra.mating; package fr.takima.lotka_volterra.mating;
import fr.takima.lotka_volterra.common.measure.Probability; import fr.takima.lotka_volterra.common.Probability;
import fr.takima.lotka_volterra.common.measure.Distance; import fr.takima.lotka_volterra.common.Distance;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.math.BigDecimal; import java.math.BigDecimal;
......
package fr.takima.lotka_volterra.mating; package fr.takima.lotka_volterra.mating;
import fr.takima.lotka_volterra.common.measure.Probability; import fr.takima.lotka_volterra.common.Probability;
import fr.takima.lotka_volterra.common.measure.Distance; import fr.takima.lotka_volterra.common.Distance;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.math.BigDecimal; import java.math.BigDecimal;
......
package fr.takima.lotka_volterra.mating; package fr.takima.lotka_volterra.mating;
import fr.takima.lotka_volterra.common.measure.Probability; import fr.takima.lotka_volterra.common.Probability;
import fr.takima.lotka_volterra.common.measure.Distance; import fr.takima.lotka_volterra.common.Distance;
import java.util.Random; import java.util.Random;
......
package fr.takima.lotka_volterra.moving; package fr.takima.lotka_volterra.moving;
import fr.takima.lotka_volterra.common.measure.Distance; import fr.takima.lotka_volterra.common.Distance;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Random; import java.util.Random;
......
package fr.takima.lotka_volterra.moving; package fr.takima.lotka_volterra.moving;
import fr.takima.lotka_volterra.common.measure.Distance; import fr.takima.lotka_volterra.common.Distance;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Random; import java.util.Random;
......
package fr.takima.lotka_volterra.moving; package fr.takima.lotka_volterra.moving;
import fr.takima.lotka_volterra.common.measure.Angle; import fr.takima.lotka_volterra.common.Angle;
import fr.takima.lotka_volterra.common.measure.Distance; import fr.takima.lotka_volterra.common.Distance;
import fr.takima.lotka_volterra.common.measure.Vector; import fr.takima.lotka_volterra.common.Vector;
import fr.takima.lotka_volterra.validator.NotNullValidator; import fr.takima.lotka_volterra.validator.NotNullValidator;
import java.util.HashSet; import java.util.HashSet;
......
package fr.takima.lotka_volterra.moving; package fr.takima.lotka_volterra.moving;
import fr.takima.lotka_volterra.common.measure.Distance; import fr.takima.lotka_volterra.common.Distance;
import java.util.Random; import java.util.Random;
......
package fr.takima.lotka_volterra.moving; package fr.takima.lotka_volterra.moving;
import fr.takima.lotka_volterra.common.measure.Distance; import fr.takima.lotka_volterra.common.Distance;
public interface MovingEntity { public interface MovingEntity {
......
package fr.takima.lotka_volterra.moving; package fr.takima.lotka_volterra.moving;
import fr.takima.lotka_volterra.common.measure.Distance; import fr.takima.lotka_volterra.common.Distance;
import fr.takima.lotka_volterra.common.measure.Vector; import fr.takima.lotka_volterra.common.Vector;
import fr.takima.lotka_volterra.validator.NotNullValidator; import fr.takima.lotka_volterra.validator.NotNullValidator;
import java.math.BigDecimal; import java.math.BigDecimal;
......
package fr.takima.lotka_volterra.moving; package fr.takima.lotka_volterra.moving;
import fr.takima.lotka_volterra.common.measure.VectorComponent; import fr.takima.lotka_volterra.common.VectorComponent;
import fr.takima.lotka_volterra.common.value.IntValue; import fr.takima.lotka_volterra.common.value.IntValue;
import fr.takima.lotka_volterra.validator.GreaterThanValidator; import fr.takima.lotka_volterra.validator.GreaterThanValidator;
import fr.takima.lotka_volterra.validator.LowerThanValidator; import fr.takima.lotka_volterra.validator.LowerThanValidator;
......
package fr.takima.lotka_volterra.predation; package fr.takima.lotka_volterra.predation;
import fr.takima.lotka_volterra.common.measure.Probability; import fr.takima.lotka_volterra.common.Probability;
import fr.takima.lotka_volterra.common.measure.Distance; import fr.takima.lotka_volterra.common.Distance;
import fr.takima.lotka_volterra.predator.Satiety; import fr.takima.lotka_volterra.predator.Satiety;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
......
package fr.takima.lotka_volterra.predation; package fr.takima.lotka_volterra.predation;
import fr.takima.lotka_volterra.common.measure.Probability; import fr.takima.lotka_volterra.common.Probability;
import fr.takima.lotka_volterra.common.measure.Distance; import fr.takima.lotka_volterra.common.Distance;
import fr.takima.lotka_volterra.predator.Satiety; import fr.takima.lotka_volterra.predator.Satiety;
import java.util.Random; import java.util.Random;
......
package fr.takima.lotka_volterra.moving; package fr.takima.lotka_volterra.moving;
import fr.takima.lotka_volterra.common.measure.Distance; import fr.takima.lotka_volterra.common.Distance;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment