【发布时间】:2021-04-29 03:46:28
【问题描述】:
下面的代码是我正在使用的圆估计器的最小工作示例。它使用 Accord.Net 的 cobyla 优化器。 localize 方法的输入是一组点。使用优化器找到中心位置并返回。 (我的真实代码有点复杂,但我忽略了最不相关的东西)
代码运行良好,但我遇到的问题是 static 字段(我的真实代码中有更多字段)。当我同时优化多个问题时,static 字段会出现问题,因为优化器可能会读取用于另一个线程的值。
问题是如何使这段代码适用于并发代码?我可以抛弃静态并仍然在Func<double[], double> 中获得积分吗?还有其他方法可以规避静态的并发问题吗?
internal class CircleLocalizer
{
private static (double, double)[] points; // I dislike these statics!
private double[] prior = { 0, 0 };
Func<double[], double> objective = x =>
{
var distancesToCenter = CircleLocalizer.points.Select(p => Distance.Euclidean(new[] { p.Item1, p.Item2 }, new[] { x[0], x[1] }));
var averageDistance = distancesToCenter.Average();
return distancesToCenter.Select(d => Math.Pow(d - averageDistance, 2)).Sum();
};
public double[] Localize((double, double) points)
{
CircleLocalizer.points = points;
Cobyla cobyla = new Cobyla(2, objective);
cobyla.Minimize(Prior);
return cobyla.Solution;
}
}
【问题讨论】:
-
不使用静态选项吗?
-
我很乐意,但我不知道如何将
points变量传递给objective函数,因为它必须是cobyla 优化器的Func<double[], double>。如果我将它们添加到double[]参数 cobyla 将开始优化它们,这是不正确的 -
Cobyla 是一种无衍生方法。使用不同的算法可能会获得更好的性能。
标签: c# optimization concurrency accord.net