快速非支配排序


該算法需要計算種群P中每個個體i的兩個參數ni(種群中支配個體i的個體數目)和si(種群中被個體i支配的個體集合)。
1、找出種群中所有ni=0的個體,保存在集合F1中(也就是第一層)。
2、對F1中的每個個體i,其所支配的個體集合為si,遍歷si中每個個體L,nL=nL-1,若nL=0,將L保存在集合H中(第二層)。
3、以H為當前集合,重復2,直到整個種群被分層
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 
  6 namespace Test
  7 {
  8     class Program
  9     {
 10         static void Main(string[] args)
 11         {
 12             var db = new List<Individual>
 13                 {
 14                     new Individual(new List<double>() {1, 8}),
 15                     new Individual(new List<double>() {2, 6}),
 16                     new Individual(new List<double>() {3, 4}),
 17                     new Individual(new List<double>() {2, 5}),
 18                     new Individual(new List<double>() {4, 9})
 19                 };
 20             var result=NondominantSort.First_Nondominant_Sort(db);
 21         }
 22     }
 23     public class NondominantSort
 24     {
 25         public static List<Tier> First_Nondominant_Sort(List<Individual> individuals)
 26         {
 27             var result = new List<Tier>();
 28             foreach (var p in individuals)//初始化所有個體的各個屬性值
 29             {
 30                 foreach (var q in individuals)
 31                 {
 32                     var paretoRelation = Pareto(p, q);
 33                     if (paretoRelation == 1)
 34                         p.MyDominant.Add(q);
 35                     else if (paretoRelation == 2)
 36                     {
 37                         p.DominantNumber += 1;
 38                     }
 39                 }
 40             }
 41             var tireF1 = GetTire(individuals);//獲取第一層
 42 
 43             var newTier = new Tier();
 44             newTier.Individuals.AddRange(tireF1);
 45             
 46             result.Add(newTier);
 47             var tire = GetH(tireF1);
 48             while (tire.Count > 0)
 49             {
 50                 var newTier1 = new Tier();
 51                 newTier1.Individuals.AddRange(tire);
 52                 
 53                 result.Add(newTier1);
 54                 tire = GetH(tire);
 55                 //tire.Clear();
 56             }
 57             return result;
 58         }
 59         /// <summary>
 60         /// 根據上一層 獲取下一層H
 61         /// </summary>
 62         /// <returns></returns>
 63         public static List<Individual> GetH(List<Individual> tire)
 64         {
 65             var result = new List<Individual>();
 66             foreach (var individual in tire)
 67             {
 68                 foreach (var individual1 in individual.MyDominant)
 69                 {
 70                     individual1.DominantNumber -= 1;
 71                     if (individual1.DominantNumber == 0)
 72                         result.Add(individual1);
 73                 }
 74             }
 75 
 76             return result;
 77         }
 78         /// <summary>
 79         /// 獲取一層
 80         /// </summary>
 81         /// <param name="individuals"></param>
 82         /// <returns></returns>
 83         public static List<Individual> GetTire(List<Individual> individuals)
 84         {
 85             return individuals.Where(individual => individual.DominantNumber == 0).ToList();
 86         }
 87         /// <summary>
 88         /// individual1支配individual2返回1,individual2支配individual1返回2,互不支配返回3,返回4兩個體相同(以最小值為例)
 89         /// </summary>
 90         /// <param name="individual1">個體1</param>
 91         /// <param name="individual2">個體2</param>
 92         /// <returns>支配關系</returns>
 93         public static int Pareto(Individual individual1, Individual individual2)
 94         {
 95             var number1 = individual1.Numbers;
 96             var number2 = individual2.Numbers;
 97             var count = number1.Count;
 98             var results = new int[count];
 99             for (int i = 0; i < count; i++)
100             {
101                 if (number1[i] == number2[i])
102                 {
103                     results[i] = 0;
104                 }
105                 else if (number1[i] < number2[i])
106                     results[i] = 1;
107                 else
108                 {
109                     results[i] = 2;
110                 }
111             }
112             if (results.Contains(1) && !results.Contains(2))
113             {
114                 return 1;//1支配2
115             }
116             else if (!results.Contains(1) && results.Contains(2))
117                 return 2;//2支配1
118             else if (results.Contains(1) && results.Contains(2))
119             {
120                 return 0;//互不支配
121                 //throw new Exception("兩個體為同一個個體");
122             }
123             else
124             {
125                 //完全相同的個體
126                 return 4;
127             }
128         }
129     }
130     /// <summary>
131     /// 個體
132     /// </summary>
133     public class Individual
134     {
135         public Individual(IEnumerable<double> db)
136         {
137             this.Numbers = new List<double>();
138             this.Numbers.AddRange(db);
139             this.MyDominant = new List<Individual>();
140             this.DominantNumber = 0;
141         }
142         /// <summary>
143         /// 有DominantNumber個個體支配該個體
144         /// </summary>
145         public int DominantNumber { get; set; }
146         /// <summary>
147         /// 該個體支配其他個體的集合
148         /// </summary>
149         public List<Individual> MyDominant { get; set; }
150         /// <summary>
151         /// 該個體各個維度數值
152         /// </summary>
153         public List<double> Numbers { get; set; }
154         public void Clean()
155         {
156             this.Numbers.Clear();
157             this.DominantNumber = 0;
158             this.MyDominant.Clear();
159         }
160     }
161     /// <summary>
162     /// 非支配中的一層
163     /// </summary>
164     public class Tier
165     {
166         public Tier()
167         {
168             this.Individuals = new List<Individual>();
169         }
170         public List<Individual> Individuals { get; set; }
171     }
172 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM