2015-08-25 5 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 в цикле?Construct func constraint в цикле

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

Если все, что вам нужно, это сумма всех значений в массиве, вы можете использовать Sum() метод LINQ, как и это:

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 
) 

 Смежные вопросы

  • Нет связанных вопросов^_^