使用 GeneticSharp 时系统资源不足,无法完成请求的服务

Insufficient system resources exist to complete the requested service when using GeneticSharp

长话短说,我将 GeneticSharp 用于 iterative/conditional 强化学习算法。这意味着我正在制作一堆不同的 GeneticAlgorithm 实例,每个实例都使用共享的 SmartThreadPool。不过一次只有一个 GA 运行ning。

在我的算法迭代几次之后,我 运行 遇到了这个错误,它在尝试启动 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 都相当简单,几个双精度数和整数,也许还有一个函数指针(指向静态函数)。

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 的内存(运行ning 在 16g 的机器上,所以没有担心那里)。不过,我没发现垃圾回收有任何问题。

到目前为止,这只会在大约 5 次迭代(需要数小时)后发生。

原来是我的防病毒软件阻止了线程完成。现在我 运行 它在一台装有不同防病毒软件的机器上,它 运行 很好。如果我想出一个更好的答案来解决这个问题,我会在这里更新。