Algorithme de l’amour¶
Ce programme veut donner une démonstration de ce qu’est un algorithme et des enjeux culturels et sociaux qui sont à la base des choix algorithmiques.
Situation: Dans un groupe de personnes, nous voulons former des couples qui aient le maximum de chances de tomber amoureux.
Modèle représentationnel¶
La première chose à faire c’est une modélisation représentationnelle:
Elle se fera aussi en plusieurs étapes, de la plus générique à la plus spécifique.
Étape 1¶
disons que nous avons 4 individus: A, B, C et D
ces individus ont des profils particuliers
certains profils sont plus compatibles que d’autres
la possibilité de tomber amoureux dépend du niveau de compatibilité
Description des profils:¶
A aime beaucoup lire et aime beaucoup la musique, il est de gauche, il vit à Montréal et il a 20 ans
B aime lire mais seulement en vacances, il adore la musique, il n’a pas de positions politiques particulières, il se considère un modéré, il vit à Québec, il a 32 ans
C n’aime pas lire et n’aime pas la musique, il est très impliqué dans le parti libéral, il a 18 ans, il vit à Montréal
D adore lire, n’aime pas la musique, il est anarchiste, il vit à Paris, il a 40 ans
Étape 2¶
un profil est fait de plusieurs caractéristiques:
intérêts culturels
tendances politiques
position géographique
âge
Modèle fonctionnel¶
Ensuite on passe à une modélisation fonctionnelle. Il faut donc passer à la “numérisation” de ce modèle représentationnel
variable
intCult
: sous variables:amourLecture
; valeurs 1 à 10amourMusique
: valeurs 1 à 10
variable:
tendPol
; 3 valeurs possibles: droite, gauche, centrevariable
posGeo
: sousvariables:lat
: valeurs: coordonnées gpslong
: valeurs: coordonnées gps
variable
âge
: valeur: int
Description des profils
A:
intcult
:amourLecture
: 8amourMusique
: 8
tendPol
: gaucheposGeo
:lat
: 45.5088400long
: -73.5878100
age
: 20
B:
intcult
:amourLecture
: 5amourMusique
: 10
tendPol
: centreposGeo
:lat
: 46.7911long
: -71.3933
age
: 32
C:
intcult
:amourLecture
: 0amourMusique
: 0
tendPol
: droiteposGeo
:lat
: 45.5088400long
: -73.5878100
age
: 18
D:
`intcult:
amourLecture
: 10amourMusique
: 0
tendPol
: gaucheposGeo
:lat
: 48.8534long
: 2.3488
age
: 40
Description de l’algorithme:¶
pour chaque valeur des intérêts culturels on calcule l’écart entre deux profils. Par exemple, A amourLecture=8 et B amourLecture= 5, l’écart sera la valeur absolue de amourLecture de A - amourLecture de B (8-5=3). On additionne ensuite les deux écarts pour obtenir ecartCult
pour la tendance politique on considère que gauche = 0, centre = 5 et droite = 10 et on considère l’écart. On fait lasubstraction et on cosidère la valeur absolue comme = ecartpol
ecartPos = addition des valeurs absolus d’ecartLat et ecartLong
ecartAge = valeur absolu de substraction age-age
ecartTotal= addition de tous les ecarts
La possibilité de tomber amoureux d’un couple sera inversement proportionnelle à l’écartTotal.
Exemple A et B:
ecartCult= ecartLect+ecartMus ecartLect=8-5=3 ecartMus= 8-10=2 ecartCult=5
ecartPol= 0-5=5
ecartGeo= 46.7911-455088+(-)73.5878-(-)71.3933=1.2823+2.1945=3.4768
ecartAge: 32-20=12
ecartTotal= 5+5+3.4768+12=25.
Modèle physique et implémentation en python¶
import json
A= '{"amourLecture":"8", "amourMusique":"8", "tendPol":"0", "lat": "45.5088", "long":"-73.5878", "age":"20", "name": "A"}'
B= '{"amourLecture":"5", "amourMusique":"10", "tendPol":"5", "lat": "46.7911", "long":"-71.3933", "age":"32","name": "B"}'
C= '{"amourLecture":"0", "amourMusique":"0", "tendPol":"10", "lat": "45.5088", "long":"-73.5878", "age":"32", "name": "C"}'
D= '{"amourLecture":"10", "amourMusique":"0", "tendPol":"0", "lat": "48.8534", "long":"2.3488", "age":"40", "name": "D"}'
# print(str(A))
A=json.loads(str(A))
B=json.loads(str(B))
C=json.loads(str(C))
D=json.loads(str(D))
def ecart_AB(x,y):
ecartCult_AB=abs(int(x['amourLecture'])-int(y['amourLecture']))+abs(int(x['amourMusique'])-int(y['amourMusique']))
ecartPol_AB=abs(int(x['tendPol'])-int(y['tendPol']))
ecartGeo_AB=abs(float(x['lat'])-float(y['lat']))+abs(float(x['long'])-float(y['long']))
ecartAge_AB=abs(int(x['age'])-int(y['age']))
ecartTotal_AB=ecartCult_AB + ecartPol_AB + ecartGeo_AB + ecartAge_AB
print('ecart culturel: ' + str(ecartCult_AB) +'\n' + 'ecart politique: ' + str(ecartPol_AB) + '\n' + 'ecart geographique: ' + str(ecartGeo_AB) + '\n' + 'ecart age: ' + str(ecartAge_AB) + '\n' )
print('Ecart total: ')
print(str(ecartTotal_AB) + '\n')
return(ecartTotal_AB)
print('Ecart entre A et B \n')
ecartAB=ecart_AB(A,B)
print('Ecart entre A et C \n')
ecartAC=ecart_AB(A,C)
print('Ecart entre A et D \n')
ecartAD=ecart_AB(A,D)
print('Ecart entre B et C \n')
ecartBC=ecart_AB(B,C)
print('Ecart entre B et D \n')
ecartBD=ecart_AB(B,D)
print('Ecart entre C et D \n')
ecartCD=ecart_AB(C,D)
ecarts=[ecartAD,ecartAC,ecartAD,ecartBC,ecartBD,ecartCD]
Ecart entre A et B
ecart culturel: 5
ecart politique: 5
ecart geographique: 3.4768000000000043
ecart age: 12
Ecart total:
25.476800000000004
Ecart entre A et C
ecart culturel: 16
ecart politique: 10
ecart geographique: 0.0
ecart age: 12
Ecart total:
38.0
Ecart entre A et D
ecart culturel: 10
ecart politique: 0
ecart geographique: 79.2812
ecart age: 20
Ecart total:
109.2812
Ecart entre B et C
ecart culturel: 15
ecart politique: 5
ecart geographique: 3.4768000000000043
ecart age: 0
Ecart total:
23.476800000000004
Ecart entre B et D
ecart culturel: 15
ecart politique: 5
ecart geographique: 75.80439999999999
ecart age: 8
Ecart total:
103.80439999999999
Ecart entre C et D
ecart culturel: 10
ecart politique: 10
ecart geographique: 79.2812
ecart age: 8
Ecart total:
107.2812
set(ecarts)
{23.476800000000004, 38.0, 103.80439999999999, 107.2812, 109.2812}
Ou, un peu plus élégant
liste= [A,B,C,D]
import itertools
listeecarts=[]
for i, i2 in itertools.combinations(liste, r=2):
ecart = ecart_AB(i,i2)
dictecart = {'personne1': i, 'personne2':i2, 'ecart':ecart}
print(dictecart)
listeecarts.append(dictecart)
ecart culturel: 5
ecart politique: 5
ecart geographique: 3.4768000000000043
ecart age: 12
Ecart total:
25.476800000000004
{'personne1': {'amourLecture': '8', 'amourMusique': '8', 'tendPol': '0', 'lat': '45.5088', 'long': '-73.5878', 'age': '20', 'name': 'A'}, 'personne2': {'amourLecture': '5', 'amourMusique': '10', 'tendPol': '5', 'lat': '46.7911', 'long': '-71.3933', 'age': '32', 'name': 'B'}, 'ecart': 25.476800000000004}
ecart culturel: 16
ecart politique: 10
ecart geographique: 0.0
ecart age: 12
Ecart total:
38.0
{'personne1': {'amourLecture': '8', 'amourMusique': '8', 'tendPol': '0', 'lat': '45.5088', 'long': '-73.5878', 'age': '20', 'name': 'A'}, 'personne2': {'amourLecture': '0', 'amourMusique': '0', 'tendPol': '10', 'lat': '45.5088', 'long': '-73.5878', 'age': '32', 'name': 'C'}, 'ecart': 38.0}
ecart culturel: 10
ecart politique: 0
ecart geographique: 79.2812
ecart age: 20
Ecart total:
109.2812
{'personne1': {'amourLecture': '8', 'amourMusique': '8', 'tendPol': '0', 'lat': '45.5088', 'long': '-73.5878', 'age': '20', 'name': 'A'}, 'personne2': {'amourLecture': '10', 'amourMusique': '0', 'tendPol': '0', 'lat': '48.8534', 'long': '2.3488', 'age': '40', 'name': 'D'}, 'ecart': 109.2812}
ecart culturel: 15
ecart politique: 5
ecart geographique: 3.4768000000000043
ecart age: 0
Ecart total:
23.476800000000004
{'personne1': {'amourLecture': '5', 'amourMusique': '10', 'tendPol': '5', 'lat': '46.7911', 'long': '-71.3933', 'age': '32', 'name': 'B'}, 'personne2': {'amourLecture': '0', 'amourMusique': '0', 'tendPol': '10', 'lat': '45.5088', 'long': '-73.5878', 'age': '32', 'name': 'C'}, 'ecart': 23.476800000000004}
ecart culturel: 15
ecart politique: 5
ecart geographique: 75.80439999999999
ecart age: 8
Ecart total:
103.80439999999999
{'personne1': {'amourLecture': '5', 'amourMusique': '10', 'tendPol': '5', 'lat': '46.7911', 'long': '-71.3933', 'age': '32', 'name': 'B'}, 'personne2': {'amourLecture': '10', 'amourMusique': '0', 'tendPol': '0', 'lat': '48.8534', 'long': '2.3488', 'age': '40', 'name': 'D'}, 'ecart': 103.80439999999999}
ecart culturel: 10
ecart politique: 10
ecart geographique: 79.2812
ecart age: 8
Ecart total:
107.2812
{'personne1': {'amourLecture': '0', 'amourMusique': '0', 'tendPol': '10', 'lat': '45.5088', 'long': '-73.5878', 'age': '32', 'name': 'C'}, 'personne2': {'amourLecture': '10', 'amourMusique': '0', 'tendPol': '0', 'lat': '48.8534', 'long': '2.3488', 'age': '40', 'name': 'D'}, 'ecart': 107.2812}
# on ordonne la liste à partir de l'écart le plus faible
newlist = sorted(listeecarts, key=lambda k: k['ecart'])
for p in newlist:
print('Ecart entre ' + p['personne1']['name'] + ' et ' + p['personne2']['name'] + ': ' +str(p['ecart']))
Ecart entre B et C: 23.476800000000004
Ecart entre A et B: 25.476800000000004
Ecart entre A et C: 38.0
Ecart entre B et D: 103.80439999999999
Ecart entre C et D: 107.2812
Ecart entre A et D: 109.2812