使用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; ,这是真的,但我期待微软解决方案足够聪明,无论如何都能找到解决方案。
非常感谢您的反馈。
此致
答案 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);