| """Convergence harness: ONE fixed instance per seed, shared fitness target.""" |
| import numpy as np, sim, schedulers as sch |
|
|
| def build_instance(n_nodes, lam, seed): |
| rng = np.random.default_rng(seed) |
| nodes = sim.make_nodes(n_nodes, rng) |
| cap, mem, p_idle, p_peak = sim.node_arrays(nodes) |
| link_lat = sim.make_link_latency(n_nodes, rng) |
| n_arr = rng.poisson(lam * sim.DT * 3) |
| demand, tmem, deadline, cls = sim.make_tasks(max(n_arr, 8), rng) |
| backlog = rng.uniform(0, cap * sim.DT * 0.5) |
| return dict(demand=demand, tmem=tmem, deadline=deadline, cls=cls, |
| backlog=backlog, cap=cap, mem=mem, link_lat=link_lat, |
| p_idle=p_idle, p_peak=p_peak) |
|
|
| def _ctx(inst, seed): |
| return sch.Ctx(inst["demand"], inst["tmem"], inst["deadline"], inst["cls"], |
| inst["backlog"], inst["cap"], inst["link_lat"], |
| inst["p_idle"], inst["p_peak"], 0.5, 0.3, 0.2, |
| np.random.default_rng(seed + 1000), node_mem=inst["mem"]) |
|
|
| METHODS = { |
| "ACO": lambda c,it: sch.standalone_aco(c, iters=it), |
| "PSO": lambda c,it: sch.standalone_pso(c, iters=it), |
| "WOA": lambda c,it: sch.woa(c, iters=it), |
| "AdaptiSwarm": lambda c,it: sch.adaptiswarm_edge(c, iters=it, sigma_u=0.2), |
| "Abl_ACOonly": lambda c,it: sch.adaptiswarm_edge(c, iters=it, use_pso=False, sigma_u=0.2), |
| "Abl_PSOrand": lambda c,it: sch.adaptiswarm_edge(c, iters=it, use_aco_seed=False, use_adaptive=False, sigma_u=0.2), |
| "Abl_PSOseed": lambda c,it: sch.adaptiswarm_edge(c, iters=it, use_adaptive=False, sigma_u=0.2), |
| } |
|
|
| def run_curves(n_nodes=25, lam=100, seed=7, iters=40, methods=None): |
| if methods is None: methods = ["ACO","PSO","WOA","AdaptiSwarm"] |
| inst = build_instance(n_nodes, lam, seed) |
| curves = {} |
| for m in methods: |
| _, c = METHODS[m](_ctx(inst, seed), iters) |
| c = list(c) |
| if len(c) < iters: c = c + [c[-1]] * (iters - len(c)) |
| curves[m] = np.array(c[:iters], dtype=float) |
| best_final = min(c[-1] for c in curves.values()) |
| worst_start = max(c[0] for c in curves.values()) |
| span = abs(worst_start - best_final) + 1e-9 |
| target = best_final + 0.02 * span |
| conv = {} |
| for k, c in curves.items(): |
| hit = np.where(c <= target)[0] |
| conv[k] = int(hit[0] + 1) if hit.size else iters |
| return curves, conv, target |
|
|