Algorithme de jukebox pour soirée de danses sociales.
Dans le cadre d'un bal rock, concevoir une playlist avec les critères suivants :
- Chansons durant entre 2min et 4min
- Playlist de 2h au total (donc environ 40 chansons)
- Chansons de tempo entre 30 et 50 MPM (Mesures par Minutes = Battements par minute / 4)
- Chansons "dansables en rock" (tempo bien marqué, ambiance joviale, présence de break...)
- Bonne répartition en terme de tempo : gaussienne centrée sur 40 MPM
- Bonne répartition en terme de genre : Rock / Swing / Pop ...
- Bonne répartition en terme de période : Oldie / Moderne ...
- Bonne répartition en terme de fréquence : standard (= passe souvent en soiée) / rare
On peut réaliser manuellement une playlist répondant à ces premiers critères.
On ajoute des nouveaux critères de variabilités :
- Alternance du tempo (séquence lent / moyen / rapide)
- Alternance du genre
- Alternance de la période
- Alternance de la fréquence
L'idée est que deux chansons qui se suivent dans la playlist doivent varier au maximum sur les 4 critères.
L'alternance du tempo est prioritaire sur les autres.
On se retrouve dans un problème d'optimisation de score nécessitant l'intervention héroïque de la data science. #turfu
Cas particuliers :
- les 5 premières chansons doivent être lentes et simples (tempo bien marqué), car elles seront dansées par les débutants du cours débutants qui précéde le bal rock.
- la dernière chanson doit être un tube mainstream (pour finir le bal dans une zone de confort)
On se base sur un fichier Excel annoté avec des étiquettes pour les différentes composantes à variabiliser.
On utilise une distance "binaire" qui fait la somme de la distance pour chaque coordonnée, avec une valeur 1 si la coordonnée est différente et 0 sinon.
Exception pour le tempo : distance de 1 si le delta est supérieur à 5MPM, 0 sinon.
La distance est donc un nombre entier entre 0 et 4.
On veut maximiser la variabilité.
On va donc faire la somme des distances deux à deux des chansons qui se suivent dans la playlist.
On normalise cette valeur en divisant par la valeur maximale possible, le nombre de transition x la distance maximum.
On choisit au hasard le 1er vecteur, puis itérativement le vecteur suivant en optimisant les distances.
Le score maximum atteint est de 64%.
Première version en C#, vite fait en DDD.