循环构造函数约束

Construct func constraint in cycle

我正在使用 accord.math 求解具有非线性约束的系统。在此示例中,约束有 4 个变量 , x => x[0] + x[1] + x[2] + x[3] <= 1 但如果约束应包含 50 个变量怎么办。如何在循环中构建, x => x[0] + x[1] + x[2] + ...+ x[50] <= 1

namespace ConsoleApplication21
{
class Program
{
    static void Main(string[] args)
    {

        var f = new NonlinearObjectiveFunction(4, x => 0.010 * x[0] - 0.000543 * x[1] - 0.003440 * x[2] + 0.000292 * x[3]);

        var constraints = new[]
        {
           new NonlinearConstraint(4, x => x[0] + x[1] + x[2] + x[3] <= 1),
           new NonlinearConstraint(4, x => x[0] + x[1] + x[2] + x[3] >= 1),

        };

        var cobyla = new Cobyla(f, constraints);

        bool success = cobyla.Maximize();
        double minimum = cobyla.Value;        
        double[] solution = cobyla.Solution;
        Console.WriteLine(minimum);
    }
}
}

如果您只需要一个数组中所有值的总和,您可以使用 LINQ 的 Sum() 方法,如下所示:

new NonlinearConstraint(x.Length, x => x.Sum() >= 1)

一般来说,您可以用 LINQ 的 Enumerable.Range 替换循环。例如,要将 x[first] 加到 x[first+count-1],请使用此表达式:

new NonlinearConstraint(
    x.Length
,   x => Enumerable.Range(first, count).Select(i => x[i]).Sum() >= 1
)