算法学习1简单遗传算法寻路
时间:2010-10-10 来源:撞破南墙
使用 Silverlight 做表现层
代码思路:
//1 随机生成 20个 Role
//2 移动
//3评分 如果 满分就退出
//4 杂交
//5变异
//6GOTO2
遗传算法的核心思想
1构造 可杂交和变异的 染色体,
2通过基因组合起来。
3通过外部 优胜劣汰 进行筛选 对应结果的匹配度。
最终得到结果。
通用神经网络类似人的神经网络。
完整源码:
部分代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Net;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace Learning {
public partial class MainPage : UserControl {
private Thread thread1;
private List<Role> list = new List<Role>();
private RoleManager roleManager;
private int OPTime = 0;
public MainPage() {
InitializeComponent();
thread1 = new Thread(yichuan);
dataGrid1.ItemsSource = list;
}
private void yichuan() {
MapManager mapManager = new MapManager();
MapManager.Map[0, 9, 9] = -1;
//1 随机生成 20个 Role
//2 移动
//3评分 如果 满分就退出
//4 杂交
//5变异
//6GOTO2
//1
roleManager = new RoleManager();
for (int i = 0; i < 20; i++) {
roleManager.RoleList.Add(RoleManager.GetRandomRole(9, 9));
}
//2
step2:
for (int i = 0; i < roleManager.RoleList.Count; i++) {
var role = roleManager.RoleList[i];
foreach (var a in role.Directions) {
mapManager.TryMove(ref role, a);
}
}
//3
roleManager.RoleList.ForEach(a => a.GetGrade(Global.ENDX, Global.ENDY));
UpdataDG();
//4
var dad = roleManager.GetRole();
Role mom;
do {
mom = roleManager.GetRole();
} while (mom == dad);
roleManager.CrossOver(ref dad, ref mom);
//5
dad.Mutate(); mom.Mutate();
roleManager.RoleList.ForEach(a => {
if (a.Grade == 1) {
UpdataDG("ok");
Thread.CurrentThread.Abort();
return;
}
});
this.Dispatcher.BeginInvoke(
() => {
this.OPTime++;
textBlock1.Text = "第" + OPTime + "次 总分:" + Environment.NewLine + "最佳表现的终点一个路线和终点" + Environment.NewLine;
var first = roleManager.RoleList.OrderByDescending(a => a.Grade).FirstOrDefault();
textBlock1.Text += first.X + "/" + first.Y + Environment.NewLine;
first.Directions.ToList().ForEach(
a => {
textBlock1.Text += a.ToString();
});
}
);
Thread.Sleep(500);
goto step2;
}
private void UpdataDG() {
this.Dispatcher.BeginInvoke(
() => {
// MessageBox.Show("prefect !");
dataGrid1.ItemsSource = null;
list = roleManager.RoleList.ToList(); //adsadadsda
dataGrid1.ItemsSource = list;
}
);
}
private void UpdataDG(Object OB) {
this.Dispatcher.BeginInvoke(
() => {
MessageBox.Show(OB.ToString());
}
);
}
private void button1_Click(object sender, RoutedEventArgs e) {
thread1.Start();
}
private void button2_Click(object sender, RoutedEventArgs e) {
try {
thread1.Abort();
} catch (Exception) {
}
}
}
}
相关阅读 更多 +