长话短说,我使用GeneticSharp作为迭代/条件强化学习算法。这意味着我正在创建一组不同的GeneticAlgorithm实例,每个实例都使用一个共享的SmartThreadPool。不过,一次只有一个GA在运行。
在对我的算法进行了几次迭代之后,我遇到了这个错误,这是在尝试启动SmartThreadPool时发生的。
有什么明显的原因应该发生吗?我试过使用不同的STPE,每次处理它,但这似乎也没有帮助。在每一次GA运行之间,我需要做一些手动清理吗?我应该使用一个共享的GA实例吗?
编辑:快速代码示例
static readonly SmartThreadPoolTaskExecutor Executor = new SmartThreadPoolTaskExecutor() { MinThreads = 2, MaxThreads = 8 };
public static void Main(string[] args)
{
var achromosome = new AChromosome();
var bchromosome = new BChromosome();
while(true)
{
achromosome = FindBestAChromosome(bchromosome);
bchromosome = FindBestBChromosome(achromosome);
// Log results;
}
}
public static AChromosome FindBestAChromosome(BChromosome chromosome)
{
AChromosome result;
var selection = new EliteSelection();
var crossover = new UniformCrossover();
var mutation = new UniformMutation(true);
using (var fitness = new AChromosomeFitness(chromosome))
{
var population = new Population(50, 70, chromosome);
var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);
ga.Termination = new GenerationNumberTermination(100);
ga.GenerationRan += LogGeneration;
ga.TaskExecutor = Executor;
ga.Start();
LogResults();
result = ga.BestChromosome as AChromosome;
ga.GenerationRan -= LogGeneration;
}
return result;
}
public static BChromosome FindBestBChromosome(AChromosome chromosome)
{
BChromosome result;
var selection = new EliteSelection();
var crossover = new UniformCrossover();
var mutation = new UniformMutation(true);
using (var fitness = new BChromosomeFitness(chromosome))
{
var population = new Population(50, 70, chromosome);
var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);
ga.Termination = new GenerationNumberTermination(100);
ga.GenerationRan += LogGeneration;
ga.TaskExecutor = Executor;
ga.Start();
LogResults();
result = ga.BestChromosome as BChromosome;
ga.GenerationRan -= LogGeneration;
}
return result;
}AChromosome和BChromosome都相当简单,有两个双倍和两个int,可能还有一个函数指针(指向一个静态函数)。
Edit2:包含替换的底部两个条目的完整调用堆栈
Unhandled Exception: System.IO.IOException: Insufficient system resources exist to complete the requested service.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.Threading.EventWaitHandle..ctor(Boolean initialState, eventResetMode mode, string name)
at Amib.Threading.SmartThreadPool..ctor()
at GeneticSharp.Infrastructure.Threading.SmartThreadPoolTaskExecutor.Start()
at GeneticSharp.Domain.GeneticAlgorithm.EvaluateFitness()
at GeneticSharp.Domain.GeneticAlgorithm.EndCurrentGeneration()
at GeneticSharp.Domain.GeneticAlgorithm.EvolveOneGeneration()
at GeneticSharp.Domain.GeneticAlgorithm.Resume()
at GeneticSharp.Domain.GeneticAlgorithm.Start()
at MyProject.Program.FindBestAChromosome(BChromosome chromosome)
at MyProject.Program.Main(String[] args)Edit3:最后要注意的一点是,我的健身功能非常需要处理,一次运行几乎需要2g内存(运行在一台16克的机器上,所以不用担心)。不过,我没有见过垃圾收集方面的问题。
到目前为止,这只发生在大约5次迭代(这需要多个小时)。
发布于 2015-11-24 22:00:03
原来是我的杀毒软件阻止了线程的最终完成。现在我在一台带有不同杀毒软件的机器上运行,它运行得很好。如果我想出一个更好的答案来解决这个问题,我会在这里更新。
https://stackoverflow.com/questions/33285620
复制相似问题