From fbb464a62ec74c069b9ef73a00e6dabe094a60c3 Mon Sep 17 00:00:00 2001 From: ac243219 Date: Mon, 13 Jan 2025 21:54:18 +0100 Subject: [PATCH 1/3] Suite --- README.md | 187 +++++- barabasi_degree_distribution.txt | 547 +++++++++--------- comparison_results.txt | 8 +- random_degree_distribution.txt | 93 ++- scenario1_no_control.dat | 180 +++--- scenario2_random_immunization.dat | 180 +++--- scenario3_selective_immunization.dat | 180 +++--- .../java/org/example/DBLPNetworkAnalysis.java | 71 ++- src/main/java/org/example/Propagation.java | 210 +++---- 9 files changed, 936 insertions(+), 720 deletions(-) diff --git a/README.md b/README.md index 9db5a95..9a69fa9 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ double averageDegree = Toolkit.averageDegree(graph); ```java double clusteringCoefficient = Toolkit.averageClusteringCoefficient(graph); ``` -- Coefficient de clustering (aléatoire) : ⟨k⟩/N = 2.0884599814397534E-5 +- Coefficient de clustering (aléatoire) : ⟨k⟩/N = 2.0884599814397534E-5 ## 3- Autres mesures Voyons maintenant si le graphe est connexe : @@ -119,17 +119,17 @@ Tracer les distributions des distances : ![Distribution des distances](distance_distribution.png) -- Analyse de la courbe des distances moyennes : +###### Analyse de la courbe des distances moyennes : -Forme en cloche avec une décroissance symétrique de chaque côté. +- Forme en cloche avec une décroissance symétrique de chaque côté. -La courbe montre un pic central autour de 6. Cela suggère que la distance moyenne entre +- La courbe montre un pic central autour de 6. Cela suggère que la distance moyenne entre les paires de nœuds est proche de cette valeur. Cela soutient l'hypothèse des six degrés de séparation, car la majorité des distances sont à 6 ou moins. -Décroissance rapide : Les distances très petites et très grandes sont rares, tandis que les distances proches de la moyenne sont les plus fréquentes. +- Décroissance rapide : Les distances très petites et très grandes sont rares, tandis que les distances proches de la moyenne sont les plus fréquentes. -- Formulez une hypothèse sur la loi de cette distribution. +###### Formulez une hypothèse sur la loi de cette distribution. On conclut donc que la forme de la distribution est proche d'une loi normale, ce qui est souvent observé dans les réseaux petits mondes. @@ -467,11 +467,19 @@ ou non et on passera au else donc le scénario 3 (on convint 50% des gens à con if (immunizationFraction > 0) { int immunizedCount = (int) (immunizationFraction * graph.getNodeCount()); if (randomImmunization) { - // Immunisation aléatoire : immuniser des nœuds directement + // Récupérer tous les nœuds dans une liste + List allNodes = new ArrayList<>(graph.nodes().toList()); + + // Mélanger la liste pour une sélection aléatoire unique + Collections.shuffle(allNodes, random); + + // Immuniser les premiers `immunizedCount` nœuds for (int i = 0; i < immunizedCount; i++) { - Node node = graph.getNode(random.nextInt(graph.getNodeCount())); - node.setAttribute("immune", true); - } + Node node = allNodes.get(i); + if (node != null) { + node.setAttribute("immune", true); + } + } } else { // Immunisation sélective : immuniser un voisin pour 50% des nœuds existants List nodes = new ArrayList<>( graph.nodes().toList()); @@ -564,9 +572,63 @@ int totalNonImmune = 0; return infectedFractions; } ``` + + +#### Attention : La réalisation d'un scénario autour des valeurs critiques est sensible aux conditions initiales. +c'est pour ça que j'ai simulé plusieurs fois chaque scénario en **itérant sur 10** et en faire la moyenne après. + +```java +// --- Scénarios avec itérations --- +for (int scenario = 0; scenario < 3; scenario++) { +double[] averageFractions = new double[daysToSimulate]; +Arrays.fill(averageFractions, 0); // Initialiser à zéro pour chaque scénario + + for (int iteration = 0; iteration < iterations; iteration++) { + // Cloner le graphe pour garantir une nouvelle simulation à chaque itération + Graph graphClone = cloneGraph(graph); + + // Définir les paramètres spécifiques au scénario + double immunizationFraction = 0; + boolean randomImmunization = false; + + if (scenario == 1) { // Immunisation aléatoire + immunizationFraction = 0.5; + randomImmunization = true; + } else if (scenario == 2) { // Immunisation sélective + immunizationFraction = 0.5; + randomImmunization = false; + } + + // Exécuter la simulation et capturer les résultats + double[] fractions = simulateAndCaptureResults(graphClone, infectionProbability, recoveryProbability, daysToSimulate, immunizationFraction, randomImmunization); + + // Ajouter les résultats de cette itération à la moyenne + for (int day = 0; day < daysToSimulate; day++) { + averageFractions[day] += fractions[day]; + } + } + + // Diviser par le nombre d'itérations pour obtenir la moyenne + for (int day = 0; day < daysToSimulate; day++) { + averageFractions[day] /= iterations; + } + + // Stocker les résultats du scénario + results[scenario] = averageFractions; + + // Enregistrer les résultats dans un fichier + writeResultsToFile(fileNames[scenario], averageFractions); + } + + +``` + #### on obtient ces courbes qui montrent bien l'efficacité de l'immunisation séléctive. -![propagation simulation](propagationsimulation.png) +![propagation simulation](propagation_simulation_2.png) + + +- on voit bien à quel point l'immunisation séléctive est efficace. ## 3 - Le degré moyen des groupes 0 et 1 : @@ -669,4 +731,105 @@ La différence entre les degrés moyens reflète l’efficacité de l’immunisa Le degré moyen est similaire au degré moyen global du graphe. ###### Immunisation sélective : Le degré moyen est nettement plus élevé, car les voisins des hubs -(nœuds critiques) sont ciblés, ce qui fragmente davantage le réseau. \ No newline at end of file +(nœuds critiques) sont ciblés, ce qui fragmente davantage le réseau. + + +## 4 - suppression des noeuds si ils sont immunisés : + +on utilise une méthode pour chaque immunisation : + +- immunisation random : + +Cette méthode applique une immunisation aléatoire en supprimant un pourcentage donné (fraction) de nœuds sélectionnés +au hasard dans le graphe. + +```java + +private static void applyRandomImmunization(Graph graph, double fraction) { + Random random = new Random(); + int immunizedCount = (int) (fraction * graph.getNodeCount()); + for (int i = 0; i < immunizedCount; i++) { + Node node = graph.getNode(random.nextInt(graph.getNodeCount())); + if (node != null) { + graph.removeNode(node); + } + } + } + +``` +Cette méthode applique une immunisation sélective en parcourant les nœuds du graphe et, +pour chaque nœud sélectionné avec une probabilité donnée (fraction), elle supprime tous ses voisins. + +```java +private static void applySelectiveImmunization(Graph graph, double fraction) { + Random random = new Random(); + + // Créer une liste des nœuds + var nodes = graph.nodes().toList(); + + for (Node node : nodes) { + if (node != null && random.nextDouble() < fraction) { + // Parcourir les voisins et les supprimer + var neighbors = node.neighborNodes().toList(); + for (Node neighbor : neighbors) { + if (graph.getNode(neighbor.getId()) != null) { // Vérifier que le voisin existe toujours + graph.removeNode(neighbor.getId()); + } + } + } + } +} + +``` + +Voici les résultats : + +- Analyse après immunisation aléatoire : +- Taux de propagation (τ) : 2.0 +- Seuil épidémique réel (c_réel) : 0.08716647329769069 +- Seuil épidémique théorique (c_théorique) : 0.23112472214969867 + + +- Analyse après immunisation sélective : +- Taux de propagation (τ) : 2.0 +- Seuil épidémique réel (c_réel) : 0.5494896486700256 +- Seuil épidémique théorique (c_théorique) : 0.8383065431501645 + + +on constate que ça correspond parfaitement aux résultats théoriques : + +| **Stratégie d’immunisation** | **Impact sur ⟨k⟩** | **Impact sur ⟨k²⟩** | **Seuil épidémique c** | +|-------------------------------|-------------------------------|------------------------------|-------------------------------| +| Aucune immunisation | Aucun changement | Aucun changement | Bas | +| Immunisation aléatoire | Réduction proportionnelle | Faible réduction | Modérément augmenté | +| Immunisation sélective | Réduction modérée | Forte réduction | Significativement augmenté | + + + +## 5 - Simulez l'épidémie avec un réseau aléatoire et un réseau BA: + +J'ai utilisé les graphes que j'ai généré dans le TP1. + +```java +private static void runSimulations(Graph graph) { +int daysToSimulate = 90; // 3 mois +double infectionProbability = 1.0; // β = 1 +double recoveryProbability = 0.5; // μ = 0.5 + + // Scénario 1 : Aucune immunisation + System.out.println("Scénario 1 : Aucune immunisation"); + simulateAndCaptureResults(graph, infectionProbability, recoveryProbability, daysToSimulate, 0, false); + + // Scénario 2 : Immunisation aléatoire + System.out.println("Scénario 2 : Immunisation aléatoire"); + applyRandomImmunization(graph, 0.5); // Immunisation aléatoire de 50 % + simulateAndCaptureResults(graph, infectionProbability, recoveryProbability, daysToSimulate, 0, true); + + // Scénario 3 : Immunisation sélective + System.out.println("Scénario 3 : Immunisation sélective"); + applySelectiveImmunization(graph, 0.5); // Immunisation sélective de 50 % + simulateAndCaptureResults(graph, infectionProbability, recoveryProbability, daysToSimulate, 0, false); + } + + +``` \ No newline at end of file diff --git a/barabasi_degree_distribution.txt b/barabasi_degree_distribution.txt index f71e80d..8e7618d 100644 --- a/barabasi_degree_distribution.txt +++ b/barabasi_degree_distribution.txt @@ -1,321 +1,310 @@ # Degree Probability -1 0.11089945755014508 -2 0.11121798915100291 -3 0.11159959631638704 -4 0.11104768512678188 -5 0.11085845843320298 -6 0.11048631260249779 -7 0.0743944745805475 -8 0.05184496026239435 -9 0.03817333165131828 -10 0.028141163113409865 -11 0.021619149741390186 -12 0.017200706446322694 -13 0.013725242840923427 -14 0.011113914469534502 -15 0.009294184432950674 -16 0.007584836634287877 -17 0.006354863126024978 -18 0.005364576762962029 -19 0.0045982086539674534 -20 0.004197678819225432 -21 0.0035038476094361045 -22 0.0031001639964677685 +1 0.11088999621546612 +2 0.11071969219124511 +3 0.1112999873848871 +4 0.11090261132837138 +5 0.11115806736470292 +6 0.1108836886590135 +7 0.07437555191118961 +8 0.051885959379336447 +9 0.037936798284344646 +10 0.028560615617509777 +11 0.021543459063958624 +12 0.0171187082124385 +13 0.013526554812665573 +14 0.011135990917118707 +15 0.009382490223287498 +16 0.007521761069761574 +17 0.006266557335688154 +18 0.005282578529077835 +19 0.004629746436230604 +20 0.003935915226441276 +21 0.0035259240570203105 +22 0.0031790084521256465 23 0.0027595559480257346 -24 0.0022770278793995207 -25 0.001986880282578529 -26 0.0018008073672259367 -27 0.0016368108994575502 -28 0.001510659770404945 -29 0.0014412766494260123 -30 0.00125520373407342 -31 0.0011984357259997476 -32 0.0010722845969471427 -33 0.001006055254194525 +24 0.0025230225810521003 +25 0.002191875867289012 +26 0.0019963416172574743 +27 0.0018764980446574996 +28 0.0015201211050838905 +29 0.0012962028510155165 +30 0.0013119717421470921 +31 0.0011700517219629116 +32 9.082881291787562E-4 +33 9.429796896682225E-4 34 8.672890122366595E-4 -35 8.199823388419326E-4 -36 7.915983348050965E-4 -37 6.843698751103823E-4 -38 6.812160968840671E-4 -39 6.2760186703671E-4 -40 5.172196291156806E-4 -41 4.478365081367478E-4 -42 5.01450737984105E-4 -43 3.847609436104453E-4 -44 4.1314494764728145E-4 -45 3.8160716538413017E-4 -46 3.595307177999243E-4 -47 3.343004919894033E-4 -48 3.469156048946638E-4 -49 2.6491737101047054E-4 -50 2.996089314999369E-4 -51 2.4599470165257976E-4 -52 2.712249274631008E-4 -53 2.239182540683739E-4 -54 2.2707203229468904E-4 -55 2.2707203229468904E-4 -56 2.0184180648416804E-4 -57 1.860729153525924E-4 -58 1.9238047180522266E-4 -59 1.8291913712627727E-4 -60 1.8922669357890754E-4 -61 1.5453513308944116E-4 -62 1.5768891131575627E-4 -63 1.4507379841049577E-4 -64 1.5453513308944116E-4 +35 7.758294436735209E-4 +36 7.663681089945755E-4 +37 6.969849880156427E-4 +38 6.654472057524914E-4 +39 5.739876371893528E-4 +40 5.046045162104201E-4 +41 5.392960766998864E-4 +42 5.203734073419957E-4 +43 4.1314494764728145E-4 +44 4.036836129683361E-4 +45 4.667591774946386E-4 +46 3.311467137630882E-4 +47 3.4060804844203354E-4 +48 3.311467137630882E-4 +49 2.712249274631008E-4 +50 3.6268449602623945E-4 +51 2.743787056894159E-4 +52 2.5230225810521004E-4 +53 2.743787056894159E-4 +54 2.491484798788949E-4 +55 2.1445691938942854E-4 +56 2.1761069761574365E-4 +57 1.7030402422101677E-4 +58 1.734578024473319E-4 +59 1.608426895420714E-4 +60 1.3876624195786552E-4 +61 1.6715024599470166E-4 +62 1.7976535889996216E-4 +63 1.3876624195786552E-4 +64 1.2615112905260502E-4 65 1.2615112905260502E-4 -66 1.0092090324208402E-4 -67 1.2615112905260502E-4 -68 9.461334678945377E-5 -69 1.103822379210294E-4 -70 7.569067743156301E-5 +66 1.356124637315504E-4 +67 7.569067743156301E-5 +68 1.1353601614734452E-4 +69 9.145956856313863E-5 +70 6.307556452630251E-5 71 1.0407468146839915E-4 -72 7.884445565787813E-5 -73 9.461334678945377E-5 -74 9.461334678945377E-5 -75 8.830579033682351E-5 -76 8.199823388419326E-5 -77 6.307556452630251E-5 -78 7.884445565787813E-5 -79 6.307556452630251E-5 +72 9.145956856313863E-5 +73 9.77671250157689E-5 +74 7.569067743156301E-5 +75 8.515201211050838E-5 +76 1.0722845969471427E-4 +77 8.515201211050838E-5 +78 1.0722845969471427E-4 +79 6.622934275261763E-5 80 7.253689920524788E-5 -81 6.307556452630251E-5 -82 4.4152895168411754E-5 -83 6.307556452630251E-5 -84 6.307556452630251E-5 -85 6.307556452630251E-5 -86 5.9921786299987385E-5 -87 5.3614229847357136E-5 -88 4.099911694209663E-5 -89 5.046045162104201E-5 -90 4.7306673394726886E-5 -91 4.7306673394726886E-5 -92 6.938312097893276E-5 -93 4.099911694209663E-5 -94 2.5230225810521005E-5 -95 5.676800807367226E-5 -96 2.838400403683613E-5 -97 3.469156048946638E-5 -98 4.4152895168411754E-5 -99 3.7845338715781505E-5 -100 4.7306673394726886E-5 -101 1.5768891131575628E-5 -102 4.7306673394726886E-5 -103 4.099911694209663E-5 -104 3.1537782263151255E-5 -105 2.838400403683613E-5 -106 1.5768891131575628E-5 -107 2.2076447584205877E-5 -108 3.7845338715781505E-5 -109 2.5230225810521005E-5 +81 5.046045162104201E-5 +82 6.307556452630251E-5 +83 7.884445565787813E-5 +84 7.253689920524788E-5 +85 5.676800807367226E-5 +86 6.307556452630251E-5 +87 5.676800807367226E-5 +88 4.4152895168411754E-5 +89 2.5230225810521005E-5 +90 3.7845338715781505E-5 +91 6.307556452630251E-5 +92 3.469156048946638E-5 +93 2.838400403683613E-5 +94 5.676800807367226E-5 +95 4.099911694209663E-5 +96 4.4152895168411754E-5 +97 4.4152895168411754E-5 +98 3.469156048946638E-5 +99 1.5768891131575628E-5 +100 3.7845338715781505E-5 +101 4.099911694209663E-5 +102 2.838400403683613E-5 +103 3.7845338715781505E-5 +104 4.7306673394726886E-5 +105 3.469156048946638E-5 +106 2.5230225810521005E-5 +107 1.5768891131575628E-5 +108 4.099911694209663E-5 +109 1.8922669357890752E-5 110 3.1537782263151255E-5 -111 2.838400403683613E-5 -112 2.838400403683613E-5 -113 2.2076447584205877E-5 -114 1.5768891131575628E-5 -115 2.5230225810521005E-5 -116 1.8922669357890752E-5 -117 2.5230225810521005E-5 -118 1.5768891131575628E-5 -119 1.8922669357890752E-5 -120 6.307556452630251E-6 +111 1.5768891131575628E-5 +112 1.8922669357890752E-5 +113 1.2615112905260503E-5 +114 4.099911694209663E-5 +115 1.8922669357890752E-5 +116 2.2076447584205877E-5 +117 1.5768891131575628E-5 +118 1.8922669357890752E-5 +119 2.2076447584205877E-5 +120 2.5230225810521005E-5 121 1.8922669357890752E-5 -122 2.838400403683613E-5 -123 1.8922669357890752E-5 -124 2.5230225810521005E-5 +122 1.2615112905260503E-5 +123 2.5230225810521005E-5 +124 2.2076447584205877E-5 125 1.8922669357890752E-5 -126 6.307556452630251E-6 -127 1.5768891131575628E-5 -128 9.461334678945376E-6 -129 1.5768891131575628E-5 -130 2.5230225810521005E-5 +126 2.5230225810521005E-5 +127 1.2615112905260503E-5 +128 1.8922669357890752E-5 +129 1.2615112905260503E-5 +130 1.2615112905260503E-5 131 2.2076447584205877E-5 132 1.5768891131575628E-5 -133 1.2615112905260503E-5 -134 1.5768891131575628E-5 -135 1.5768891131575628E-5 +133 2.5230225810521005E-5 +134 1.2615112905260503E-5 +135 3.1537782263151257E-6 136 1.2615112905260503E-5 137 1.2615112905260503E-5 -138 9.461334678945376E-6 -139 3.1537782263151255E-5 -140 9.461334678945376E-6 -141 2.838400403683613E-5 -142 6.307556452630251E-6 -143 1.2615112905260503E-5 -144 1.5768891131575628E-5 -145 1.5768891131575628E-5 -146 6.307556452630251E-6 -147 9.461334678945376E-6 -148 3.1537782263151257E-6 -149 6.307556452630251E-6 -150 9.461334678945376E-6 -151 9.461334678945376E-6 -152 9.461334678945376E-6 -153 9.461334678945376E-6 -154 1.8922669357890752E-5 -155 3.1537782263151257E-6 -156 6.307556452630251E-6 -157 6.307556452630251E-6 -158 1.5768891131575628E-5 -159 6.307556452630251E-6 +138 3.1537782263151255E-5 +139 1.2615112905260503E-5 +140 1.5768891131575628E-5 +141 2.2076447584205877E-5 +142 1.2615112905260503E-5 +143 3.1537782263151257E-6 +144 3.1537782263151257E-6 +145 6.307556452630251E-6 +146 9.461334678945376E-6 +147 2.2076447584205877E-5 +148 1.5768891131575628E-5 +149 9.461334678945376E-6 +150 2.2076447584205877E-5 +151 1.2615112905260503E-5 +152 1.2615112905260503E-5 +153 1.5768891131575628E-5 +154 9.461334678945376E-6 +155 9.461334678945376E-6 +156 3.1537782263151255E-5 +157 9.461334678945376E-6 +158 3.1537782263151257E-6 +159 1.2615112905260503E-5 160 6.307556452630251E-6 -161 9.461334678945376E-6 -162 6.307556452630251E-6 -163 9.461334678945376E-6 +161 6.307556452630251E-6 +162 1.2615112905260503E-5 +163 1.2615112905260503E-5 164 3.1537782263151257E-6 -165 1.2615112905260503E-5 -166 3.1537782263151257E-6 -167 6.307556452630251E-6 +165 9.461334678945376E-6 +166 6.307556452630251E-6 +167 1.2615112905260503E-5 168 3.1537782263151257E-6 -169 3.1537782263151257E-6 -170 9.461334678945376E-6 -171 3.1537782263151257E-6 +169 9.461334678945376E-6 +170 1.2615112905260503E-5 +171 6.307556452630251E-6 172 3.1537782263151257E-6 -173 2.2076447584205877E-5 -174 1.8922669357890752E-5 -175 6.307556452630251E-6 +173 9.461334678945376E-6 +175 1.2615112905260503E-5 176 9.461334678945376E-6 -177 3.1537782263151257E-6 -178 3.1537782263151257E-6 -180 1.2615112905260503E-5 -181 9.461334678945376E-6 -182 1.2615112905260503E-5 -183 6.307556452630251E-6 -184 1.2615112905260503E-5 +177 6.307556452630251E-6 +179 6.307556452630251E-6 +180 3.1537782263151257E-6 +181 6.307556452630251E-6 +182 9.461334678945376E-6 +183 1.8922669357890752E-5 +184 3.1537782263151257E-6 185 3.1537782263151257E-6 -186 9.461334678945376E-6 -188 6.307556452630251E-6 -190 6.307556452630251E-6 -191 9.461334678945376E-6 -192 3.1537782263151257E-6 -193 6.307556452630251E-6 -195 6.307556452630251E-6 +186 3.1537782263151257E-6 +187 3.1537782263151257E-6 +188 1.2615112905260503E-5 +189 6.307556452630251E-6 +190 9.461334678945376E-6 +192 6.307556452630251E-6 +194 3.1537782263151257E-6 196 3.1537782263151257E-6 -197 3.1537782263151257E-6 -198 3.1537782263151257E-6 -199 6.307556452630251E-6 +198 6.307556452630251E-6 +199 9.461334678945376E-6 200 3.1537782263151257E-6 -202 6.307556452630251E-6 +201 3.1537782263151257E-6 +202 9.461334678945376E-6 203 3.1537782263151257E-6 -204 1.2615112905260503E-5 +204 3.1537782263151257E-6 205 3.1537782263151257E-6 206 3.1537782263151257E-6 207 3.1537782263151257E-6 -208 3.1537782263151257E-6 -209 6.307556452630251E-6 +208 6.307556452630251E-6 210 6.307556452630251E-6 -211 6.307556452630251E-6 -213 6.307556452630251E-6 -214 6.307556452630251E-6 -215 6.307556452630251E-6 -217 6.307556452630251E-6 +212 3.1537782263151257E-6 +214 3.1537782263151257E-6 +215 3.1537782263151257E-6 +216 3.1537782263151257E-6 +217 3.1537782263151257E-6 +218 6.307556452630251E-6 +219 9.461334678945376E-6 221 3.1537782263151257E-6 -222 6.307556452630251E-6 -223 3.1537782263151257E-6 -226 3.1537782263151257E-6 +222 3.1537782263151257E-6 +227 3.1537782263151257E-6 228 3.1537782263151257E-6 -230 9.461334678945376E-6 -231 9.461334678945376E-6 -232 3.1537782263151257E-6 +229 3.1537782263151257E-6 +231 3.1537782263151257E-6 233 3.1537782263151257E-6 234 3.1537782263151257E-6 -235 3.1537782263151257E-6 -236 3.1537782263151257E-6 238 3.1537782263151257E-6 -240 3.1537782263151257E-6 -242 1.2615112905260503E-5 -243 3.1537782263151257E-6 -244 6.307556452630251E-6 -247 3.1537782263151257E-6 -249 3.1537782263151257E-6 -250 6.307556452630251E-6 -254 9.461334678945376E-6 +241 3.1537782263151257E-6 +243 6.307556452630251E-6 +245 6.307556452630251E-6 +246 3.1537782263151257E-6 +248 3.1537782263151257E-6 +250 3.1537782263151257E-6 +252 3.1537782263151257E-6 +254 3.1537782263151257E-6 255 3.1537782263151257E-6 -256 3.1537782263151257E-6 -259 6.307556452630251E-6 +257 3.1537782263151257E-6 +258 3.1537782263151257E-6 +259 3.1537782263151257E-6 +260 3.1537782263151257E-6 +261 6.307556452630251E-6 +262 6.307556452630251E-6 263 3.1537782263151257E-6 264 3.1537782263151257E-6 -265 6.307556452630251E-6 -266 3.1537782263151257E-6 -267 6.307556452630251E-6 -269 3.1537782263151257E-6 -270 3.1537782263151257E-6 -272 3.1537782263151257E-6 -273 6.307556452630251E-6 -278 9.461334678945376E-6 -281 3.1537782263151257E-6 -283 3.1537782263151257E-6 +265 3.1537782263151257E-6 +270 6.307556452630251E-6 +271 3.1537782263151257E-6 +272 9.461334678945376E-6 +274 6.307556452630251E-6 +276 6.307556452630251E-6 +278 6.307556452630251E-6 +279 3.1537782263151257E-6 284 3.1537782263151257E-6 -285 6.307556452630251E-6 -286 3.1537782263151257E-6 -288 6.307556452630251E-6 -292 3.1537782263151257E-6 -293 9.461334678945376E-6 -294 3.1537782263151257E-6 -295 6.307556452630251E-6 +285 9.461334678945376E-6 +286 9.461334678945376E-6 +291 3.1537782263151257E-6 +297 3.1537782263151257E-6 298 3.1537782263151257E-6 -299 3.1537782263151257E-6 -300 3.1537782263151257E-6 -303 3.1537782263151257E-6 -304 3.1537782263151257E-6 -306 6.307556452630251E-6 -310 3.1537782263151257E-6 -317 3.1537782263151257E-6 -318 3.1537782263151257E-6 -326 3.1537782263151257E-6 -334 3.1537782263151257E-6 -336 3.1537782263151257E-6 +302 6.307556452630251E-6 +317 6.307556452630251E-6 +321 3.1537782263151257E-6 +322 3.1537782263151257E-6 +325 3.1537782263151257E-6 +333 3.1537782263151257E-6 +337 3.1537782263151257E-6 338 3.1537782263151257E-6 -341 3.1537782263151257E-6 -342 3.1537782263151257E-6 -345 6.307556452630251E-6 +339 3.1537782263151257E-6 347 3.1537782263151257E-6 -348 3.1537782263151257E-6 -349 3.1537782263151257E-6 -358 3.1537782263151257E-6 -368 3.1537782263151257E-6 -373 3.1537782263151257E-6 -375 3.1537782263151257E-6 -376 3.1537782263151257E-6 -378 3.1537782263151257E-6 -391 3.1537782263151257E-6 -411 3.1537782263151257E-6 -420 3.1537782263151257E-6 -428 6.307556452630251E-6 -430 6.307556452630251E-6 +354 3.1537782263151257E-6 +355 3.1537782263151257E-6 +357 3.1537782263151257E-6 +361 3.1537782263151257E-6 +362 3.1537782263151257E-6 +363 3.1537782263151257E-6 +384 6.307556452630251E-6 +389 3.1537782263151257E-6 +399 3.1537782263151257E-6 +400 6.307556452630251E-6 +402 3.1537782263151257E-6 +415 6.307556452630251E-6 +416 3.1537782263151257E-6 +417 3.1537782263151257E-6 +422 6.307556452630251E-6 +423 3.1537782263151257E-6 +430 3.1537782263151257E-6 432 3.1537782263151257E-6 444 3.1537782263151257E-6 +450 3.1537782263151257E-6 453 3.1537782263151257E-6 -460 3.1537782263151257E-6 -468 3.1537782263151257E-6 -473 3.1537782263151257E-6 -481 3.1537782263151257E-6 -488 3.1537782263151257E-6 -490 3.1537782263151257E-6 -562 3.1537782263151257E-6 -591 3.1537782263151257E-6 -596 3.1537782263151257E-6 -597 3.1537782263151257E-6 -601 3.1537782263151257E-6 -639 3.1537782263151257E-6 -644 3.1537782263151257E-6 -648 3.1537782263151257E-6 -654 3.1537782263151257E-6 -666 3.1537782263151257E-6 +458 3.1537782263151257E-6 +482 3.1537782263151257E-6 +501 3.1537782263151257E-6 +523 3.1537782263151257E-6 +528 3.1537782263151257E-6 +544 3.1537782263151257E-6 +546 3.1537782263151257E-6 +558 3.1537782263151257E-6 +560 3.1537782263151257E-6 +581 3.1537782263151257E-6 +612 3.1537782263151257E-6 +618 3.1537782263151257E-6 +667 3.1537782263151257E-6 +670 3.1537782263151257E-6 672 3.1537782263151257E-6 -676 3.1537782263151257E-6 -697 3.1537782263151257E-6 -701 3.1537782263151257E-6 -702 3.1537782263151257E-6 -771 3.1537782263151257E-6 -846 3.1537782263151257E-6 -961 3.1537782263151257E-6 -974 3.1537782263151257E-6 -1074 3.1537782263151257E-6 -1097 3.1537782263151257E-6 -1107 3.1537782263151257E-6 -1159 3.1537782263151257E-6 -1166 3.1537782263151257E-6 -1303 3.1537782263151257E-6 -1329 3.1537782263151257E-6 -1527 3.1537782263151257E-6 +682 3.1537782263151257E-6 +693 3.1537782263151257E-6 +784 3.1537782263151257E-6 +789 3.1537782263151257E-6 +824 3.1537782263151257E-6 +882 3.1537782263151257E-6 +954 3.1537782263151257E-6 +1008 3.1537782263151257E-6 +1051 3.1537782263151257E-6 +1257 3.1537782263151257E-6 +1459 3.1537782263151257E-6 +1580 3.1537782263151257E-6 +1661 3.1537782263151257E-6 diff --git a/comparison_results.txt b/comparison_results.txt index c922100..d19a83c 100644 --- a/comparison_results.txt +++ b/comparison_results.txt @@ -2,12 +2,12 @@ Comparaison des réseaux générés : Réseau aléatoire : Nombre de noeuds : 317080 -Nombre de liens : 1049119 -Degré moyen : 6,6174 +Nombre de liens : 1050369 +Degré moyen : 6,6253 Coefficient de clustering : 0,0000 Réseau Barabási-Albert : Nombre de noeuds : 317080 -Nombre de liens : 1110120 -Degré moyen : 7,0021 +Nombre de liens : 1110048 +Degré moyen : 7,0017 Coefficient de clustering : 0,0004 diff --git a/random_degree_distribution.txt b/random_degree_distribution.txt index d350b69..17a6220 100644 --- a/random_degree_distribution.txt +++ b/random_degree_distribution.txt @@ -1,49 +1,46 @@ # Degree Probability -0 0.008404818973129809 -1 0.03444871956604011 -2 0.07259997476977419 -3 0.1079853664690299 -4 0.12453639460073168 -5 0.12400971363693705 -6 0.11061877128800303 -7 0.09228901223665952 -8 0.07288066103191623 -9 0.057897060678693074 -10 0.04512741264034313 -11 0.03466948404188217 -12 0.026867036709978556 -13 0.020619402043648292 -14 0.015699508010596695 -15 0.01218304528825533 -16 0.009209032420840167 -17 0.007045540557587991 -18 0.005219502964551532 -19 0.004049451242588621 -20 0.003062318657751987 -21 0.0024788696858836887 -22 0.0020373407341995713 -23 0.001302510407468147 -24 9.80825028384004E-4 -25 9.05134350952441E-4 -26 6.969849880156427E-4 -27 4.951431815314747E-4 -28 4.0052983474202095E-4 -29 2.996089314999369E-4 -30 2.491484798788949E-4 -31 1.6715024599470166E-4 -32 1.103822379210294E-4 -33 1.5768891131575627E-4 -34 6.622934275261763E-5 -35 6.622934275261763E-5 -36 3.469156048946638E-5 -37 3.7845338715781505E-5 -38 2.5230225810521005E-5 -39 6.307556452630251E-6 -40 9.461334678945376E-6 -41 6.307556452630251E-6 -42 3.1537782263151257E-6 -43 1.8922669357890752E-5 -44 6.307556452630251E-6 -47 6.307556452630251E-6 -48 6.307556452630251E-6 -51 3.1537782263151257E-6 +0 0.00843004919894033 +1 0.034262646650687525 +2 0.07335057398763718 +3 0.10682477608174593 +4 0.12378264160464236 +5 0.12347357133846348 +6 0.11095937933644506 +7 0.09248454648669105 +8 0.07402232874984231 +9 0.05880534880787183 +10 0.0447868045919011 +11 0.03459694714267693 +12 0.02626151129052605 +13 0.020524788696858837 +14 0.01559227955090198 +15 0.012233505739876372 +16 0.009010344392582314 +17 0.007159076573735335 +18 0.005370884319414659 +19 0.004345906395862243 +20 0.0030970102182414534 +21 0.00250409991169421 +22 0.002002649173710105 +23 0.0014160464236154914 +24 0.0010344392582313613 +25 8.389050081998233E-4 +26 6.875236533366973E-4 +27 4.793742903998991E-4 +28 4.2576006055254195E-4 +29 3.1537782263151254E-4 +30 1.9238047180522266E-4 +31 1.608426895420714E-4 +32 1.2930490727892016E-4 +33 1.2299735082628988E-4 +34 7.253689920524788E-5 +35 5.9921786299987385E-5 +36 2.838400403683613E-5 +37 2.838400403683613E-5 +38 3.469156048946638E-5 +39 2.838400403683613E-5 +40 2.5230225810521005E-5 +41 1.8922669357890752E-5 +42 1.2615112905260503E-5 +43 3.1537782263151257E-6 +44 3.1537782263151257E-6 diff --git a/scenario1_no_control.dat b/scenario1_no_control.dat index 226310d..fda5e5c 100644 --- a/scenario1_no_control.dat +++ b/scenario1_no_control.dat @@ -1,90 +1,90 @@ -1 3.1537782263151257E-6 -2 9.461334678945376E-6 -3 1.0722845969471427E-4 -4 0.0014412766494260123 -5 0.016346032546991296 -6 0.14012552037340734 -7 0.46108553046549766 -8 0.616002270720323 -9 0.6426327740633279 -10 0.6503059164879526 -11 0.6505771414154157 -12 0.6537813800933518 -13 0.650700138766242 -14 0.6522770278793996 -15 0.6523243345527943 -16 0.6531443168916362 -17 0.6540052983474202 -18 0.6512268197300366 -19 0.6527248643875363 -20 0.6530812413271099 -21 0.6525577141415415 -22 0.6508042134477103 -23 0.6535700769521887 -24 0.6518071149236786 -25 0.6526081745931626 -26 0.6522202598713258 -27 0.6529834742020941 -28 0.6525671754762206 -29 0.6525766368108995 -30 0.6513498170808629 -31 0.6532452377948783 -32 0.6521130314116311 -33 0.651501198435726 -34 0.6515453513308944 -35 0.6530749337706573 -36 0.652652327488331 -37 0.6532294689037467 -38 0.6523590261132837 -39 0.6523905638955468 -40 0.6523779487826417 -41 0.6531632395609941 -42 0.6514192002018419 -43 0.6526712501576889 -44 0.6532736217989151 -45 0.6522644127664943 -46 0.6517440393591523 -47 0.6535732307304151 -48 0.6522265674277785 -49 0.6521035700769522 -50 0.6520278793995207 -51 0.6525104074681468 -52 0.6517471931373786 -53 0.6533272360287624 -54 0.651662041125268 -55 0.6538034565409361 -56 0.6516525797905891 -57 0.6533997729279677 -58 0.6521004162987258 -59 0.6530560111012994 -60 0.6524788696858836 -61 0.6513182792985998 -62 0.6525167150245995 -63 0.6527059417181784 -64 0.6519963416172575 -65 0.6534660022707203 -66 0.6524883310205626 -67 0.6523306421092468 -68 0.6528163239560995 -69 0.6541377570329254 -70 0.6520941087422732 -71 0.6513088179639208 -72 0.6533398511416677 -73 0.6508609814557841 -74 0.6542039863756781 -75 0.6522707203229469 -76 0.6524631007947521 -77 0.6523369496656996 -78 0.6527974012867415 -79 0.6517345780244733 -80 0.6526870190488205 -81 0.6514034313107102 -82 0.6526365585971995 -83 0.6521981834237417 -84 0.6526397123754257 -85 0.6524504856818468 -86 0.6531474706698625 -87 0.6518891131575627 -88 0.6539516841175729 -89 0.6514948908792734 -90 0.6527090954964047 +0 3.1537782263151257E-6 +1 2.5545603633152517E-5 +2 1.9742651696732683E-4 +3 0.0017793616752869938 +4 0.018638829317522396 +5 0.12560331777469408 +6 0.36179891510029016 +7 0.5434697868045919 +8 0.6287659265800429 +9 0.6452046802068878 +10 0.6511233758042134 +11 0.651804276523275 +12 0.6521026239434843 +13 0.6521581304402675 +14 0.6526775577141415 +15 0.652301311971742 +16 0.6525350069383121 +17 0.652376687271351 +18 0.6523940330515958 +19 0.6524047558975654 +20 0.6522704049451242 +21 0.6529677053109626 +22 0.6522599974769775 +23 0.6527939321306925 +24 0.6525340608048442 +25 0.6523110886842438 +26 0.6524987384887095 +27 0.6527207644758422 +28 0.6527892014633531 +29 0.6522489592531853 +30 0.6531891005424497 +31 0.6521609688406711 +32 0.6524031790084521 +33 0.6521928220007569 +34 0.6530162734956477 +35 0.6522312980951178 +36 0.6522915352592404 +37 0.652466569950801 +38 0.6526021824145327 +39 0.6524280938564401 +40 0.6523915100290147 +41 0.65248202346411 +42 0.6526813422480131 +43 0.6524318783903116 +44 0.6526728270468021 +45 0.6524605777721711 +46 0.652165384130188 +47 0.6524741390185442 +48 0.6525643370758168 +49 0.6523609183802195 +50 0.65269774189479 +51 0.6527333795887473 +52 0.6522041756023718 +53 0.6527819477734326 +54 0.6523880408729659 +55 0.6530093351835499 +56 0.6525687523653337 +57 0.6524634161725748 +58 0.6525485681846852 +59 0.6524479626592657 +60 0.6525375299608932 +61 0.6525965056137252 +62 0.6521581304402675 +63 0.6525968209915479 +64 0.6522407594297969 +65 0.6529103065472437 +66 0.652040494512426 +67 0.652215844581809 +68 0.6523344266431185 +69 0.6524378705689416 +70 0.6527794247508515 +71 0.6521786299987384 +72 0.6521988141793869 +73 0.6527803708843194 +74 0.6526050208149364 +75 0.652640343131071 +76 0.6521625457297842 +77 0.6521865144443043 +78 0.6530449728775073 +79 0.6525551911189607 +80 0.6524369244354737 +81 0.6526668348681721 +82 0.6524990538665321 +83 0.6524022328749842 +84 0.6527712249274631 +85 0.6526021824145327 +86 0.6524239939447459 +87 0.6524807619528195 +88 0.6526791346032547 +89 0.6520676170051722 diff --git a/scenario2_random_immunization.dat b/scenario2_random_immunization.dat index 09536c7..4a2fbaf 100644 --- a/scenario2_random_immunization.dat +++ b/scenario2_random_immunization.dat @@ -1,90 +1,90 @@ -1 5.2046737970697684E-6 -2 1.0409347594139537E-5 -3 1.0409347594139538E-4 -4 0.0011190048663700003 -5 0.006453795508366513 -6 0.041772711895281964 -7 0.1875660342988003 -8 0.38429229448044344 -9 0.46847789314804694 -10 0.48930699768392016 -11 0.49389231529913863 -12 0.4978374580373175 -13 0.4966872251281651 -14 0.49830067400525674 -15 0.4966247690426003 -16 0.49951336299997395 -17 0.49857131704270435 -18 0.49627605589819657 -19 0.4984047674811981 -20 0.4988888021443256 -21 0.49647383350248525 -22 0.497951960860853 -23 0.4973742420693783 -24 0.4963957633955292 -25 0.49816535248653293 -26 0.49754079163088455 -27 0.4984412001977776 -28 0.49643740078590576 -29 0.4972128971816691 -30 0.498321492700445 -31 0.4969422541442215 -32 0.4973898560907695 -33 0.49795716553465014 -34 0.49727014859343693 -35 0.4967340671923387 -36 0.49913862648658497 -37 0.4987586852993989 -38 0.4960626642725167 -39 0.49918546855075857 -40 0.4975303822832904 -41 0.49793634683946186 -42 0.4981497384651417 -43 0.4960314362297343 -44 0.4973013766362193 -45 0.4985504983475161 -46 0.4968225466468889 -47 0.49876388997319593 -48 0.4981341244437505 -49 0.4978062299945351 -50 0.49730658131001637 -51 0.49907096572722304 -52 0.4978530720587087 -53 0.4983423113956333 -54 0.4965987456736149 -55 0.4991646498555703 -56 0.498920030187108 -57 0.49608868764150205 -58 0.5000286257058839 -59 0.4974210841335519 -60 0.49747833554531967 -61 0.4986650011710516 -62 0.4974731308715226 -63 0.49754079163088455 -64 0.4988679834491373 -65 0.49550576417623027 -66 0.49849845160954537 -67 0.49821219455070653 -68 0.499143831160382 -69 0.4962812605719937 -70 0.4983527207432274 -71 0.4967392718661358 -72 0.49860774975928385 -73 0.498769094646993 -74 0.49736903739558125 -75 0.4993988601764384 -76 0.49767611314960836 -77 0.4969682775132069 -78 0.49808728237957683 -79 0.49693704947042444 -80 0.49826424128867725 -81 0.4977906159731439 -82 0.49757201967366693 -83 0.4972649439196398 -84 0.499143831160382 -85 0.49679131860410647 -86 0.49925833398391756 -87 0.49672886251854165 -88 0.4976552944544201 -89 0.49705675696775703 -90 0.49838394878600983 +0 2.5230225810521005E-6 +1 1.00920903242084E-5 +2 6.875236533366975E-5 +3 5.329885202472563E-4 +4 0.0042002018418064845 +5 0.022203229468903747 +6 0.06266998864639838 +7 0.10814873218115302 +8 0.14177305411883437 +9 0.16356692317396243 +10 0.17126781884697867 +11 0.17334742020941088 +12 0.17503784533871578 +13 0.17493061687902106 +14 0.17523842563390943 +15 0.1752680711492368 +16 0.17543395988394098 +17 0.1754093604137757 +18 0.17530654724359782 +19 0.17515895042260626 +20 0.17552605020814938 +21 0.17544972877507253 +22 0.17518544215970733 +23 0.17525671754762204 +24 0.17543017535006938 +25 0.17526744039359152 +26 0.17560363315251673 +27 0.17535259240570206 +28 0.17552352718556832 +29 0.17530087044279047 +30 0.17550838905008198 +31 0.1753841301879652 +32 0.17522707203229468 +33 0.17524157941213575 +34 0.17526933266052733 +35 0.17536773054118832 +36 0.1754642361549136 +37 0.1748927715403053 +38 0.17549072789201464 +39 0.17504667591774944 +40 0.17518922669357892 +41 0.1754093604137757 +42 0.1754024221016778 +43 0.17535763845086413 +44 0.17523337958874732 +45 0.1749892771540305 +46 0.1753576384508641 +47 0.17509650561372522 +48 0.1756194020436483 +49 0.1751211050838905 +50 0.17545792859846093 +51 0.17529582439762836 +52 0.17511038223792103 +53 0.17523968714519994 +54 0.1751110129935663 +55 0.17566797022833355 +56 0.1753853916992557 +57 0.1749949539548379 +58 0.17553614229847356 +59 0.17500946133467896 +60 0.17515768891131578 +61 0.17532168537908416 +62 0.17517345780244734 +63 0.17531790084521257 +64 0.17553109625331148 +65 0.17542765232748833 +66 0.1754793742903999 +67 0.17533051595811783 +68 0.17525987132584836 +69 0.17559984861864514 +70 0.17498044657499684 +71 0.17536709978554307 +72 0.17530465497666203 +73 0.17534880787183044 +74 0.1753431310710231 +75 0.17526428661536522 +76 0.17551848114040622 +77 0.1752592405702031 +78 0.17505550649678317 +79 0.17562192506622934 +80 0.1751772423363189 +81 0.17550334300491988 +82 0.17551280433959882 +83 0.17507758294436732 +84 0.175302131954081 +85 0.17514885833228208 +86 0.1750801059669484 +87 0.17557398763718934 +88 0.17538349943231993 +89 0.17527564021697994 diff --git a/scenario3_selective_immunization.dat b/scenario3_selective_immunization.dat index df63900..74005c2 100644 --- a/scenario3_selective_immunization.dat +++ b/scenario3_selective_immunization.dat @@ -1,90 +1,90 @@ -1 0.0 -2 0.0 -3 0.0 -4 0.0 -5 0.0 -6 0.0 -7 0.0 -8 0.0 -9 0.0 -10 0.0 -11 0.0 -12 0.0 -13 0.0 -14 0.0 -15 0.0 -16 0.0 -17 0.0 -18 0.0 -19 0.0 -20 0.0 -21 0.0 -22 0.0 -23 0.0 -24 0.0 -25 0.0 -26 0.0 -27 0.0 -28 0.0 -29 0.0 -30 0.0 -31 0.0 -32 0.0 -33 0.0 -34 0.0 -35 0.0 -36 0.0 -37 0.0 -38 0.0 -39 0.0 -40 0.0 -41 0.0 -42 0.0 -43 0.0 -44 0.0 -45 0.0 -46 0.0 -47 0.0 -48 0.0 -49 0.0 -50 0.0 -51 0.0 -52 0.0 -53 0.0 -54 0.0 -55 0.0 -56 0.0 -57 0.0 -58 0.0 -59 0.0 -60 0.0 -61 0.0 -62 0.0 -63 0.0 -64 0.0 -65 0.0 -66 0.0 -67 0.0 -68 0.0 -69 0.0 -70 0.0 -71 0.0 -72 0.0 -73 0.0 -74 0.0 -75 0.0 -76 0.0 -77 0.0 -78 0.0 -79 0.0 -80 0.0 -81 0.0 -82 0.0 -83 0.0 -84 0.0 -85 0.0 -86 0.0 -87 0.0 -88 0.0 -89 0.0 -90 0.0 +0 2.7877642639591863E-6 +1 9.290921336275931E-6 +2 2.5552184282742974E-5 +3 4.227183723655387E-5 +4 7.10667945219417E-5 +5 1.3794410745779871E-4 +6 2.730817435205772E-4 +7 5.712304887126052E-4 +8 0.0011359362655491768 +9 0.0021803445124751594 +10 0.003729984208990259 +11 0.005882884471685467 +12 0.008332649766783613 +13 0.011158765619388045 +14 0.014283353296852697 +15 0.017761297072176642 +16 0.021069154377786357 +17 0.024938162608621972 +18 0.028409087031469594 +19 0.03182827318183584 +20 0.03453287499869302 +21 0.0366869933833253 +22 0.038358082921729875 +23 0.03947937602329108 +24 0.04056800370254974 +25 0.04111056044132006 +26 0.041614059512415834 +27 0.04178931411300846 +28 0.041950660354575384 +29 0.04199712761652779 +30 0.0420850593973851 +31 0.042203532234897846 +32 0.04200011386986776 +33 0.042238002685254586 +34 0.04221892265594672 +35 0.04229083695953626 +36 0.04220462979769949 +37 0.04224071878658427 +38 0.04217807398500982 +39 0.042198446335210416 +40 0.04220129047282198 +41 0.042237043135195884 +42 0.04234673679432644 +43 0.04223985128865133 +44 0.04227143884427891 +45 0.04223797535340092 +46 0.042322021737373976 +47 0.04224268804969884 +48 0.04230583724798888 +49 0.042130237130444656 +50 0.0422560823666579 +51 0.0421934306961686 +52 0.04225055333698121 +53 0.042131158139906685 +54 0.04241271195544329 +55 0.04227281776830208 +56 0.04219194825538919 +57 0.04233782809946251 +58 0.042179922532099415 +59 0.0422342163422708 +60 0.042141848933470324 +61 0.042288092915957455 +62 0.042186361508082644 +63 0.042155305764309925 +64 0.04232534767562483 +65 0.04232538461716652 +66 0.04232615584683505 +67 0.04215534493678422 +68 0.042272796479068384 +69 0.04220967674998873 +70 0.04234018210162396 +71 0.0423299382208536 +72 0.042214719608838276 +73 0.042209171251706465 +74 0.04211117133914459 +75 0.04226215929990308 +76 0.04219851746731293 +77 0.04239835724002701 +78 0.04226397984170348 +79 0.042306303610028254 +80 0.04226027920982537 +81 0.04214317845704245 +82 0.042401982540311724 +83 0.04213109118564309 +84 0.04231602140712465 +85 0.04221470109483367 +86 0.04223802304647817 +87 0.0423322443955485 +88 0.04213760877456858 +89 0.04232621600720706 diff --git a/src/main/java/org/example/DBLPNetworkAnalysis.java b/src/main/java/org/example/DBLPNetworkAnalysis.java index 4ae5db6..9eb3a00 100644 --- a/src/main/java/org/example/DBLPNetworkAnalysis.java +++ b/src/main/java/org/example/DBLPNetworkAnalysis.java @@ -37,8 +37,16 @@ public class DBLPNetworkAnalysis { boolean isConnected = Toolkit.isConnected(graph); double minAverageDegreeForConnectivity = Math.log(nodeCount); - // Estimation de la distance moyenne par échantillonnage + // Calculer la distance moyenne dans un réseau aléatoire + + double degreeAverage = Toolkit.averageDegree(graph); + double NetworkDistance = Math.log(graph.getNodeCount()) / Math.log(degreeAverage); + System.out.println("Distance moyenne dans notre réseau : " + NetworkDistance); + calculerDistanceMoyenneEtSauvegarderDistribution(graph, "dist.txt"); + + // Estimation de la distance moyenne par échantillonnage +/* int sampleSize = 1000; List nodes = new ArrayList<>(); graph.nodes().forEach(nodes::add); @@ -74,11 +82,6 @@ public class DBLPNetworkAnalysis { } } - // Calculer la distance moyenne dans un réseau aléatoire - - double degreeAverage = Toolkit.averageDegree(graph); - double NetworkDistance = Math.log(graph.getNodeCount()) / Math.log(degreeAverage); - System.out.println("Distance moyenne dans notre réseau : " + NetworkDistance); // Sauvegarder la distribution des distances dans un fichier try (PrintWriter writer = new PrintWriter(new FileWriter("distance_distribution.dat"))) { @@ -90,7 +93,7 @@ public class DBLPNetworkAnalysis { } catch (IOException e) { e.printStackTrace(); } - +*/ //Calcul de la distribution des degrés calculateDegreeDistribution(graph, "degree_distribution.txt"); @@ -136,6 +139,7 @@ public class DBLPNetworkAnalysis { System.out.println("Réseau aléatoire :"); printGraphMeasures(randomGraph); calculateDegreeDistribution(randomGraph, "random_degree_distribution.txt"); + calculerDistanceMoyenneEtSauvegarderDistribution(randomGraph,"random.txt"); double degreeAverage = Toolkit.averageDegree(randomGraph); double NetworkDistance = Math.log(randomGraph.getNodeCount()) / Math.log(degreeAverage); System.out.println("Distance moyenne du réseau Aléatoire : " + NetworkDistance); @@ -147,6 +151,7 @@ public class DBLPNetworkAnalysis { System.out.println("Réseau Barabási-Albert :"); printGraphMeasures(baGraph); calculateDegreeDistribution(baGraph, "barabasi_degree_distribution.txt"); + calculerDistanceMoyenneEtSauvegarderDistribution(baGraph,"ba.txt"); // --- Sauvegarder les résultats --- @@ -194,6 +199,58 @@ public class DBLPNetworkAnalysis { return graphAlea; } + public static double calculerDistanceMoyenneEtSauvegarderDistribution(Graph graph, String outputFile) { + int sampleSize = 1000; // Taille de l'échantillon + List nodes = new ArrayList<>(); + graph.nodes().forEach(nodes::add); + + Random random = new Random(); + double totalDistance = 0; + int pairCount = 0; + Map distanceDistribution = new HashMap<>(); // Pour stocker les distances + + for (int i = 0; i < sampleSize; i++) { + Node startNode = nodes.get(random.nextInt(nodes.size())); + + // BFS à partir du nœud de départ + BreadthFirstIterator bfs = new BreadthFirstIterator(startNode, true); + Map distances = new HashMap<>(); + + while (bfs.hasNext()) { + Node node = bfs.next(); + int depth = bfs.getDepthOf(node); + distances.put(node, depth); + + // Enregistrer la distribution des distances + if (depth > 0) { + distanceDistribution.put(depth, distanceDistribution.getOrDefault(depth, 0) + 1); + } + } + + for (int distance : distances.values()) { + if (distance > 0) { + totalDistance += distance; + pairCount++; + } + } + } + + double averageDistance = totalDistance / pairCount; + System.out.println("Distance moyenne dans notre réseau : " + averageDistance); + + // Sauvegarder la distribution des distances dans un fichier + try (PrintWriter writer = new PrintWriter(new FileWriter(outputFile))) { + for (Map.Entry entry : distanceDistribution.entrySet()) { + writer.printf(Locale.US, "%d %f%n", entry.getKey(), + (double) entry.getValue() / pairCount); + } + System.out.println("Distribution des distances sauvegardée dans '" + outputFile + "'."); + } catch (IOException e) { + e.printStackTrace(); + } + + return averageDistance; + } // --- Génération d'un réseau Barabasi-Albert --- diff --git a/src/main/java/org/example/Propagation.java b/src/main/java/org/example/Propagation.java index 3a9c60c..65b5ed1 100644 --- a/src/main/java/org/example/Propagation.java +++ b/src/main/java/org/example/Propagation.java @@ -64,48 +64,60 @@ public class Propagation { } } } - - // Calcul du degré moyen pour le Groupe 0 (non immunisé) - double totalDegreeGroup0 = 0; - for (Node node : group0) { - totalDegreeGroup0 += node.getDegree(); - } - double averageDegreeGroup0 = group0.isEmpty() ? 0 : totalDegreeGroup0 / group0.size(); - System.out.printf("Degré moyen (Groupe 0 - Non immunisé) : %.9f%n", averageDegreeGroup0); - - // Calcul du degré moyen pour le Groupe 1 (voisins immunisés) - double totalDegreeGroup1 = 0; - for (Node node : group1) { - totalDegreeGroup1 += node.getDegree(); - } - double averageDegreeGroup1 = group1.isEmpty() ? 0 : totalDegreeGroup1 / group1.size(); - System.out.printf("Degré moyen (Groupe 1 - Voisins immunisés) : %.9f%n", averageDegreeGroup1); - // --- Paramètres --- int daysToSimulate = 90; // 3 mois double infectionProbability = 1.0; // β = 1 double recoveryProbability = 0.5; // μ = 0.5 - // Tableau pour stocker les résultats des scénarios + + // Nombre d'itérations pour chaque scénario + int iterations = 10; + +// Tableau pour stocker les résultats des scénarios double[][] results = new double[3][daysToSimulate]; String[] fileNames = {"scenario1_no_control.dat", "scenario2_random_immunization.dat", "scenario3_selective_immunization.dat"}; - // --- Scenarios --- - System.out.println("Scenario 1: No Control"); - results[0] = simulateAndCaptureResults(graph, infectionProbability, recoveryProbability, daysToSimulate, 0, false); +// --- Scénarios avec itérations --- + for (int scenario = 0; scenario < 3; scenario++) { + double[] averageFractions = new double[daysToSimulate]; + Arrays.fill(averageFractions, 0); // Initialiser à zéro pour chaque scénario + + for (int iteration = 0; iteration < iterations; iteration++) { + // Cloner le graphe pour garantir une nouvelle simulation à chaque itération + Graph graphClone = cloneGraph(graph); + + // Définir les paramètres spécifiques au scénario + double immunizationFraction = 0; + boolean randomImmunization = false; + + if (scenario == 1) { // Immunisation aléatoire + immunizationFraction = 0.5; + randomImmunization = true; + } else if (scenario == 2) { // Immunisation sélective + immunizationFraction = 0.5; + randomImmunization = false; + } - System.out.println("Scenario 2: Random Immunization"); - results[1] = simulateAndCaptureResults(graph, infectionProbability, recoveryProbability, daysToSimulate, 0.5, true); + // Exécuter la simulation et capturer les résultats + double[] fractions = simulateAndCaptureResults(graphClone, infectionProbability, recoveryProbability, daysToSimulate, immunizationFraction, randomImmunization); - System.out.println("Scenario 3: Selective Immunization"); - results[2] = simulateAndCaptureResults(graph, infectionProbability, recoveryProbability, daysToSimulate, 0.5, false); + // Ajouter les résultats de cette itération à la moyenne + for (int day = 0; day < daysToSimulate; day++) { + averageFractions[day] += fractions[day]; + } + } - // Sauvegarde des résultats dans des fichiers - saveResultsToFiles(results, fileNames); + // Diviser par le nombre d'itérations pour obtenir la moyenne + for (int day = 0; day < daysToSimulate; day++) { + averageFractions[day] /= iterations; + } - System.out.println("Les résultats ont été sauvegardés dans les fichiers pour Gnuplot."); + // Stocker les résultats du scénario + results[scenario] = averageFractions; - // Calculer les degrés moyens des groupes 0 et 1 + // Enregistrer les résultats dans un fichier + writeResultsToFile(fileNames[scenario], averageFractions); + } @@ -113,6 +125,24 @@ public class Propagation { epidemicThresholdAnalysis(graph,infectionProbability,recoveryProbability); + + // Calcul du degré moyen pour le Groupe 0 (non immunisé) + double totalDegreeGroup0 = 0; + for (Node node : group0) { + totalDegreeGroup0 += node.getDegree(); + } + double averageDegreeGroup0 = group0.isEmpty() ? 0 : totalDegreeGroup0 / group0.size(); + System.out.printf("Degré moyen (Groupe 0 - Non immunisé) : %.9f%n", averageDegreeGroup0); + + // Calcul du degré moyen pour le Groupe 1 (voisins immunisés) + double totalDegreeGroup1 = 0; + for (Node node : group1) { + totalDegreeGroup1 += node.getDegree(); + } + double averageDegreeGroup1 = group1.isEmpty() ? 0 : totalDegreeGroup1 / group1.size(); + System.out.printf("Degré moyen (Groupe 1 - Voisins immunisés) : %.9f%n", averageDegreeGroup1); + + // Réseau modifié après immunisation aléatoire System.out.println("Analyse après immunisation aléatoire :"); Graph randomImmunizedGraph = cloneGraph(graph); @@ -125,6 +155,45 @@ public class Propagation { applySelectiveImmunization(selectiveImmunizedGraph, 0.5); // 50% des voisins des hubs immunisés epidemicThresholdAnalysis(selectiveImmunizedGraph, infectionProbability, recoveryProbability); + Graph barabasiGraph = DBLPNetworkAnalysis.generateBarabasiAlbertGraph(graph); // Exemple : 3 connexions par nœud + + + System.out.println("Simulation sur réseau Barabási-Albert :"); + runSimulations(barabasiGraph); + + + } + // --- Méthode pour écrire les résultats dans un fichier --- + private static void writeResultsToFile(String fileName, double[] data) { + try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) { + for (int day = 0; day < data.length; day++) { + writer.write(day + " " + data[day]); + writer.newLine(); + } + } catch (IOException e) { + System.err.println("Erreur lors de l'écriture du fichier : " + e.getMessage()); + } + } + + + private static void runSimulations(Graph graph) { + int daysToSimulate = 90; // 3 mois + double infectionProbability = 1.0; // β = 1 + double recoveryProbability = 0.5; // μ = 0.5 + + // Scénario 1 : Aucune immunisation + System.out.println("Scénario 1 : Aucune immunisation"); + simulateAndCaptureResults(graph, infectionProbability, recoveryProbability, daysToSimulate, 0, false); + + // Scénario 2 : Immunisation aléatoire + System.out.println("Scénario 2 : Immunisation aléatoire"); + applyRandomImmunization(graph, 0.5); // Immunisation aléatoire de 50 % + simulateAndCaptureResults(graph, infectionProbability, recoveryProbability, daysToSimulate, 0, true); + + // Scénario 3 : Immunisation sélective + System.out.println("Scénario 3 : Immunisation sélective"); + applySelectiveImmunization(graph, 0.5); // Immunisation sélective de 50 % + simulateAndCaptureResults(graph, infectionProbability, recoveryProbability, daysToSimulate, 0, false); } private static Graph cloneGraph(Graph original) { @@ -159,7 +228,7 @@ public class Propagation { private static void applySelectiveImmunization(Graph graph, double fraction) { Random random = new Random(); - // Créer une liste des nœuds pour éviter les modifications concurrentes du graphe + // Créer une liste des nœuds var nodes = graph.nodes().toList(); for (Node node : nodes) { @@ -191,19 +260,6 @@ public class Propagation { System.out.println("Seuil épidémique réel (c_réel) : " + cReal); System.out.println("Seuil épidémique théorique (c_théorique) : " + cTheoretical); - // Prédiction dans le réseau réel - if (tau > cReal) { - System.out.println("La maladie persiste dans le réseau réel (τ > c_réel).\n"); - } else { - System.out.println("La maladie disparaît dans le réseau réel (τ < c_réel).\n"); - } - - // Comparaison avec le réseau aléatoire - if (cReal < cTheoretical) { - System.out.println("Le réseau réel est plus vulnérable que le réseau aléatoire (c_réel < c_théorique).\n"); - } else { - System.out.println("Le réseau réel est plus résistant que le réseau aléatoire (c_réel >= c_théorique).\n"); - } } @@ -219,24 +275,6 @@ public class Propagation { - private static void saveResultsToFiles(double[][] results, String[] fileNames) { - for (int i = 0; i < results.length; i++) { - try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileNames[i]))) { - for (int day = 0; day < results[i].length; day++) { - writer.write((day + 1) + "\t" + results[i][day]); - writer.newLine(); - } - } catch (IOException e) { - System.err.println("Erreur lors de l'écriture dans le fichier : " + fileNames[i]); - e.printStackTrace(); - } - } - } - - - - - private static double[] simulateAndCaptureResults(Graph graph, double infectionRate, double recoveryRate, int days, double immunizationFraction, boolean randomImmunization) { double[] infectedFractions = new double[days]; Random random = new Random(); @@ -251,10 +289,18 @@ public class Propagation { if (immunizationFraction > 0) { int immunizedCount = (int) (immunizationFraction * graph.getNodeCount()); if (randomImmunization) { - // Immunisation aléatoire : immuniser des nœuds directement + // Récupérer tous les nœuds dans une liste + List allNodes = new ArrayList<>(graph.nodes().toList()); + + // Mélanger la liste pour une sélection aléatoire unique + Collections.shuffle(allNodes, random); + + // Immuniser les premiers `immunizedCount` nœuds for (int i = 0; i < immunizedCount; i++) { - Node node = graph.getNode(random.nextInt(graph.getNodeCount())); - node.setAttribute("immune", true); + Node node = allNodes.get(i); + if (node != null) { + node.setAttribute("immune", true); + } } } else { // Immunisation sélective : immuniser un voisin pour 50% des nœuds existants @@ -323,40 +369,4 @@ public class Propagation { return infectedFractions; } - public static void calculateAverageDegrees(Graph graph, Set immune) { - // Groupes 0 (non immunisés) et 1 (immunisés) - Set group0 = new HashSet<>(); - Set group1 = immune; // Groupe 1 est directement le set 'immune' (les nœuds immunisés) - - // Ajouter 50 % des nœuds au groupe 0 - Random random = new Random(); - List nodes = new ArrayList<>(); - for (Node node : graph) { - nodes.add(node); - } - Collections.shuffle(nodes); // Mélanger les nœuds pour une sélection aléatoire - - int targetConvincers = graph.getNodeCount() / 2; // 50 % des nœuds - for (int i = 0; i < targetConvincers; i++) { - group0.add(nodes.get(i)); // Ajouter au groupe 0 - } - - // Calcul du degré moyen pour le groupe 0 (non immunisé) - double totalDegreeGroup0 = 0; - for (Node node : group0) { - totalDegreeGroup0 += node.getDegree(); - } - double averageDegreeGroup0 = group0.isEmpty() ? 0 : totalDegreeGroup0 / group0.size(); - System.out.println("Degré moyen du groupe 0 (non immunisé) : " + averageDegreeGroup0); - - // Calcul du degré moyen pour le groupe 1 (immunisé) - double totalDegreeGroup1 = 0; - for (Node node : group1) { - totalDegreeGroup1 += node.getDegree(); - } - double averageDegreeGroup1 = group1.isEmpty() ? 0 : totalDegreeGroup1 / group1.size(); - System.out.println("Degré moyen du groupe 1 (immunisé) : " + averageDegreeGroup1); - } - - } -- GitLab From e18f462f3671148d34f7986b9cc13e3256ce9bb0 Mon Sep 17 00:00:00 2001 From: ac243219 Date: Mon, 13 Jan 2025 22:57:49 +0100 Subject: [PATCH 2/3] Suite --- ba.txt | 10 ++++++++++ dist.txt | 20 ++++++++++++++++++++ propagation_simulation_2.png | Bin 0 -> 14807 bytes random.txt | 12 ++++++++++++ 4 files changed, 42 insertions(+) create mode 100644 ba.txt create mode 100644 dist.txt create mode 100644 propagation_simulation_2.png create mode 100644 random.txt diff --git a/ba.txt b/ba.txt new file mode 100644 index 0000000..3375381 --- /dev/null +++ b/ba.txt @@ -0,0 +1,10 @@ +1 0.000022 +2 0.000671 +3 0.015908 +4 0.185851 +5 0.519170 +6 0.251577 +7 0.025966 +8 0.000826 +9 0.000009 +10 0.000000 diff --git a/dist.txt b/dist.txt new file mode 100644 index 0000000..3223f68 --- /dev/null +++ b/dist.txt @@ -0,0 +1,20 @@ +1 0.000020 +2 0.000243 +3 0.002972 +4 0.026590 +5 0.127179 +6 0.276021 +7 0.286456 +8 0.171287 +9 0.071630 +10 0.025324 +11 0.008565 +12 0.002695 +13 0.000754 +14 0.000198 +15 0.000049 +16 0.000011 +17 0.000003 +18 0.000001 +19 0.000000 +20 0.000000 diff --git a/propagation_simulation_2.png b/propagation_simulation_2.png new file mode 100644 index 0000000000000000000000000000000000000000..cab708bdc24f562226f3e5493336d38c5a606b5c GIT binary patch literal 14807 zcmd6OXH=BivTb7`Nl-u(L81Z@B`86HNRBp0mL$+XBOp06X)7QS70FRRKysE00xFUb zXmXI8yUD2uZ++~u?>pzd^X~g`_Z{PnJw^-c?zPret7=x&oYilisLGKL(GbC4FcJlM zX>}OvJOd1NPKV$e_zM*!6)X7X(sLy_Y1k?B-^aSF4=@-5OhNk5Q@6ymak~%}3zLP7 zEZR|`KbkLejNFm^QEAPff(tAfAVo*(=s&|$zxhTn71Ax74v(y{WsiQy^>hB>gO)F? zv^)=4$5f`N4YJy;%#3Ks814ivMF^FMR_#0u;S&1UAy}WS7a&16VZcjG9`H@500lqJ zs;AuFqpjTSMX%-LVPcR$GCw<41-DXox28u`I`MbAK>p~;}CEAQMTfIJ$)=Y z9Ug5o`A6#o=7P#b@{?(^)*ZrKV|2OITHSGRw_i~tc| zyH;eH)IU!?6NkrjbyBD*0GG3XXM2tZ<$3Zo`o2)@#KeO>lLH*{kIac3m z!hCQ`5l$_|Q;knb5_h0g=%s@#_l4g_`PjKxAl$P?t^0+O47&HIV+%(yU8$S+$m>Es zsMCrc+ev7d;zj+2y@yf3HCqPrJTqTa8xcBKqakmhmXkr4I#_TY=~ z+&HRoTo4=+TCFRn!m}&$xqkC*-4ySst9i6*B0?chz0ckyn*Y2Yy{1?ywf1=Q<^D$I z(pvSa9{0>xHm+G}J(aP^-$sfW=ETYVV_RQ1_i|cU?=h-?tIO59Y$dl^t5k&9(qFce zWgCs5$4)5u2Wa+*6kboL))F1}Rzr9f_leC%FWh*~ArPNoD0ps?YO!ZIzb2GMQ!jN& zHiEZK;`m~atuy~taD2~$7I_^FB&Y9B@*>|j3$6Zoo=&PgWVGuoXWN2=!Y}ugyEE5G z@9fgEOCz`k<9=#dI@K73l%#2OU><3;Q)XPm`epgsHW7JizgtJQcg)E~e$bt;f9Rzk zem+@zjc$UrWt)bWf#w3I@jQulaE}G=-6xauSj^|?j}v2`(k%4^^J^yUe)OecX`1az zWkiuXWNxxdmqITxP=Ncr7ZN7FX1c6IRm!jV+0OqD_Fv{PwwPzUzGL9237v8kg1)=GkJ}tvE%aAS6%1uS*4Q@t1pEtdXXyReXdqrJ2aIK(Z_C-^TQoRSLk)7KO2bz6WoW2Ag_(IZqUdG(t zOCmMO;j*oym=E^I9(KQ7T04Q$n?MdYfJ>oV;ZYMv$Z#?G_1Tr`nqpJlXK{^gIW3+S z=f{P$k3XEW#KzobE3NJ0dSa9BR?oI1Y$gH@dgHr&qSYXt@PGG}jLD*b zy@2N?BCJL<0Wht<|9UG=s@a}KilA{DKp43a;c6p*s=$g1yT+l|oZJGBxhU;S1AtiM z8eua(xnABmH^5O?%XHlI{aqScX^-+fey)r-c7A5Ar1yxRIIE>q0S%A1%U8e}{|59* zbmMAe`TNXd^%VIv5VCqA%$=0{ed_V%iA)u< zN8R9v7t%$nkkXlPI}KF^*V^3i7)HteT$Y&{UY>iK#Gwu?HQUZv7%3Y**fv-7qFl`XG2JWI#;A`VTO&&xEkLI~5>;o)(>Z^y8pj4ok|hGp

Z9GEuzJCb8=u11g7|RbhGH8ZKcISA2^q)eZ3~kF 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 Date: Mon, 13 Jan 2025 23:57:11 +0100 Subject: [PATCH 3/3] version finale --- README.md | 21 +++++++++++++-------- distance_distribution.dat | 20 -------------------- propagation_simulation_2.png | Bin 14807 -> 22650 bytes propagationsimulation.png | Bin 22255 -> 0 bytes src/main/java/org/example/Propagation.java | 1 + 5 files changed, 14 insertions(+), 28 deletions(-) delete mode 100644 distance_distribution.dat delete mode 100644 propagationsimulation.png diff --git a/README.md b/README.md index 9a69fa9..9e8e332 100644 --- a/README.md +++ b/README.md @@ -115,8 +115,7 @@ System.out.println("Distance moyenne du réseau Aléatoire : " + NetworkDistance ``` Tracer les distributions des distances : - -![Distribution des distances](distance_distribution.png) +![Distribution des distances](dist_distribution_plot.png) ###### Analyse de la courbe des distances moyennes : @@ -167,7 +166,6 @@ public static Graph createRandomGraph(Graph initialGraph) { return graphAlea; } - ``` Les caractéristiques de ce graphe sont : @@ -188,6 +186,10 @@ j'ai aussi calculé les degrés de distribution à l'échelle linéaire et à l' ![Distribution des degrés](degree_distribution_loglog_random.png) +- Distribution des distances : + +![Distribution des distances](random_distribution_plot.png) + 2 - Le graphe Barabàsi-Albert: @@ -222,10 +224,10 @@ public static Graph generateBarabasiAlbertGraph(Graph initialGraph) { Les caractéristiques de ce graphe sont : -Nombre de nœuds : 317080 -Nombre de liens : 1108680 -Degré moyen : 6.993061542510986 -Coefficient de clustering : 4.235788849759945E-4 +- Nombre de nœuds : 317080 +- Nombre de liens : 1108680 +- Degré moyen : 6.993061542510986 +- Coefficient de clustering : 4.235788849759945E-4 j'ai aussi calculé les degrés de distribution à l'échelle linéaire et à l'échelle log-log @@ -238,6 +240,9 @@ j'ai aussi calculé les degrés de distribution à l'échelle linéaire et à l' ![Distribution des degrés](degree_distribution_loglog_ba.png) +- Distribution des distances : + +![Distribution des distances](ba_distribution_plot.png) Comparaison des réseaux générés @@ -289,7 +294,7 @@ En résumé, ces expériences confirment que le modèle Barabási-Albert est plu jouent un rôle important. ## 7- La méthode Copie : -La méthode de copie modifiée sert à générer un réseau en imitant des caractéristiques des réseaux réels, comme la formation +La méthode de copie sert à générer un réseau en imitant des caractéristiques des réseaux réels, comme la formation de triangles et un haut coefficient de clustering. Comment ça fonctionne ? diff --git a/distance_distribution.dat b/distance_distribution.dat deleted file mode 100644 index 2ec3ea4..0000000 --- a/distance_distribution.dat +++ /dev/null @@ -1,20 +0,0 @@ -1 0.000020 -2 0.000237 -3 0.002877 -4 0.026896 -5 0.131700 -6 0.284280 -7 0.284713 -8 0.164319 -9 0.069059 -10 0.024703 -11 0.008037 -12 0.002319 -13 0.000624 -14 0.000163 -15 0.000041 -16 0.000010 -17 0.000002 -18 0.000000 -19 0.000000 -20 0.000000 diff --git a/propagation_simulation_2.png b/propagation_simulation_2.png index cab708bdc24f562226f3e5493336d38c5a606b5c..06fb91118370266f1bc0659baa7a4471dce3755e 100644 GIT binary patch literal 22650 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 literal 14807 zcmd6OXH=BivTb7`Nl-u(L81Z@B`86HNRBp0mL$+XBOp06X)7QS70FRRKysE00xFUb zXmXI8yUD2uZ++~u?>pzd^X~g`_Z{PnJw^-c?zPret7=x&oYilisLGKL(GbC4FcJlM zX>}OvJOd1NPKV$e_zM*!6)X7X(sLy_Y1k?B-^aSF4=@-5OhNk5Q@6ymak~%}3zLP7 zEZR|`KbkLejNFm^QEAPff(tAfAVo*(=s&|$zxhTn71Ax74v(y{WsiQy^>hB>gO)F? zv^)=4$5f`N4YJy;%#3Ks814ivMF^FMR_#0u;S&1UAy}WS7a&16VZcjG9`H@500lqJ zs;AuFqpjTSMX%-LVPcR$GCw<41-DXox28u`I`MbAK>p~;}CEAQMTfIJ$)=Y z9Ug5o`A6#o=7P#b@{?(^)*ZrKV|2OITHSGRw_i~tc| zyH;eH)IU!?6NkrjbyBD*0GG3XXM2tZ<$3Zo`o2)@#KeO>lLH*{kIac3m z!hCQ`5l$_|Q;knb5_h0g=%s@#_l4g_`PjKxAl$P?t^0+O47&HIV+%(yU8$S+$m>Es zsMCrc+ev7d;zj+2y@yf3HCqPrJTqTa8xcBKqakmhmXkr4I#_TY=~ z+&HRoTo4=+TCFRn!m}&$xqkC*-4ySst9i6*B0?chz0ckyn*Y2Yy{1?ywf1=Q<^D$I z(pvSa9{0>xHm+G}J(aP^-$sfW=ETYVV_RQ1_i|cU?=h-?tIO59Y$dl^t5k&9(qFce zWgCs5$4)5u2Wa+*6kboL))F1}Rzr9f_leC%FWh*~ArPNoD0ps?YO!ZIzb2GMQ!jN& zHiEZK;`m~atuy~taD2~$7I_^FB&Y9B@*>|j3$6Zoo=&PgWVGuoXWN2=!Y}ugyEE5G z@9fgEOCz`k<9=#dI@K73l%#2OU><3;Q)XPm`epgsHW7JizgtJQcg)E~e$bt;f9Rzk zem+@zjc$UrWt)bWf#w3I@jQulaE}G=-6xauSj^|?j}v2`(k%4^^J^yUe)OecX`1az zWkiuXWNxxdmqITxP=Ncr7ZN7FX1c6IRm!jV+0OqD_Fv{PwwPzUzGL9237v8kg1)=GkJ}tvE%aAS6%1uS*4Q@t1pEtdXXyReXdqrJ2aIK(Z_C-^TQoRSLk)7KO2bz6WoW2Ag_(IZqUdG(t zOCmMO;j*oym=E^I9(KQ7T04Q$n?MdYfJ>oV;ZYMv$Z#?G_1Tr`nqpJlXK{^gIW3+S z=f{P$k3XEW#KzobE3NJ0dSa9BR?oI1Y$gH@dgHr&qSYXt@PGG}jLD*b zy@2N?BCJL<0Wht<|9UG=s@a}KilA{DKp43a;c6p*s=$g1yT+l|oZJGBxhU;S1AtiM z8eua(xnABmH^5O?%XHlI{aqScX^-+fey)r-c7A5Ar1yxRIIE>q0S%A1%U8e}{|59* zbmMAe`TNXd^%VIv5VCqA%$=0{ed_V%iA)u< zN8R9v7t%$nkkXlPI}KF^*V^3i7)HteT$Y&{UY>iK#Gwu?HQUZv7%3Y**fv-7qFl`XG2JWI#;A`VTO&&xEkLI~5>;o)(>Z^y8pj4ok|hGp

Z9GEuzJCb8=u11g7|RbhGH8ZKcISA2^q)eZ3~kF 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 l17N2EV7c9~=f5**D`_L_-E-G#x