Skip to main content
. 2026 Aug 14;26(16):5164. doi: 10.3390/s26165164
Algorithm 1: Greedy Cooperative Sensor Node Pre-Selection Heuristic Based on G-GDOP
    Input: C, GC=(C,EC), K, Blink, Bslot, Bres, Emin, {Ei}, {se}, {cinode}, {celink}, x^, {w^e}, τJ, and ϵtie; use +∞ to disable an upper budget.
    Output: status, Sout, E(Sout), M, Tslot, and Cres.
  1: Compute Qo, dg, do, and the projected weighted link-information vectors {ae}e∈EC.
  2:  if preprocessing fails then return SELECTION_NUMERICAL_FAILURE.
  3:  S←⌀; E←⌀; M←0; Tslot←0; Cres←0; Jo←0.
  4:  function STATS(i,S).
  5:    ΔEi←E(S∪{i})∖E(S).
  6:    ΔMi←|ΔEi|; ΔTi←∑e∈ΔEise.
  7:    ΔCi←cinode+∑e∈ΔEicelink.
  8:    ΔJo,i←∑e∈ΔEiaeaeT.
  9:    return (ΔEi,ΔMi,ΔTi,ΔCi,ΔJo,i).
10:  end function.
11:  function FEASIBLE(i,ΔMi,ΔTi,ΔCi).
12:    return (Ei≥Emin)∧(|S|+1≤K)∧(M+ΔMi≤Blink)∧(Tslot+ΔTi≤Bslot)∧(Cres+ΔCi≤Bres).
13:  end function.
       Stage I: observable-seed construction
14:  while rankτJ(Jo)<do do.
15:    if |S|≥K then return UNOBSERVABLE.
16:    Crem←C∖S.
17:    if Crem=⌀ then return UNOBSERVABLE.
18:    Fseed←⌀; i⋆←⌀; κ⋆←⌀; rcur←rankτJ(Jo).
19:    for each i∈Crem in increasing node-ID order do.
20:         (ΔEi,ΔMi,ΔTi,ΔCi,ΔJo,i)←STATS(i,S).
21:         if ¬FEASIBLE(i,ΔMi,ΔTi,ΔCi) then continue.
22:         Fseed←Fseed∪{i}; Jo+i←Jo+ΔJo,i.
23:         ri←rankτJ(Jo+i); compute the retained λmin+i of Jo+i.
24:         κi←(ri−rcur,λmin+i,−ΔTi,−ΔCi,−i).
25:         if i⋆=⌀ or κi≻lexκ⋆ then i⋆←i and κ⋆←κi.
26:    end for.
27:    if Fseed=⌀ then return RESOURCE_INFEASIBLE.
28:    (ΔEi⋆,ΔMi⋆,ΔTi⋆,ΔCi⋆,ΔJo,i⋆)←STATS(i⋆,S); S←S∪{i⋆}; E←E∪ΔEi⋆.
29:    M←M+ΔMi⋆; Tslot←Tslot+ΔTi⋆; Cres←Cres+ΔCi⋆; Jo←Jo+ΔJo,i⋆.
30:  end while.
31:  Sseed←S; kseed←|Sseed|.
32:  if Jo−1 cannot be evaluated then return SELECTION_NUMERICAL_FAILURE.
33:  P←Jo−1.
       Stage II: post-seed A-optimal refinement
34:  while |S|<K do.
35:    i⋆←⌀; g⋆←−∞; ΔT⋆←+∞; ΔC⋆←+∞; P⋆←P.
36:    for each i∈C∖S in increasing node-ID order do.
37:         (ΔEi,ΔMi,ΔTi,ΔCi,ΔJo,i)←STATS(i,S).
38:         if ¬FEASIBLE(i,ΔMi,ΔTi,ΔCi) then continue.
39:         if ΔEi=⌀ then P(i)←P; else compute P(i) using Equation (37).
40:         gi←tr(P)−tr(P(i)).
41:         if i⋆=⌀ or gi>g⋆+ϵtie then store (i,gi,ΔTi,ΔCi,P(i)) as the current candidate.
42:         else if |gi−g⋆|≤ϵtie and ΔTi<ΔT⋆−ϵtie then store (i,gi,ΔTi,ΔCi,P(i)).
43:         else if |gi−g⋆|≤ϵtie, |ΔTi−ΔT⋆|≤ϵtie, and ΔCi<ΔC⋆−ϵtie then store (i,gi,ΔTi,ΔCi,P(i)).
44:         else if |gi−g⋆|≤ϵtie, |ΔTi−ΔT⋆|≤ϵtie, |ΔCi−ΔC⋆|≤ϵtie, and i<i⋆ then store (i,gi,ΔTi,ΔCi,P(i)).
45:    end for.
46:    if i⋆=⌀ then break.
47:    (ΔEi⋆,ΔMi⋆,ΔTi⋆,ΔCi⋆,ΔJo,i⋆)←STATS(i⋆,S).
48:    S←S∪{i⋆}; E←E∪ΔEi⋆.
49:    M←M+ΔMi⋆; Tslot←Tslot+ΔTi⋆; Cres←Cres+ΔCi⋆.
50:    Jo←Jo+ΔJo,i⋆; P←P⋆.
51:  end while.
52:  if exact-K selection is required and |S|<K then return RESOURCE_INFEASIBLE.
53:  if rankτJ(Jo)<do then return UNOBSERVABLE.
54:  Evaluate the final A-optimal metric and resource statistics.
55:  if the final metric evaluation fails then return SELECTION_NUMERICAL_FAILURE.
56:  Sout←S.
57:  return SUCCESS,Sout,E(Sout),M,Tslot,Cres.