<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Small World Project</title>
	<atom:link href="http://smallworldproject.free.fr/wordpress/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://smallworldproject.free.fr/wordpress</link>
	<description>groupe de recherches mathématiques</description>
	<pubDate>Fri, 05 Sep 2008 21:16:29 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Réseau d&#8217;affiliation et graphes bipartites</title>
		<link>http://smallworldproject.free.fr/wordpress/?p=190</link>
		<comments>http://smallworldproject.free.fr/wordpress/?p=190#comments</comments>
		<pubDate>Sat, 30 Aug 2008 09:42:28 +0000</pubDate>
		<dc:creator>Laetitia</dc:creator>
		
		<category><![CDATA[Laetitia]]></category>

		<guid isPermaLink="false">http://smallworldproject.free.fr/wordpress/?p=190</guid>
		<description><![CDATA[Théorie qui ne considère plus simplement les relations entre les personnes mais leur appartenance à certains groupes, associations&#8230;
 Cette nouvelle approche du Small World est due en grande partie à M.Newman
-&#62; Un des gros problèmes que l&#8217;on rencontre dans l&#8217;étude des réseaux sociaux est l&#8217;impartialité des données reçues lors de la construction du réseau: chaque personne [...]]]></description>
			<content:encoded><![CDATA[<p>Théorie qui ne considère plus simplement les relations entre les personnes mais leur appartenance à certains groupes, associations&#8230;</p>
<p> Cette nouvelle approche du Small World est due en grande partie à M.Newman</p>
<p>-&gt; Un des gros problèmes que l&#8217;on rencontre dans l&#8217;étude des réseaux sociaux est l&#8217;impartialité des données reçues lors de la construction du réseau: chaque personne du réseau n&#8217;a pas forcément la même notion de &#8220;connaissance&#8221; et cela peut donc biaiser les informations et nuire à l&#8217;étude du réseau. Un moyen plus simple de procéder et donc de ne plus prendre en compte les relations directes entre les personnes du réseau mais leur appartenance à certains groupes (associations sportives, clubs&#8230;). En plus d&#8217;améliorer la qualité du graphe, ce type de construction s&#8217;appuyant uniquement sur des bases de données permet de construire des graphes beaucoup plus gros et beaucoup plus rapidement qu&#8217;avec un modèle simple.</p>
<p>-&gt; Chaque graphe bipartite est donc composé de 2 parties : une partie représentant les groupes pris en compte pour l&#8217;étude du réseau et une partie représentant les personnes appartenant au réseau, chacune étant reliée au(x) groupe(s) au(x)quel(s) elle appartient. Il est possible, à partir d&#8217;un graphe bipartite, de revenir à un graphe simple (voir présentation power point) et ainsi appliquer les formules permettant de trouver la densité locale et le chemin moyen.</p>
<p><a href="http://smallworldproject.free.fr/wordpress/wp-content/uploads/2008/08/tipe2.ppt">TIPE - Réseau d\&#8217;affiliation</a></p>
]]></content:encoded>
			<wfw:commentRss>http://smallworldproject.free.fr/wordpress/?feed=rss2&amp;p=190</wfw:commentRss>
		</item>
		<item>
		<title>Introdution au modèle caml</title>
		<link>http://smallworldproject.free.fr/wordpress/?p=180</link>
		<comments>http://smallworldproject.free.fr/wordpress/?p=180#comments</comments>
		<pubDate>Wed, 27 Aug 2008 10:13:32 +0000</pubDate>
		<dc:creator>Francois</dc:creator>
		
		<category><![CDATA[Francois]]></category>

		<guid isPermaLink="false">http://smallworldproject.free.fr/wordpress/?p=180</guid>
		<description><![CDATA[Vous pouvez regarder ce petit power point, il mérite sans doute quelques explications, mais permet déjà de se faire une petite idée du travail que nous avons réalisé, de comment &#8220;marche&#8221; la théorie du small world, et plus particulièrement le modèle caml.
Petit détail sans doute important, les quelques lignes au début de la présentation:
type gens [...]]]></description>
			<content:encoded><![CDATA[<p>Vous pouvez regarder ce petit power point, il mérite sans doute quelques explications, mais permet déjà de se faire une petite idée du travail que nous avons réalisé, de comment &#8220;marche&#8221; la théorie du small world, et plus particulièrement le modèle caml.</p>
<p>Petit détail sans doute important, les quelques lignes au début de la présentation:</p>
<blockquote><p>type gens = {nom : string ; mutable relation : string list};;<br />
type monde = {mutable reseau:gens list};;</p></blockquote>
<p>représentent la manière dont j&#8217;ai simulé le monde. Le type gens, est un type qui représente les personnes, avec un nom et une liste de relation, et le type monde représente le réseau en lui même, avec simplement une liste de gens. Les relations entre les personnes étant déjà prises en compte dans le type gens, une liste de gens suffit à définir entièrement un réseau.</p>
<p><a href="http://smallworldproject.free.fr/wordpress/wp-content/uploads/2008/08/la-theorie-du-monde-est-petit1.ppt">Présentation power point</a></p>
]]></content:encoded>
			<wfw:commentRss>http://smallworldproject.free.fr/wordpress/?feed=rss2&amp;p=180</wfw:commentRss>
		</item>
		<item>
		<title>lignes de code</title>
		<link>http://smallworldproject.free.fr/wordpress/?p=177</link>
		<comments>http://smallworldproject.free.fr/wordpress/?p=177#comments</comments>
		<pubDate>Sun, 24 Aug 2008 08:50:57 +0000</pubDate>
		<dc:creator>Francois</dc:creator>
		
		<category><![CDATA[Francois]]></category>

		<guid isPermaLink="false">http://smallworldproject.free.fr/wordpress/?p=177</guid>
		<description><![CDATA[Je publie ici en vrac les lignes de code que j&#8217;ai déjà écrites, elles sont toutes commentées mais pas rangées, si vous avez le courage de jeter un oeil&#8230; Sinon je ferai le tri pour ne laisser que les lignes utiles plus tard.
(*typer un monde et des gens*)
type gens = {nom : string ; mutable [...]]]></description>
			<content:encoded><![CDATA[<p>Je publie ici en vrac les lignes de code que j&#8217;ai déjà écrites, elles sont toutes commentées mais pas rangées, si vous avez le courage de jeter un oeil&#8230; Sinon je ferai le tri pour ne laisser que les lignes utiles plus tard.</p>
<blockquote><p>(*typer un monde et des gens*)<br />
type gens = {nom : string ; mutable relation : string list};;<br />
type monde = {mutable reseau : gens list};;</p>
<p>(*une personne appartient elle au monde?*)<br />
let rec appartient p = fun monde -&gt;<br />
match monde.reseau with<br />
[] -&gt; false<br />
|(a::r) -&gt; (a = p) or (appartient p {reseau = r});;</p>
<p>(*créer un monde vide*)<br />
let creer_monde = fun () -&gt; {reseau = []};;</p>
<p>(*ajouter une personne à un monde*)<br />
let ajouter_gens p monde =<br />
if not(appartient p monde) then<br />
monde.reseau &lt;- p::(monde.reseau);;</p>
<p>(*creer une personne*)<br />
let creer_gens b = {nom = b; relation = []};;</p>
<p>(*test*)<br />
let m = creer_monde();;<br />
let bob = creer_gens &#8220;bob&#8221;;;<br />
ajouter_gens bob m;;<br />
appartient bob m;;</p>
<p>let aj_rel p1 p2 = p2.relation &lt;- (p1.nom)::(p2.relation);;</p>
<p>(*mettre une personne en tête du reseau d&#8217;un monde*)<br />
let rec en_tete p = fun monde -&gt;  match monde.reseau with<br />
[] -&gt; ajouter_gens p monde<br />
|(a::r) when a = p -&gt; ()<br />
|(a::r) -&gt; monde.reseau &lt;- r@[a]; en_tete p monde;;</p>
<p>(*ajouter une relation à un monde*)<br />
let ajouter_relation p1 p2 = fun monde -&gt; match monde.reseau with<br />
l when (appartient p1 monde) &amp;&amp; (appartient p2 monde) -&gt;<br />
en_tete p1 monde;<br />
let (a::r) = monde.reseau in<br />
aj_rel p2 a;<br />
monde.reseau &lt;- a::r;<br />
en_tete p2 monde;<br />
let (b::q) = monde.reseau in<br />
aj_rel p1 b;<br />
monde.reseau &lt;- (b::q)<br />
|l -&gt; aj_rel p1 p2;<br />
aj_rel p2 p1;<br />
ajouter_gens p1 monde; ajouter_gens p2 monde;;</p>
<p>(*test*)<br />
let m = {reseau = [{nom = "bob" ; relation = []};{nom = &#8220;a&#8221;; relation = []};{nom = &#8220;&#8221;;relation = []}]};;<br />
let a = {nom = &#8220;bob&#8221; ; relation = []} and<br />
b={nom = &#8220;a&#8221;; relation = []} and<br />
c = {nom = &#8220;&#8221;;relation = []} ;;<br />
ajouter_relation a b m;;</p>
<p>(*calculer le nombre de gens dans un monde*)<br />
let rec longueur_monde = fun monde -&gt; match monde.reseau with<br />
[] -&gt; 0<br />
|(a::r) -&gt; 1 + (longueur_monde {reseau    = r});;</p>
<p>(*créer un tableau à partir d&#8217;un monde*)<br />
let tableau_gens = fun monde -&gt;<br />
let n = longueur_monde monde in<br />
let t = make_vect n {nom=&#8221;";relation=[]} in<br />
let rec tabaux = fun<br />
-1 _ -&gt; ()<br />
|i [] -&gt; failwith &#8220;y&#8217;a nettement un problème&#8221;<br />
|i (a::r) -&gt; t.(i) &lt;- a;<br />
tabaux (i-1) r;<br />
in<br />
tabaux (n-1) monde.reseau;<br />
t;;</p>
<p>(*associer un numéro à une personne*)<br />
let clef a monde =<br />
let t = tableau_gens monde and cle = ref 0 in<br />
for i = 0 to ((longueur_monde monde)-1) do<br />
if a = t.(i) then cle := i;<br />
done;<br />
!cle;;</p>
<p>(*renvoie la personne assaciée à un nom*)<br />
let rec nom_gens s = fun monde -&gt;<br />
match monde.reseau with<br />
[] -&gt; failwith &#8220;le gars n&#8217;existe pas&#8221;<br />
|(a::r) when a.nom = s -&gt; a<br />
|(a::r) -&gt; nom_gens s {reseau = r};;</p>
<p>(*renvoie la liste des clef des relation d&#8217;une personne*)<br />
let rec list_rel = fun p monde -&gt;<br />
match p.relation with<br />
[] -&gt; []<br />
|(a::r) -&gt; (clef (nom_gens a monde) monde) :: (list_rel {nom = p.nom; relation = r} monde);;</p>
<p>(*renvoie le tableau des listes des relations*)<br />
let tableau_relation = fun monde -&gt;<br />
let t = make_vect (longueur_monde monde) [] in<br />
let rec tabaux = fun<br />
-1 _ -&gt; ()<br />
|i [] -&gt; failwith &#8220;y&#8217;a nettement un problème&#8221;<br />
|i (a::r) -&gt; t.(i) &lt;- list_rel a monde;<br />
tabaux (i-1) r;<br />
in<br />
tabaux ((longueur_monde monde)-1) monde.reseau;<br />
t;;</p>
<p>(*test*)<br />
tableau_relation m;;</p>
<p>#open &#8220;graphics&#8221;;;<br />
open_graph &#8220;&#8221;;;</p>
<p>(*dessine les points correspondant au gens sur un cercle*)<br />
let trace_gens = fun monde -&gt;<br />
let n = longueur_monde monde in<br />
for i = 0 to n do<br />
let i&#8217; = float_of_int i and n&#8217;=float_of_int n in<br />
let a = 400.+.300.*.cos(2.*.3.14159*.i&#8217;/.n&#8217;)<br />
and b = 400.+.300.*.sin(2.*.3.14159*.i&#8217;/.n&#8217;) in<br />
plot (int_of_float a) (int_of_float b)<br />
done;;</p>
<p>(*test*)<br />
trace_gens m;;</p>
<p>(*trace les relations entre les gens toujours sur un cercle*)<br />
let trace_rel = fun p monde -&gt;<br />
let cle = float_of_int (clef p monde) and n = float_of_int (longueur_monde monde) in<br />
let a = 400.+.300.*.cos(2.*.3.14159*.cle/.n)<br />
and b = 400.+.300.*.sin(2.*.3.14159*.cle/.n) in<br />
let rec traaux = fun<br />
[] -&gt; ()<br />
|(q::r) -&gt; let cle&#8217; = float_of_int (clef (nom_gens q monde) monde) in<br />
let c = 400.+.300.*.cos(2.*.3.14159*.cle&#8217;/.n)<br />
and d = 400.+.300.*.sin(2.*.3.14159*.cle&#8217;/.n) in<br />
moveto (int_of_float a) (int_of_float b);<br />
lineto (int_of_float c) (int_of_float d);<br />
traaux r;<br />
in<br />
traaux p.relation;;</p>
<p>(*trace le monde (les gens et les relations sur un cercle)*)<br />
let trace_monde = fun monde -&gt;<br />
clear_graph ();<br />
trace_gens monde;<br />
let l = ref monde.reseau in<br />
while !l &lt;&gt; [] do<br />
trace_rel (hd !l) monde;<br />
l := tl !l<br />
done;;</p>
<p>(*test*)<br />
trace_monde m;;</p>
<p>(*associe à une liste d&#8217;entiers une liste de chaines de caractères*)<br />
let rec string_list = fun<br />
|[] -&gt; []<br />
|(a::r) -&gt; (string_of_int a)::string_list r;;</p>
<p>(*associe à un tableau de listes d&#8217;entiers un monde*)<br />
let tableau_monde = fun tab -&gt;<br />
let monde = creer_monde () and n = vect_length tab in<br />
let t = make_vect n [] in<br />
for i = 0 to n-1 do<br />
t.(i) &lt;- string_list (tab.(i))<br />
done;<br />
for i = 0 to n-1 do<br />
ajouter_gens {nom = string_of_int i; relation = t.(i)} monde<br />
done;<br />
monde;;</p>
<p>(*test*)<br />
let t = [|[1;2];[3;0];[3;0];[1;2]|];;<br />
let mm = tableau_monde t;;<br />
trace_monde mm;;</p>
<p>(*crée un monde ordonné*)<br />
let monde_ordonne = fun n k -&gt;<br />
let t = make_vect n [] in<br />
for i = 0 to n-1 do<br />
for j=1 to k/2 do<br />
t.(i) &lt;-((n+i+j)mod n)::((n+i-j)mod n)::t.(i)<br />
done;<br />
done;<br />
tableau_monde t;;</p>
<p>(*test*)<br />
let monde = monde_ordonne 10 2;;<br />
trace_monde monde;;</p>
<p>(*met un nom en tête des relations d&#8217;une personne*)<br />
let rec tete = fun p1 p2 -&gt;<br />
match p2.relation with<br />
[] -&gt; p2.relation &lt;- [p1]<br />
|(a::r) when a = p1 -&gt; ()<br />
|(a::r) -&gt; p2.relation &lt;- r@[a];;</p>
<p>(*supprime une relation*)<br />
let sup_rel = fun a p -&gt;<br />
tete a p;<br />
match p.relation with<br />
[] -&gt; failwith &#8220;il ne connait personne!&#8221;<br />
|(a::r) -&gt; p.relation &lt;- r;;</p>
<p>(*supprime une relation entre 2 personnes (la première relation d&#8217;une personne)*)<br />
let sup_relation = fun n monde -&gt;<br />
let p = nom_gens n monde in<br />
match p.relation with<br />
[] -&gt; failwith &#8220;il ne connait personne&#8221;<br />
|(a::r) -&gt; let a&#8217; = nom_gens a monde in<br />
sup_rel a p;<br />
sup_rel p.nom a&#8217;;;</p>
<p>(*test*)<br />
let m = {reseau =<br />
[{nom = "a"; relation = ["bob";"1"]}; {nom = &#8220;&#8221;; relation = []};<br />
{nom = &#8220;bob&#8221;; relation = ["1";"a"]}; {nom=&#8221;1&#8243;;relation=["a";"bob"]}]};;<br />
sup_relation &#8220;a&#8221; m;;<br />
m;;</p>
<p>(*renvoie la personne associée à un monde*)<br />
let anti_clef = fun k monde -&gt;<br />
let t = tableau_gens monde in<br />
(nom_gens t.(k).nom monde);;</p>
<p>(*compte le nombre de relation d&#8217;une personne*)<br />
let rec nb_rel = fun p -&gt; match p.relation with<br />
|[] -&gt; 0<br />
|(a::r) -&gt; 1 + nb_rel {nom=&#8221;";relation=r};;</p>
<p>(*compte le nombre de relations dans un monde*)<br />
let nb_relation = fun monde -&gt;<br />
let rec nb = fun monde -&gt;<br />
match monde.reseau with<br />
[] -&gt; 0<br />
|(a::r) -&gt; (nb_rel a) + nb {reseau = r};<br />
in<br />
(nb monde)/2;;</p>
<p>(*dérange plus ou moins le monde*)<br />
let desordre = fun p monde -&gt;<br />
let n = nb_relation monde in<br />
let n&#8217; = longueur_monde monde in<br />
let k = int_of_float (p*.(float_of_int n)) in<br />
let i = ref 0 in<br />
while !i&lt;k do<br />
let i&#8217; = random__int (n&#8217;-1) in<br />
if ((anti_clef i&#8217; monde).relation &lt;&gt; []) then<br />
(begin<br />
sup_relation (anti_clef i&#8217; monde).nom monde;<br />
i:=!i+1;<br />
let i&#8221; = random__int (n&#8217;-1) and i&#8217; = random__int (n&#8217;-1) in<br />
ajouter_relation (anti_clef i&#8217; monde) (anti_clef i&#8221; monde) monde;<br />
end;)<br />
done;;</p>
<p>(*test*)<br />
let m&#8217;=monde_ordonne 50 10;;<br />
desordre 1. m&#8217;;;<br />
trace_monde m&#8217;;;</p>
<p>(*renvoie vrai si les 2 personnes sont en relation directe*)<br />
let rec rel p1 p2 = match p1.relation with<br />
[] -&gt; false<br />
|(a::r) -&gt; (a=p2.nom) or rel {nom=p1.nom;relation=r} p2;;</p>
<p>(*test*)<br />
monde_ordonne 10 2;;<br />
rel {nom = &#8220;9&#8243;; relation = ["0"; "8"]} {nom = &#8220;4&#8243;; relation = ["5"; "3"]};;</p>
<p>(*dis si les relation d&#8217;une personne (p1) sont en relation directe avec une autre personne (p2)*)<br />
let rec rel2 = fun p1 p2 monde -&gt; match p1.relation with<br />
|[] -&gt; false<br />
|(a::r) when (rel (nom_gens a monde) p2) -&gt; true<br />
|(a::r) -&gt; rel2 {nom=p1.nom;relation=r} p2 monde;;</p>
<p>(*dit si un élément appartient à une liste*)<br />
let rec app x = fun<br />
[] -&gt; false<br />
|(a::r) -&gt; if a=x then true else false;;</p>
<p>(*ajoute à une liste l&#8217;ensemble des liste de relation d&#8217;une personne*)<br />
let rec conc l p = match p.relation with<br />
[] -&gt; l<br />
|(a::r) -&gt; let k=conc l {nom=p.nom;relation=r} in<br />
if app a k then k<br />
else a::k;;</p>
<p>(*supprime les doublons dans une liste*)<br />
let rec sup_doub = fun<br />
[] -&gt; []<br />
|(a::r) -&gt; if (app a r) then r else a::sup_doub r;;</p>
<p>(*renvoie la liste des relation des relation d&#8217;une personne*)<br />
let rec rel_rel = fun p monde -&gt; match p.relation with<br />
[] -&gt; []<br />
|(a::r) -&gt; (nom_gens a monde).relation@(rel_rel {nom=p.nom;relation=r} monde);;</p>
<p>(*calcul le chemin le plus court entre deux personnes*)<br />
let path = fun p1 p2 monde-&gt;<br />
let rec pathaux monde= fun<br />
_ p1 p2 when (rel p1 p2) or (rel p2 p1)-&gt; 1<br />
|_ p1 p2 when (rel2 p1 p2 monde) or (rel2 p2 p1 monde) -&gt; 2<br />
|n _ _ when n&gt;(longueur_monde monde) -&gt; failwith &#8220;il ne sont pas en relation&#8221;<br />
|n p1 p2 -&gt; 1+(pathaux monde (n+1) p1 {nom=p2.nom;relation=sup_doub ((rel_rel p2 monde))});<br />
in<br />
pathaux monde 0 p1 p2;;</p>
<p>(*test*)<br />
let m = monde_ordonne 5 2;;<br />
path {nom = &#8220;4&#8243;; relation = ["0"; "3"]}  {nom = &#8220;1&#8243;; relation = ["2"; "0"]} m;;<br />
let m = monde_ordonne 50 2;;<br />
path {nom = &#8220;49&#8243;; relation = ["0"; "48"]}  {nom = &#8220;14&#8243;; relation = ["15"; "13"]} m;;</p>
<p>(*calcule la factorielle d&#8217;un nombre*)<br />
let rec factorielle = fun<br />
0 -&gt; 1<br />
|n -&gt; n * factorielle (n-1);;</p>
<p>(*calcule le chemin le plus court moyen entre deux personnes*)<br />
let chemin_moyen = fun monde -&gt;<br />
let chemin = ref 0. and n = longueur_monde monde in<br />
let n&#8217;=ref (n*n) in<br />
for i = 0 to (n-1) do<br />
for j=0 to n-1 do<br />
try chemin:=!chemin +. float_of_int (path (anti_clef i monde) (anti_clef j monde) monde)<br />
with Failure &#8220;il ne sont pas en relation&#8221; -&gt; n&#8217; := !n&#8217;-1<br />
done;<br />
done;<br />
!chemin/.float_of_int (!n&#8217;);;</p>
<p>(*test*)<br />
let m=monde_ordonne 10 4;;<br />
chemin_moyen m;;<br />
desordre 0.5 m;;<br />
chemin_moyen m;;</p>
<p>(*trace le chemin moyen le plus court en fonction du désordre*)<br />
let trace_chemin = fun n k -&gt;<br />
clear_graph ();<br />
let m = monde_ordonne n k in<br />
moveto 0 (int_of_float (200.*.chemin_moyen m));<br />
for i = 1 to 30 do<br />
let m = monde_ordonne n k in<br />
let p = (float_of_int i) /. 30. in<br />
desordre p m;<br />
lineto (i*20) (int_of_float (200.*.chemin_moyen m));<br />
done;;</p>
<p>(*test*)<br />
trace_chemin 30 12;;</p>
<p>(*créer un monde à n personnes k relations et une part d&#8217;aléatoire p*)<br />
let smallworld = fun n k p -&gt;<br />
let m = monde_ordonne n k in<br />
desordre p m;<br />
m;;</p>
<p>(*test*)<br />
let m = smallworld 60 20 1.;; trace_monde m;;</p>
<p>(*crée un tableau de tableau de nom à partir d&#8217;un monde*)<br />
let tab_carre_gens = fun monde -&gt;<br />
let n = longueur_monde monde in<br />
let k = (int_of_float (sqrt (float_of_int n)))<br />
and l = ref monde.reseau in<br />
let mat = make_matrix k k &#8220;&#8221; in<br />
for i = 0 to k-1 do<br />
for j = 0 to k-1 do<br />
if !l &lt;&gt; [] then<br />
begin<br />
mat.(i).(j) &lt;- (hd !l).nom;<br />
l := tl !l;<br />
end<br />
done;<br />
done;<br />
mat;;</p>
<p>(*renvoie la &#8220;double clef&#8221; d&#8217;une personne*)<br />
let double_clef = fun p monde -&gt;<br />
let tab = tab_carre_gens monde in<br />
let n = longueur_monde monde in<br />
let k = (int_of_float (sqrt (float_of_int n))) in<br />
let clef = ref (0,0) in<br />
for i = 0 to k-1 do<br />
for j = 0 to k-1 do<br />
if p.nom = tab.(i).(j) then<br />
clef := (i,j)<br />
done;<br />
done;<br />
!clef;;</p>
<p>(*renvoie la personne associée à une &#8220;double clef&#8221;*)<br />
let anti_double_clef = fun (i,j) monde -&gt;<br />
let tab = tab_carre_gens monde in<br />
nom_gens tab.(i).(j) monde;;</p>
<p>(*renvoie la liste des &#8220;double clef&#8221; d&#8217;une relation*)<br />
let rec double_clef_list = fun p monde -&gt;<br />
match p.relation with<br />
[] -&gt; []<br />
|(a::r) -&gt; (double_clef (nom_gens a monde) monde)::(double_clef_list {nom = p.nom; relation = r} monde);;</p>
<p>(*test*)<br />
double_clef_list {nom = &#8220;6&#8243;; relation = ["8"; "4"; "7"; "5"]} m;;</p>
<p>(*crée la matrice des relations d&#8217;un monde*)<br />
let tab_carre_relation = fun monde -&gt;<br />
let n = longueur_monde monde in<br />
let k = (int_of_float (sqrt (float_of_int n))) in<br />
let tab = make_matrix k k [] in<br />
for i = 0 to k-1 do<br />
for j = 0 to k-1 do<br />
tab.(i).(j) &lt;- double_clef_list (anti_double_clef (i,j) monde) monde<br />
done;<br />
done;<br />
tab;;</p>
<p>(*test*)<br />
let m = monde_ordonne 10 4;;<br />
tab_carre_relation m;;</p>
<p>(*dessine les gens d&#8217;un monde sur un carré*)<br />
let trace_carre_gens = fun monde -&gt;<br />
let n = longueur_monde monde in<br />
let k = (int_of_float (sqrt (float_of_int n))) in<br />
let tab = tab_carre_gens monde in<br />
set_color red;<br />
for i = 0 to k-1 do<br />
for j = 0 to k-1 do<br />
plot (50*(i+1)) (50*(j+1));<br />
plot (50*(i+1)+1) (50*(j+1)+1);<br />
plot (50*(i+1)-1) (50*(j+1)-1);<br />
plot (50*(i+1)-1) (50*(j+1)+1);<br />
plot (50*(i+1)+1) (50*(j+1)-1);<br />
done;<br />
done;<br />
set_color black;;</p>
<p>(*dessine les relations entre une personne et ses relations*)<br />
let trace_carre_relation = fun p q monde -&gt;<br />
let l = ref p.relation in<br />
while !l &lt;&gt; [] do<br />
let (a,b) = double_clef p monde in<br />
let (c,d) = double_clef (nom_gens (hd !l) monde) monde in<br />
if (abs(d-b)+abs(c-a))&gt;q then<br />
set_color blue<br />
else<br />
set_color black;<br />
moveto ((a+1)*50) ((b+1)*50);<br />
lineto ((c+1)*50) ((d+1)*50);<br />
l:=tl !l<br />
done;;</p>
<p>(*dessine le monde en carré*)<br />
let trace_carre = fun monde p-&gt;<br />
let n = longueur_monde monde in<br />
let k = (int_of_float (sqrt (float_of_int n))) in<br />
let tab = tab_carre_gens monde in<br />
clear_graph ();<br />
trace_carre_gens monde;<br />
for i = 0 to k-1 do<br />
for j=0 to k-1 do<br />
trace_carre_relation (anti_double_clef (i,j) monde) p monde<br />
done;<br />
done;;</p>
<p>(*prend une liste de couple et renvoie une liste de chaines*)<br />
let rec list_string = fun<br />
[] -&gt; []<br />
|(q::r) -&gt; let a = string_of_int (fst q) and b = string_of_int (snd q) in<br />
(&#8221;(&#8221;^a^&#8221;,&#8221;^b^&#8221;)&#8221;)::list_string r;;</p>
<p>(*associe un monde à une matrice de listes de couples*)<br />
let mat_monde = fun mat -&gt;<br />
let k = vect_length mat in<br />
let m = creer_monde () in<br />
for i = 0 to k-1 do<br />
for j = 0 to k-1 do<br />
ajouter_gens {nom=&#8221;(&#8221;^(string_of_int i)^&#8221;,&#8221;^(string_of_int j)^&#8221;)&#8221;; relation = list_string mat.(i).(j)} m<br />
done;<br />
done;<br />
m;;</p>
<p>(*crée une &#8220;bonne&#8221; matrice*)<br />
let mat = fun n p -&gt;<br />
let h = (int_of_float (sqrt (float_of_int n))) in<br />
let m = make_matrix h h [] in<br />
for i = 0 to h-1 do<br />
for j = 0 to h-1 do<br />
let li = ref [] in<br />
for k = 0 to h-1 do<br />
for l = 0 to h-1 do<br />
if (abs(k-i)+abs(l-j))&lt;=p then m.(i).(j) &lt;- (k,l)::m.(i).(j)<br />
done;<br />
done;<br />
done;<br />
done;<br />
m;;</p>
<p>(*crée un monde ordonné avec n personnes connaissant les personnes à une distance p d&#8217;eux*)<br />
let monde_ordonne2 = fun n p -&gt;<br />
let m = mat n p in<br />
mat_monde m;;</p>
<p>(*test*)<br />
let m = monde_ordonne2 25 1;; trace_carre m;;</p>
<p>(*calcule a^b*)<br />
let rec e = fun<br />
a 0 -&gt; 1<br />
|a b -&gt; a*(e a (b-1));;</p>
<p>(*calcule la longueur d&#8217;une list*)<br />
let rec list_length = fun<br />
[] -&gt; 0<br />
|(a::r) -&gt; 1+list_length r;;</p>
<p>(*crée un monde avec n personnes connaissant les personnes à une distance p d&#8217;eux plus k personnes loin*)<br />
let smallworld2 = fun n p k -&gt;<br />
let m = mat n p in<br />
let h = vect_length m in<br />
for i=0 to h-1 do<br />
for j=0 to h-1 do<br />
let la = ref k in<br />
while !la &lt;&gt; 0 &amp;&amp; ((list_length m.(i).(j)) &lt; 2*(e 2 p)+k) do<br />
let (k,l) = (random__int (h-1),random__int (h-1)) in<br />
if (abs(k-i)+abs(l-j))&gt;p then<br />
begin<br />
m.(i).(j) &lt;- sup_doub ((k,l)::m.(i).(j));<br />
la := !la - 1;<br />
end;<br />
done;<br />
done;<br />
done;<br />
mat_monde m;;</p>
<p>(*test*)<br />
let m = smallworld2 36 1 0;;trace_carre m 1;;<br />
trace_carre (smallworld2 121 1 1) 1;;</p>
<p>(*trace le chemin le plus court en fonction du nombre de relations à longue distance*)<br />
let trace_chemin2 = fun n p -&gt;<br />
clear_graph ();<br />
moveto 0 (int_of_float (200.*.chemin_moyen (smallworld2 n p 0)));<br />
for i = 1 to 30 do<br />
lineto (i*20) (int_of_float (200.*.chemin_moyen (smallworld2 n p i)));<br />
done;;</p>
<p>(*test*)<br />
trace_chemin2 25 1;;</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://smallworldproject.free.fr/wordpress/?feed=rss2&amp;p=177</wfw:commentRss>
		</item>
		<item>
		<title>Travaux Personnels du moment</title>
		<link>http://smallworldproject.free.fr/wordpress/?p=100</link>
		<comments>http://smallworldproject.free.fr/wordpress/?p=100#comments</comments>
		<pubDate>Mon, 28 Jul 2008 15:03:36 +0000</pubDate>
		<dc:creator>Pierre</dc:creator>
		
		<category><![CDATA[Pierre]]></category>

		<guid isPermaLink="false">http://localhost:8888/wordpress/?p=124</guid>
		<description><![CDATA[Notre problématique : comment justifier mathématiquement que la théorie des six degrés de séparation tienne debout, soit cohérente et s&#8217;insère dans plusieurs recherches mathématiques actuelles ?
Prémices
Je vous invite à lire, si ce n&#8217;est pas déjà fait, l&#8217;article expliquant en quelques lignes le modèle que nous avons choisi pour illustrer la théorie.
Retour à nos approches de [...]]]></description>
			<content:encoded><![CDATA[<p><em><u>Notre problématique :</em></u> <strong>comment justifier mathématiquement que la théorie des six degrés de séparation tienne debout, soit cohérente et s&#8217;insère dans plusieurs recherches mathématiques actuelles ?</strong></p>
<h4>Prémices</h4>
<p>Je vous invite à lire, si ce n&#8217;est pas déjà fait, <a href="http://smallworldproject.free.fr/wordpress/?p=64" title="quelques lignes sur le modèle python">l&#8217;article expliquant en quelques lignes le modèle que nous avons choisi pour illustrer la théorie.</a></p>
<h4>Retour à nos approches de la problématique</h4>
<ol>
<li>le modèle de Watts-Strogatz - monde de 1000 personnes , 10 voisins et un coefficient alétoire p décrivant [0,1] - offre une première réponse et justifie qu&#8217;il existe un chemin moyen minimum bien inférieur aux idées reçues. Pour en apprendre plus sur ce modèle je vous conseille de lire le début de ce fichier pdf: <a href="http://smallworldproject.free.fr/wordpress/wp-content/uploads/2008/07/watts02.pdf" title="fichier pdf">Watts-Strogatz model</a><br />
Mais ce modèle de Watts-Strogatz n&#8217;est qu&#8217;un monde 1000 personnes, finalement déjà un petit monde, alors quand est-il des <em>Grands Graphes</em> ?<br />
Néanmoins cette première réponse offerte par ce modèle nous permet de justifier de la cohérence de notre travail, cette théorie du small world a donc une raison d&#8217;être, mais ce n&#8217;est pas encore une réponse satisfaisante.<br />
 </li>
<li>la modélisation couplée à la puissance des machines actuelles nous permet de lancer des calculs bien plus important tels que des mondes de 10 000 <em>(10min de calcul)</em> voir 100 000 personnes <em>(24h de calcul)</em>. Le calcul de 1 000 000 est en court ce mois-ci, nous y avons ajouter un algorithme d&#8217;estimation du temps pour connaître &#8220;rapidement&#8221; le temps nécessaire pour arriver au résultat final du chemin minimum moyen.<br />
Ajoutons à cela le travail de <a href="../../laetitia">Laetitia</a> sur les <em>Grands Graphes</em> qui nous sort de ce premier modèle, car un monde est lui-même composé de plusieurs small world (entreprises, clubs de sports, associations, etc)<br />
 </li>
<li>L&#8217;idée sur laquelle je travail actuellement est d&#8217;utiliser des techniques de régression puissantes nous permettant avec beaucoup de <em>moyens calculs</em> (donc peu d&#8217;efforts) de pouvoir prédire ce que serait un calcul d&#8217;un monde gigantesque!
<ul>
<li>les régressions polynomiales reposent sur des calculs de matrices de Vandermonde. Je suis en train de coder tout ceci en python.</li>
<li>je dois aussi stocker plusieurs calculs pour me créer une base données que j&#8217;exploiterai lors de la régression.</li>
<li>enfin il y aura une part dans l&#8217;algorithme vérifiant que la courbe obtenue par régression est acceptable simplement en faisant un calcul pour un monde sortant du maximum stocké dans la base de donné et nous retournant la marge d&#8217;erreur entre le résultat obtenu et le résultat de la courbe.</li>
</ul>
</li>
</ol>
<p><em>Article en cours d&#8217;écriture&#8230;</em></p>
<p></span></p>
]]></content:encoded>
			<wfw:commentRss>http://smallworldproject.free.fr/wordpress/?feed=rss2&amp;p=100</wfw:commentRss>
		</item>
		<item>
		<title>Fichiers</title>
		<link>http://smallworldproject.free.fr/wordpress/?p=98</link>
		<comments>http://smallworldproject.free.fr/wordpress/?p=98#comments</comments>
		<pubDate>Sun, 27 Jul 2008 19:21:46 +0000</pubDate>
		<dc:creator>Pierre</dc:creator>
		
		<category><![CDATA[News]]></category>

		<category><![CDATA[Pierre]]></category>

		<guid isPermaLink="false">http://localhost:8888/wordpress/?p=119</guid>
		<description><![CDATA[Les Fichiers nécessaires à la modélisation sont à télécharger sous zip

Small World Project Fichiers
]]></description>
			<content:encoded><![CDATA[<p>Les Fichiers nécessaires à la modélisation sont à télécharger sous zip</p>
<p style="text-align: center;">
<br /><a href="http://smallworldproject.free.fr/wordpress/wp-content/uploads/2008/07/swpfichiers_24072008.zip"><img class="size-medium wp-image-148 aligncenter" style="margin: -20px 0px" title="zip" src="http://smallworldproject.free.fr/wordpress/wp-content/uploads/2008/07/zip.png" alt="" width="64" height="64" /><strong>Small World Project Fichiers</strong></a></p>
]]></content:encoded>
			<wfw:commentRss>http://smallworldproject.free.fr/wordpress/?feed=rss2&amp;p=98</wfw:commentRss>
		</item>
		<item>
		<title>Introduction au Modèle Python d&#8217;un Small World</title>
		<link>http://smallworldproject.free.fr/wordpress/?p=64</link>
		<comments>http://smallworldproject.free.fr/wordpress/?p=64#comments</comments>
		<pubDate>Sun, 27 Jul 2008 15:21:53 +0000</pubDate>
		<dc:creator>Pierre</dc:creator>
		
		<category><![CDATA[Pierre]]></category>

		<guid isPermaLink="false">http://localhost:8888/wordpress/?p=70</guid>
		<description><![CDATA[Le but de cet article est d'expliquer brièvement la technique de modélisation, sa puissance et ce qui est nécessaire pour la faire fonctionner.]]></description>
			<content:encoded><![CDATA[<p>Le but de cet article est d&#8217;expliquer brièvement la technique de modélisation d&#8217;un small world en python, sa puissance et les librairies nécessaires à son fonctionnement.</p>
<h4>I - Comment modéliser un monde?</h4>
<p>Voici le genre de question dont une ou plusieurs vies ne seraient assez pour y répondre. Il nous faut donc commencer par trouver une modélisation la plus simple possible et ensuite intégrer de nouveaux paramètres pour affiner le modèle.</p>
<p><b>les observations:</b></p>
<ol>
<li>un monde contient un nombre, disons <b>N</b>, de personnes</li>
<li>chaque personne connait par proximité ses voisins, posons que chacun connaît ses <b>Z</b> voisins les plus proches (nous verrons pour notre représentation qu&#8217;il nous faudra prendre un nombre Z pair)</li>
</ol>
<p>Voilà un premier modèle, que l&#8217;on nomme couramment monde ordonné, car ce monde est symétrique dans toutes les directions.<br />
Il nous faut donc introduire un nouveau paramètre si l&#8217;on veut pouvoir approcher un peu plus de la réalité.</p>
<p><b>3ème observation:</b><br />
il arrive que des personnes très éloignées, en distance, se connaissent pour des raisons qu&#8217;on ne peut traduire mathématiquement. Du moins, une répartition aléatoire de type gaussienne - ajoutant un nombre de connexions aléatoires proportionnelles au nombre total de connexions du monde ordonné  - modélise assez bien ce type de relation et rendrait notre modèle plus réaliste.</p>
<h4>Conclusion sur le modèle envisagé</h4>
<p>Nous décidons donc de créer un monde de <b>N</b>, chaque personne connaissant ses <b>Z</b> voisins les plus proches et enfin on introduit un paramètre <b>p</b> correspondant au pourcentage de relations aléatoires que l&#8217;on ajoutera dans le monde.</p>
<h4>II - Pour faire marcher ce modèle il est nécessaire d&#8217;installer</h4>
<ul>
<li><strong><em>python2.3</em></strong> ou plus récent</li>
<li><em>scipy</em></li>
<li><em>numpy</em></li>
<li><em>pylab</em></li>
<li><em>matplotlib</em></li>
</ul>
<p>Il faut aussi maîtriser les bases de python pour comprendre comment utiliser et exploiter le modèle. Et avoir lu le résumé de la <em>théorie du small world</em> ou en connaître la substance.</p>
<h4>III - Bases du modèle</h4>
<p>Le modèle repose sur l&#8217;utilisation des dictionnaires de python qui offre une grande maniabilité pour les calculs. Chaque personne de notre monde est une clé du dictionnaire et la valeur de cette clé est une liste constituée de ses connaissances <em>(on nommera une personne: <strong>node</strong></em><em>)</em></p>
<h4>IV - Un Petit Exemple :</h4>
<p class="code">&gt;&gt;&gt; g = {}<br />
&gt;&gt;&gt; g[0] = [1,2]<br />
&gt;&gt;&gt; g[1] = [0,3]<br />
&gt;&gt;&gt; g[2] = [0,3]<br />
&gt;&gt;&gt; g[3] = [1,2,4]<br />
&gt;&gt;&gt; g[4] = [3]<br />
&gt;&gt;&gt; g<br />
{0: [1, 2], 1: [0, 3], 2: [0, 3], 3: [1, 2, 4], 4: [3]}</p>
<p>Ici node0 connaît node1 et node2, etc.</p>
<h4>V - Affichage d&#8217;un monde</h4>
<p>On place chaque personne est placée sur un cercle et une connaissance est modélisée par un trait entre ces deux personnes. Ce n&#8217;est qu&#8217;une façon de voir les choses, d&#8217;autres modélisations sont possibles. Alexandre s&#8217;intéresse à celle présentant le monde en <a href="http://smallworldproject.free.fr/wordpress/?page_id=15">carré</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://smallworldproject.free.fr/wordpress/?feed=rss2&amp;p=64</wfw:commentRss>
		</item>
	</channel>
</rss>
