Esempio n. 1
0
 //评估高干扰小区以及关联小区集合总C2I干扰
 public double checkhighlist(double delta2, List<int> highlist,Individual indiv)
 {
     int i=0;
       int j=0;
       double interftemp = 0;
     //同频干扰
       for (i = 0; i < highlist.Count; i++)
       {
           for (j = 0; j < slist.sectorList.Count; j++)
           {
               if (indiv.gene[highlist[i]] != -1 && indiv.gene[j] != -1)
               {
                   //同频
                   if (indiv.gene[highlist[i]] == indiv.gene[j])
                   {
                       interftemp += slist.InterfMatrix[highlist[i], j];
                       interftemp += slist.InterfMatrix[j, highlist[i]];
                   }
                   else//异频
                   {
                       interftemp += slist.InterfMatrix[highlist[i], j] * delta2;
                       interftemp += slist.InterfMatrix[j, highlist[i]] * delta2;
                   }
               }
           }
       }
         return interftemp;
 }
Esempio n. 2
0
 //评估整个个体(方案)的C2I干扰
 public double check(double delta2,ref Individual indiv)
 {
     //计算初始的小区间同频以及异频干扰总和
     int i=0;
     int j=0;
     double interftemp = 0;
     //同频干扰
     for (i = 0; i < slist.sectorList.Count; i++)
     {
         for (j = 0; j < slist.sectorList.Count; j++)
         {
             if (indiv.gene[i] != -1 && indiv.gene[j] != -1)
             {
                 //同频
                 if (indiv.gene[i] == indiv.gene[j])
                 {
                     interftemp += slist.InterfMatrix[i, j];
                 }
                 else//异频
                 {
                     interftemp += slist.InterfMatrix[i, j] * delta2;
                 }
             }
         }
     }
     indiv.interf = interftemp;
     return interftemp;
 }
Esempio n. 3
0
 public void clone(ref Individual individual)
 {
     for (int i = 0; i < gene.Length; i++)
     {
         individual.gene[i] = gene[i];
     }
     individual.interf = interf;
 }
Esempio n. 4
0
 //评估函数(上+下)
 public double DownEvalueTotalFitness(int n, int k, Individual individual, List<int> highintefcelllist)
 {
     Individual tempindiv = new Individual(slist.sectorList.Count);
     individual.clone(ref tempindiv);
     int i = 0, j = 0;
     int minindex = 0;
     double minintfess = 0;
     for (i = k + 1; i < n; i++)
     {
         for (j = 0; j < slist.sectorList[highintefcelllist[i]].useablefcn.Count; j++)
         {
             if (j == 0)
             {
                 tempindiv.gene[highintefcelllist[i]] = slist.sectorList[highintefcelllist[i]].useablefcn[j];
                 minindex = 0;
                 minintfess = checkhighlist(delta2, highintefcelllist,tempindiv);
             }
             else
             {
                 tempindiv.gene[highintefcelllist[i]] = slist.sectorList[highintefcelllist[i]].useablefcn[j];
                 double tempinter = checkhighlist(delta2, highintefcelllist, tempindiv);
                 if (tempinter < minintfess)
                 {
                     minintfess = tempinter;
                     minindex = j;
                 }
             }
         }
         tempindiv.gene[highintefcelllist[i]] = slist.sectorList[highintefcelllist[i]].useablefcn[minindex];
     }
     return checkhighlist(delta2,highintefcelllist,tempindiv);
 }
Esempio n. 5
0
        //数据的预处理
        private void prepareData(string configFile)
        {
            XML xml = new XML(configFile);
            DB db = new DB("Configuration/Database");
            try
            {
                #region ;从 配置文件 获取 数据库配置信息 ;并连接数据库
                if (db.initialize(xml) == false)
                {
                    Console.WriteLine("初始化配置文件错误!");
                    return;
                }
                if (db.GetConnection() == null)
                {
                    Console.WriteLine("连接数据库错误!");
                    return;
                }
                #endregion

                slist = new SectorList("Configuration/SqlInitSectorInfoof37900", "Configuration/SqlInitSectorInfoof38098", "Configuration/SqlInitInterfInfo");

                #region ;从 配置文件 获取 小区列表 各项信息;
                if (slist.initialize(db, xml) == false)
                {
                    Console.WriteLine("初始化数据错误!");
                    return;
                }
                ancestor = new Individual(slist.sectorList.Count);
                ancestorori = new Individual(slist.sectorList.Count);
                for (int i = 0; i < slist.sectorList.Count; i++)
                {
                    ancestor.gene[i] = slist.sectorList[i].FCN;
                    ancestorori.gene[i] = slist.sectorList[i].FCN;
                }
                #endregion
            }
            catch (Exception e)
            {
                Console.WriteLine("PREPARE ERR: {0}!", e.Message);
            }
            finally
            {
                db.close();
                xml.Dispose();
            }
        }
Esempio n. 6
0
 //分支界限法搜索频点序列
 public void SearchBetter2(List<int> highintefcelllist)
 {
     System.Diagnostics.Stopwatch Time = new System.Diagnostics.Stopwatch();
     Time.Start();
     Individual indiv = new Individual(slist.sectorList.Count);
     ancestor.clone(ref indiv);
     double interftempori = checkhighlist(delta2,highintefcelllist,indiv);
     for (int i = 0; i < highintefcelllist.Count; i++)
     {
         indiv.gene[highintefcelllist[i]] = -1;
     }
     int k = 0;// 小区下标
     int n = highintefcelllist.Count;//小区个数
     int[] fcnindex = new int[n];
     int[] x = new int[n];
     for (int j = 0; j < n; j++)
     {
         fcnindex[j] = -1;
     }
     int count = 0;
     int index = 0;
     //按照层次,横向搜索
     for (int ii = 0; ii < n; ii++)
     {
         double minfitness = 0;
         int minfitnessindex = 0;
         bool first = true;
         for (index = 0; index < slist.sectorList[highintefcelllist[ii]].useablefcn.Count; index++)
         {
             count++;
             x[ii] = slist.sectorList[ii].useablefcn[index];
             if (checkhighlist(delta2, highintefcelllist, indiv) < interftempori)//可以加条件,剪枝,保证个体条件不恶化
             {
                 indiv.gene[highintefcelllist[ii]] = x[ii];
                 if (first)
                 {
                     //评估函数(上界+下界),这里是按照干扰来评估的。
                     minfitness = DownEvalueTotalFitness(n, ii, indiv, highintefcelllist);
                     minfitnessindex = index;
                     first = false;
                 }
                 else
                 {
                     double temp = DownEvalueTotalFitness(n, ii, indiv, highintefcelllist);
                     if (temp < minfitness)
                     {
                         minfitness = temp;
                         minfitnessindex = index;
                     }
                 }
             }//if
             indiv.gene[highintefcelllist[ii]] = -1;
         }//for
         x[ii] = slist.sectorList[ii].useablefcn[minfitnessindex];
         indiv.gene[highintefcelllist[ii]] = x[ii];
         if (checkhighlist(delta2, highintefcelllist, indiv) > interftempori)
         {
             Console.WriteLine("到达第"+ii+"个小区最优解方向就已经停止,没搜到,一共用时 {0}", Time.Elapsed.TotalSeconds);
             break;
         }
     }//for
     double t=checkhighlist(delta2,highintefcelllist,indiv);
     if (t<=interftempori)//最后筛选的条件,选择满足什么样条件的个体
     {
         indiv.clone(ref ancestor);
         Time.Stop();
         Console.WriteLine("已经搜到,一共用时 {0}S,干扰小区和关联小区集合一共提高{1}", Time.Elapsed.TotalSeconds,(interftempori-t)/interftempori*100+"%");
     }
     else
     {
         Time.Stop();
         Console.WriteLine("没有搜到,一共用时 {0}S", Time.Elapsed.TotalSeconds);
     }
 }
Esempio n. 7
0
 //回朔法搜索频点序列
 public bool SearchBetter(List<int> highintefcelllist)
 {
     System.Diagnostics.Stopwatch Time1 = new System.Diagnostics.Stopwatch();
     Time1.Start();
     Individual indiv = new Individual(slist.sectorList.Count);
     ancestor.clone(ref indiv);
     double interftempori = checkhighlist(delta2, highintefcelllist, ancestor);
     double orihighlist = interftempori;
     for (int i = 0; i < highintefcelllist.Count; i++)
     {
         indiv.gene[highintefcelllist[i]] = -1;
     }
     int k = 0;// 小区下标
     int n = highintefcelllist.Count;//小区个数
     int[] fcnindex = new int[n];
     for (int j = 0; j < n; j++)
     {
         fcnindex[j] = -1;
     }
     //这是主要的回朔
     bool flag = false;
     int count = 0;
     int deletecount = 0;
     int solutioncount = 0;
     while (k >= 0 && Time1.Elapsed.TotalSeconds <= 300)//&& Time.Elapsed.TotalSeconds <= 300
     {
         fcnindex[k]++;
         indiv.gene[highintefcelllist[k]] = -1;
         if (fcnindex[k] < slist.sectorList[highintefcelllist[k]].useablefcn.Count)
         {
             indiv.gene[highintefcelllist[k]] = slist.sectorList[highintefcelllist[k]].useablefcn[fcnindex[k]];
             count++;
         }
         else
         {
             fcnindex[k] = -1;//重新置空PCI;列表下标,这里出了问题以前!
             k = k - 1;//回朔到上一个小区
             continue;
         }
         //其中OK函数负责找到PCI,并且实际分配
         while (checkhighlist(delta2, highintefcelllist, indiv) > interftempori)//可以加其他条件
         {
             fcnindex[k]++;
             deletecount++;
             if (fcnindex[k] < slist.sectorList[highintefcelllist[k]].useablefcn.Count)
             {
                 indiv.gene[highintefcelllist[k]] = slist.sectorList[highintefcelllist[k]].useablefcn[fcnindex[k]];//继续找下一个可用PCI
                 count++;
             }
             else
             {
                 break;
             }
         }
         if (fcnindex[k] < slist.sectorList[highintefcelllist[k]].useablefcn.Count)
         {
             if (k == n - 1)
             {
                 double tempinterf = checkhighlist(delta2, highintefcelllist, indiv);
                 if (tempinterf < interftempori)
                 {
                     interftempori = tempinterf;
                     indiv.clone(ref ancestor);
                     solutioncount++;
                     flag = true;
                     Console.WriteLine("高干扰小区以及关联小区一共提升了" + (orihighlist - interftempori) / orihighlist * 100 + "%");
                     continue;
                 }
                 else
                 {
                     continue;
                 }
             }
             else
             {
                 k = k + 1;//分配下一个PCI
             }
         }
         else
         {
             fcnindex[k] = -1;//重新置空PCI;列表下标,这里出了问题以前!
             indiv.gene[highintefcelllist[k]] = -1;
             k = k - 1;//回朔到上一个小区
         }
     }
     if (flag)
     {
         Console.WriteLine("搜索节点个数为:" + count + "剪枝个数为:" + deletecount + "解的个数为:" + solutioncount);
         return true;
     }
     else
     {
         Console.WriteLine("搜索节点个数为:" + count + "剪枝个数为:" + deletecount + "解的个数为:" + solutioncount);
         return false;
     }
 }