在 C# 中,我编写了一个为 CAD 程序 (Rhino) 创建几何图形的遗传算法。该算法包含在一个库中,我为 CAD 程序编写了一个小型 Windows 窗体插件。调用 GA.run() 函数将返回一个列表,该列表填充一个列表框,选择一个项目将在 CAD 程序中生成几何图形。
在 Windows 窗体应用程序中,我创建了一个 GA 类的实例,并通过单击开始按钮从窗体中收集各种 GA 设置并调用 GA.run() 函数。现在,由于这是一种遗传算法,它会在返回之前运行若干代。但是,我希望可以选择在它运行所有代之前停止该功能。如何从我的插件中停止 GA.run() 函数?当我点击运行按钮时,Windows 窗体应用程序“暂停”,直到 GA.run() 返回其列表...
我想有更好的方法来调用 GA.run()?..
停止按钮代码:
private void runBtn_Click(object sender, EventArgs e)
{
// get rule settings
SettingsHolder gaSettings = new SettingsHolder();
gaSettings.GenMaxrun = (int)gensNUD.Value;
..
gaAlgo = new GA(algoSettings);
try
{
currentPopulation = paretoAlgo.run();
}
catch(Exception e)
{
MessageBox.Show("exc while trying run: " + e);
}
// iterate list and list in form
popLB.Items.Clear();
foreach (Chromosome c in currentPopulation)
{
popLB.Items.Add(new KeyValuePair<String, int> (c.present(), id));
}
}
GA.运行():
public List<Chromosome> run()
{
try
{
initPop();
// loop until genMaxrun or no new achieved
do
{
// create geometries from chromosomes
foreach (Chromosome chromo in population)
{
chromo.embryogeny(Settings);
}
// step 2:Fitness
// union the population and archive
unionPop = new List<Chromosome>(population);
unionPop.AddRange(archive);
calculateDomination(unionPop);
foreach(Chromosome chromo in unionPop)
{
chromo.calculateRawFitness(unionPop);
chromo.calculateDensity(unionPop);
chromo.setFitness();
}
environmentalSelection();
// increase Generation +1
generation += 1;
// create new population...
population = reproduction(generation);
}
while (generation < Settings.GenMaxrun);
}
catch (Exception e)
{
throw new Exception("Error in SPEA run", e);
}
return archive;
}
有没有办法在 run() 的 while 循环中添加检查?表单应用程序中的停止按钮单击事件能否更改 GA 的参数(因为它正在执行 run() 函数)并且 run() 函数将中止?或者我可以从 GA.run() 检查调用者中的参数吗?还是我需要使用线程?
如果我需要更准确地解释某些事情,请告诉我。
干杯,埃里克