Vediamo ora una delle domande più cruciali nella vita sentimentale: quante persone dovremmo frequentare prima di scegliere quella con cui stabilizzarci per qualcosa di più serio?
È una domanda difficile, ma la matematica può aiutarci trovando una risposta: il 37% . In pratica, di tutte le persone con cui possibilmente potremmo fissare un appuntamento, dovremmo conoscere ma scartare a priori le prime 37% , dalla nostra "scelta definitiva", e poi continuare gli appuntamenti fino ad accasarci con la prima persona che incontriamo e che valutiamo migliore di quelle viste prima (o altrimenti aspettare l'ultima persona, se questa scelta migliore non si presenta).
Perché è una buona strategia?[1] Ovviamente non conviene scegliere la prima persona che incontriamo, per quanto possa sembrare promettente, perché qualcuno di meglio potrebbe apparire più tardi. D'altra parte, non vogliamo nemmeno essere troppo esigenti, perché una volta che rifiutiamo qualcuno molto probabilmente non vorrà tornare da noi qualora ci ripensassimo. Ma quindi perché il 37% ? L'idea è solo di massimizzare le probabilità.
Più precisamente: supponiamo di volerci "sistemare" entro un certo periodo. Definiamo come il numero di partner che stimiamo di poter incontrare in questo periodo, e che quindi costituiscono i nostri candidati moglie/marito. Supponiamo di poter assegnare a ogni partner un punteggio da 1 a per definire il nostro grado di compatibilità[2]. In questo gruppo ci sarà anche la nostra anima gemella, quella giusta, che chiamiamo e che avrà quindi il punteggio massimo. Vorremo ora definire una strategia che massimizzi la probabilità di trovarla.
Dato , quindi, vorremo capire come bilanciare il rischio tra "scegliere un partner iniziale magari non perfetto" e "scartare partner che invece col senno di poi valeva la pena scegliere", e quindi vorremo definire come la soglia di persone che delimita i gruppi scarto a priori vs ci penso seriamente. La nostra strategia, come sopra anticipato, consiste allora nell'incontrare – ma scartare – le prime persone, in modo solo da farci un'idea della qualità delle proposte, e poi scegliere, tra i partner degli appuntamenti successivi, la prima che è migliore della persona migliore incontrata nel gruppo scartato; o altrimenti l'ultima se non si presenta nessuna con questo requisito.
Problema ispirato da https://plus.maths.org/content/mathematical-dating.
[1] | "buona strategia" dal punto di vista del risolvere il problema in modo matematico, ma poi naturalmente nelle relazioni umane non ha troppo senso ragionare solo in questi termini razionali. Se per esempio il primo appuntamento ci colpisce non è che dobbiamo rifiutare quel partner solo perché la matematica dice di farlo. |
[2] | l'assegnazione corretta di questi punteggi esiste ma è a noi ignota, ovviamente, perché il punteggio da assegnare a ogni partner lo sapremo esattamente solo una volta fatti tutti gli appuntamenti. Solo una volta conosciuti tutti potremmo allora dire "lei era la migliore" (punteggio ), "quest'altra la seconda migliore" (punteggio ), ecc. Durante il percorso invece possiamo solo fare confronti del tipo "lei era peggiore di quella vista prima", "quest'altra era migliore di tutte le altre viste finora", ecc, ovvero confronti relativi. |
Stavolta ho impostato l'articoletto come una vera storiella di divulgazione, non come domanda e risposta. Nel farlo ho cercato quindi di mantenere un discorso secondo me simpatico, ordinato, e chiaro, ma senza comunque spoilerare la soluzione. Per chi è solo interessato al risultato, basta quindi cliccare sulle parti sfocate di sopra, altrimenti continuate qui per la soluzione completa, con tutti i calcoli per arrivare al risultato finale.
Calcolando l' ottimale, in funzione di , risulterà che
ovvero deve essere circa il 37% di .
using Random
Random.seed!(42)
function M_strategy_score(partners,M,verbose=0)
N = length(partners)
@assert N >= M+1
partners_not_discarded = partners[M+1:end]
best_score_of_discarded = maximum(partners[1:M]) # il punteggio migliore tra le persone del gruppo iniziale
available_scores = max.(partners_not_discarded .- best_score_of_discarded,0)
out = findfirst(u -> u!=0, available_scores)
chosen_index = isnothing(out) ? lastindex(partners_not_discarded) : out
score_out = partners_not_discarded[chosen_index]
found_soul_mate = score_out==N # se score==N abbiamo trovato la nostra anima gemella
if verbose==1
println("We discarded $M partners (from $N partners).")
println("The best score there was $best_score_of_discarded.")
printstyled(partners[1:M]; color=:yellow)
printstyled(partners[M+1:end]; color=:green)
println("\nIn the end we selected partner #$(chosen_index+M) of score $score_out.")
println(found_soul_mate==1 ? "We" : "We didnt have", " found our soulmate.\n")
end
return found_soul_mate # return 0 or 1
end
M = 5
partners = shuffle(1:20)
M_strategy_score(partners,M,1)
# optimal strategy should be discarding M=N/ℯ partners
N = 100
simulations = 30_000
values_tested = ["2","ℯ","3","4","5","6","7"]
M_values = round.(Int64,[N/2 N/ℯ N/3 N/4 N/5 N/6 N/7])
scores = zeros(length(M_values))
for sim in 1:simulations
local partners = shuffle(1:N)
for i in 1:length(M_values)
scores[i] += M_strategy_score(partners,M_values[i])
end
end
scores ./= simulations
println("Testing on N = $N.")
for i in 1:length(M_values)
println("Using M = $(M_values[i]) (that is N/$(values_tested[i])) we got score = $(scores[i])")
end
println("Where score is the probability of having found our soulmate.")
using Plots
plot(bar(scores),xticks=(1:length(values_tested),"N".*"/".*values_tested))
We discarded 5 partners (from 20 partners).
The best score there was 19.
[19, 10, 2, 1, 6][12, 9, 8, 11, 15, 7, 4, 17, 20, 16, 5, 3, 14, 18, 13]
In the end we selected partner #14 of score 20.
We found our soulmate.
Testing on N = 100.
Using M = 50 (that is N/2) we got score = 0.3525
Using M = 37 (that is N/ℯ) we got score = 0.37606666666666666
Using M = 33 (that is N/3) we got score = 0.37456666666666666
Using M = 25 (that is N/4) we got score = 0.3532666666666667
Using M = 20 (that is N/5) we got score = 0.3268333333333333
Using M = 17 (that is N/6) we got score = 0.3065333333333333
Using M = 14 (that is N/7) we got score = 0.28196666666666664
Where score is the probability of having found our soulmate.