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 à 10

    • amourMusique: valeurs 1 à 10

  • variable: tendPol; 3 valeurs possibles: droite, gauche, centre

  • variable posGeo: sousvariables:

    • lat: valeurs: coordonnées gps

    • long: valeurs: coordonnées gps

  • variable âge: valeur: int

Description des profils

A:

  • intcult:

    • amourLecture: 8

    • amourMusique: 8

  • tendPol: gauche

  • posGeo:

    • lat: 45.5088400

    • long: -73.5878100

  • age: 20

B:

  • intcult:

    • amourLecture: 5

    • amourMusique: 10

  • tendPol: centre

  • posGeo:

    • lat: 46.7911

    • long: -71.3933

  • age: 32

C:

  • intcult:

    • amourLecture: 0

    • amourMusique: 0

  • tendPol: droite

  • posGeo:

    • lat: 45.5088400

    • long: -73.5878100

  • age: 18

D:

  • `intcult:

    • amourLecture: 10

    • amourMusique: 0

  • tendPol: gauche

  • posGeo:

    • lat: 48.8534

    • long: 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