let proponiPesoMinimo numeroElementiResidui storicoPesi obiettivo =
let pesoMedio = List.average storicoPesi
let residuo = obiettivo - List.sum storicoPesi
if numeroElementiResidui = 1 then residuo else
let tolleranzaPerc = 0.05m * residuo / obiettivo
let mediaPrevistaConMinimo minimo =
storicoPesi |> List.filter (fun p -> p >= minimo) |> (fun l -> if List.isEmpty l then [0m] else l) |> List.average
let mutable r = (1m - tolleranzaPerc) * pesoMedio
while not ( (mediaPrevistaConMinimo r) >= (residuo / decimal numeroElementiResidui) || (r >= (1m - tolleranzaPerc) * (residuo / decimal numeroElementiResidui))) do
proponiPesoMinimo 76 [8.94m; 9.67m; 8.94m; 9.67m; 10.94m; 9.67m; 8.94m; 9.67m; 8.94m; 9.67m; 10.94m; 9.67m; 8.94m; 9.67m; 8.94m; 9.67m; 10.94m; 9.67m; 8.94m; 9.67m; 8.94m; 9.67m; 10.94m; 9.67m] 1000m