寻求适配C#应用的连续数学最小化算法或库
寻找适配多控制多目标的数学优化算法或C#库
我想确认这个问题是否适合发布在Stack Overflow,如果不合适,麻烦建议合适的发布平台。
我的C#应用需要实现一种数学优化算法,场景如下:
- 存在多个控制值(3个及以上),控制值会影响系统状态,进而间接改变测量得到的目标值。哪怕只修改一个控制值,都可能改变所有目标值,且控制值与目标值之间的关系是未知的。
- 算法目标:找到所有极小值——也就是控制值处于指定范围内,且所有目标值都落在期望误差范围内的点。后续会通过其他代码筛选全局极小值。如果已知系统仅存在1个极小值,优化器在识别到该点后需立即终止,无需继续搜索。
- 限制条件:更改系统状态和进行测量的计算成本极高,因此优化过程要尽可能减少迭代次数。
- 额外需求:需要能访问优化过程中产生的“猜测”数据,以便在重复计算时复用——因为系统可能发生细微变化,复用之前的拟合数据能显著加速计算。
目前我找不到能适配这种场景的连续数学优化算法或C#库。
以下是我编写的Optimizer框架代码及测试类,其中空的Optimize和AllMinimaFound方法是我打算接入算法或库的位置:
public class Optimizer { public List<Control> Controls { get; init; } = new(); public List<Target> Targets { get; init; } = new(); public List<Minima> Minimas { get; init; } = new(); public OptimizerData Data { get; init; } = new(); public void Optimize() { //1. 生成控制值的猜测值,为Controls列表中的每个对象赋值OptimizedValue //2. 将当前控制值与目标值的组合保存到Data中 //3. 如果找到极小值,将其添加到Minimas列表 } public bool AllMinimaFound() { //当判断可能没有更多极小值时返回true,用于终止优化器 } public class Control { public string Name { get; init; } public double OptimizedValue { get; set; } public double MinBound { get; init; } public double MaxBound { get; init; } public Control(string name, double minBound, double maxBound) { Name = name; MinBound = minBound; MaxBound = maxBound; } } public class Target { public string Name { get; init; } public double MeasuredValue { get; set; } public double TargetValue { get; init; } public double ErrorMargin { get; init; } public Target(string name, double target, double errorMargin) { Name = name; TargetValue = target; ErrorMargin = errorMargin; } public bool IsWithinMargin() { return Math.Abs(MeasuredValue - TargetValue) < ErrorMargin; } } public class Minima { public Dictionary<string, double> ControlNamesAndValues { get; init; } = new(); // 存储该极小值对应的所有控制值名称和数值 } public class OptimizerData { private List<OptimizerDataPoint> DataPoints { get; init; } = new(); public void AddDataPoint(List<Control> controls, List<Target> targets) { DataPoints.Add(new(controls, targets)); } public class OptimizerDataPoint { public Dictionary<string, double> controlsNamesAndValues { get; init; } = new(); public Dictionary<string, double> targetsNamesAndValues { get; init; } = new(); public OptimizerDataPoint(List<Control> controls, List<Target> targets) { foreach (Control control in controls) { controlsNamesAndValues.Add(control.Name, control.OptimizedValue); } foreach (Target target in targets) { targetsNamesAndValues.Add(target.Name, target.MeasuredValue); } } } } } public class OptimizerTester { public void OptimizeTest() { Optimizer optimizer = new(); optimizer.Controls.Add(new("Length", -5, 5)); optimizer.Controls.Add(new("Width", 10, 125)); optimizer.Controls.Add(new("Height", -7, 0)); optimizer.Targets.Add(new("Mass", 20, 0.01)); optimizer.Targets.Add(new("SurfaceArea", 32, 0.01)); optimizer.Targets.Add(new("BoundingBoxVolume", 150, 0.01)); //测试1 - 找到所有极小值 while (!optimizer.AllMinimaFound()) { optimizer.Optimize(); SetMeasuredTargetValues(optimizer.Targets); } //测试2 - 找到第一个极小值后终止 while (optimizer.Minimas.Count < 1) { optimizer.Optimize(); SetMeasuredTargetValues(optimizer.Targets); } } public void SetMeasuredTargetValues(List<Optimizer.Target> targets) { //外部代码:测量并设置每个Target的MeasuredValue } }
请问有人能帮我确定可实现此需求的算法或现有C#库吗?
内容的提问来源于stack exchange,提问作者K.S.
相关产品推荐
相关产品推荐

