diff --git a/PlatEMO/Algorithms/Multi-objective optimization/DWU/ReplacementUniformity.m b/PlatEMO/Algorithms/Multi-objective optimization/DWU/ReplacementUniformity.m index 6a418278b..28aa0d0b8 100644 --- a/PlatEMO/Algorithms/Multi-objective optimization/DWU/ReplacementUniformity.m +++ b/PlatEMO/Algorithms/Multi-objective optimization/DWU/ReplacementUniformity.m @@ -18,7 +18,7 @@ % evolutionary algorithm, with cardinality |Population|, according to the % uniformity measure. %% Start - B.objs = Population.objs; + B.decs = Population.decs; B.wgts = Weight; Next = (1:length(Population)); @@ -33,20 +33,47 @@ % Find xi and xj in NP(non-dominated solutions of Population) with % maximum wd(xi; xj) (dominance-weighted uniformity function). - ind = Front == 1; - Aux.decs = B.decs(ind,:); - Aux.wgts = B.wgts(ind,:); - [D,I] = distDWU(Aux,Aux,-1); - [~, j] = max(D); - R.decs(ii,:) = B.decs(j,:); - R.wgts(ii,:) = B.wgts(j,:); - ii = ii + 1; - R.decs(ii,:) = B.decs(I(j),:); - R.wgts(ii,:) = B.wgts(I(j),:); - B.decs([j I(j)],:)=[]; - B.wgts([j I(j)],:)=[]; - Remain = Next([j I(j)]); - Next([j I(j)])=[]; + ind = Front == min(Front); + if sum(ind) == 1 + Aux.decs = B.decs(ind,:); + Aux.wgts = B.wgts(ind,:); + Aux.next = Next(ind); + % + nFront = Front(~ind); + C.decs = B.decs(~ind,:); + C.wgts = B.wgts(~ind,:); + nNext = Next(~ind); + ind1 = nFront == min(nFront); + Aux.decs = [Aux.decs;C.decs(ind1,:)]; + Aux.wgts = [Aux.wgts;C.wgts(ind1,:)]; + Aux.next = [Aux.next nNext(ind1)]; + [D,I] = distDWU(Aux,Aux,-1); + [~, j] = max(D); + R.decs(ii,:) = Aux.decs(j,:); + R.wgts(ii,:) = Aux.wgts(j,:); + ii = ii + 1; + R.decs(ii,:) = Aux.decs(I(j),:); + R.wgts(ii,:) = Aux.wgts(I(j),:); + B.decs(Aux.next([j I(j)]),:)=[]; + B.wgts(Aux.next([j I(j)]),:)=[]; + Remain = Next(Aux.next([j I(j)])); + Next(Aux.next([j I(j)]))=[]; + else + Aux.decs = B.decs(ind,:); + Aux.wgts = B.wgts(ind,:); + Aux.next = Next(ind); + [D,I] = distDWU(Aux,Aux,-1); + [~, j] = max(D); + R.decs(ii,:) = Aux.decs(j,:); + R.wgts(ii,:) = Aux.wgts(j,:); + ii = ii + 1; + R.decs(ii,:) = Aux.decs(I(j),:); + R.wgts(ii,:) = Aux.wgts(I(j),:); + B.decs(Aux.next([j I(j)]),:)=[]; + B.wgts(Aux.next([j I(j)]),:)=[]; + Remain = Next(Aux.next([j I(j)])); + Next(Aux.next([j I(j)]))=[]; + end while ii < N ii = ii + 1; @@ -121,4 +148,4 @@ if smallestLargest < 0 D = D * -1; end -end \ No newline at end of file +end