黑马程序员技术交流社区
标题:
抽样找最小路径
[打印本页]
作者:
sunrise2
时间:
2014-8-12 14:56
标题:
抽样找最小路径
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Gens
{
private static List<List<int>> Populations = new List<List<int>>(0);
private static List<Children> TargetGenePool = new List<Children>(0);
private static int GenLength = 8;
private static int MaxPopSize = 1000;
private static Random rdm = new Random(1);
private static int[] Data = new int[] {1,2,3,4,5,6,7,8,9};
private static string BestChromsome = string.Empty;
static void Main()
{
InitialPop();
EvaluateFitness(Populations);
TargetGenePool = TargetGenePool.Distinct().ToList();
EvaluateDistance(TargetGenePool);
int value = TargetGenePool.Min(a=>a.DistanceOffSet);
List<Children> TempValue = TargetGenePool.FindAll(a=>a.DistanceOffSet==value);
foreach (var Item in TempValue)
{
StringBuilder sb =new StringBuilder();
foreach (var unite in Item.Chromsome)
{
sb.Append(unite);
}
if (BestChromsome != sb.ToString())
{
BestChromsome = sb.ToString();
System.Diagnostics.Trace.WriteLine("最佳基因:" + BestChromsome);
}
}
}
static void EvaluateDistance(List<Children> ChromsomeList)
{
foreach(var chromsome in ChromsomeList)
{
List<int> values = new List<int>(0);
for (int Index = 0; Index < chromsome.Chromsome.Count;Index++)
{
if(chromsome.Chromsome[Index]!=0)
{
values.Add(Data[Index]);
}
}
int distance = 0;
for (int i = values.Count-1; i >0; i--)
{
if(i-1>=0)
{
distance += (values[i] - values[i - 1]);
}
}
chromsome.DistanceOffSet = distance;
}
}
static void EvaluateFitness(List<List<int>> Pop)
{
foreach (var ItemCollection in Pop)
{
double fitness = 0.0;
double Sum = 0;
for (int Index = 0; Index < ItemCollection.Count;Index++)
{
if (ItemCollection[Index] != 0)
{
double Value = Data[Index];
Sum += Value;
}
}
if (Sum == 10)
{
fitness = 1.0;
Children child = new Children();
child.Fitness = fitness;
child.Chromsome = ItemCollection;
TargetGenePool.Add(child);
}
}
}
static void InitialPop()
{
int PopSize = 0;
while (PopSize < MaxPopSize)
{
List<int> gen = new List<int>(0);
int currentlength = 0;
while (currentlength <= GenLength)
{
gen.Add(CreateUnite());
currentlength++;
}
Populations.Add(gen);
PopSize++;
}
}
static int CreateUnite()
{
return rdm.Next(0,2);
}
}
class Children
{
/// <summary>
/// 基因序列
/// </summary>
private List<int> chromsome= new List<int>(0);
public List<int> Chromsome
{
get
{
return chromsome;
}
set
{
chromsome = value;
}
}
/// <summary>
/// 适应度
/// </summary>
private double fitness;
public double Fitness
{
get
{
return fitness;
}
set
{
fitness = value;
}
}
/// <summary>
/// 路径差
/// </summary>
private int distanceoffset;
public int DistanceOffSet
{
get
{
return distanceoffset;
}
set
{
distanceoffset = value;
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2