multiStart.ml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30let multi_start ~f ~nstarts = let results = Array.init nstarts (fun _ -> f ()) in let (cost, result) = Array.fold_left (fun (min_cost, min_cost_sol) (cost, sol) -> if cost < min_cost then (cost, sol) else (min_cost, min_cost_sol)) results.(0) results in ((cost : float), result) (* Once Multicore is out, implement this using domainslib *) (* let multi_start_parallel ~f ~nstarts ~ncores = *) (* let results = *) (* Parmap.array_parmap *) (* ~ncores *) (* (fun _ -> *) (* Random.set_state (Random.State.make_self_init ()); *) (* f () *) (* ) (Array.create nstarts ()) *) (* in *) (* let cost, result = *) (* Array.fold_left (fun (min_cost, min_cost_sol) (cost, sol) -> *) (* if cost < min_cost then *) (* (cost, sol) *) (* else *) (* (min_cost, min_cost_sol) *) (* ) results.(0) results *) (* in *) (* (cost : float), result *)