-
Notifications
You must be signed in to change notification settings - Fork 1
/
multiStart.ml
30 lines (29 loc) · 963 Bytes
/
multiStart.ml
1
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
30
let 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 *)