2015-08-25 17 views
1

我正在使用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); 
    } 
} 
} 

回答

1

如果你需要的是一切价值的总和在阵列中,你可以使用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 
)