C#:使用Microsoft求解器求解非线性系统

时间:2018-05-09 11:27:09

标签: c# optimization solver nonlinear-optimization

使用Microsoft Solver Foundation,到目前为止我只解决了线性问题。我现在正试图解决一个非常简单的非线性问题,但由于某些原因,Microsoft求解器无法解决它。

问题是最大化a0 * a1,其中a0 <10且a1 <20。 以下是我使用的代码:

使用System; 使用Microsoft.SolverFoundation.Services;

命名空间SolverFoundationDemo {     课程     {         static void Main(string [] args)         {             Console.WriteLine(&#34; \ nBegin Solver demo \ n&#34;);

        var solver = SolverContext.GetContext();
        var model = solver.CreateModel();

        var decision1 = new Decision(Domain.RealNonnegative, "a0"); model.AddDecision(decision1);
        var decision2 = new Decision(Domain.RealNonnegative, "a1"); model.AddDecision(decision2);


        model.AddConstraint("Constraint0", "a0 <=10");
        model.AddConstraint("Constraint1", "a1 <=20");


         model.AddGoal("Goal", GoalKind.Maximize, " a0*a1 ");


        var solution = solver.Solve();


        Console.WriteLine("\nEnd Solver demo\n");
        Console.ReadLine();
    } 
} 

}

我得到的错误是&#34;该模型不是凸的&#34; ,这是真的,但我期待微软解决方案足够聪明,无论如何都能找到解决方案。

非常感谢您的反馈。

此致

1 个答案:

答案 0 :(得分:-1)

实际上,Microsoft Solver默认选择NLP。出于某些原因,如果我添加一个无用的约束,如a0 * a1&lt; 1000000,它的工作原理。如果我不添加此约束,它不起作用.. 我对这个解算器真的不满意。 Erwin,你能否告诉我应该使用哪个解算器如果我想从Microsoft解算器切换?

我的程序是C#编写的。我在Datable中有我的所有决定和约束,并将其传递给求解器,如下所示。为了避免重写整个内容,我想要一个可以使用相同方法提供的求解器。

string Comment = Convert.ToString(Table_Constraints.Rows [i] [“Comment”]);

string Constraints = Convert.ToString(Table_Constraints.Rows [i] [“Constraint”]);

model.AddConstraint(Comment,Constraints);