1

我正在处理的求解器项目(C#)需要测试是否存在解决方案,无论质量如何,或者是否存在某些输入落在某个预定义的实数范围内的问题。

我将以下示例放在一起,其中包含一个约束,表示值(参数类型)和由两个变量(决策类型)组成的方程之间的简单相等测试。

        const double DESIRED_OUTPUT_VALUE = -2.5;

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

        //Defined a value to be tested against
        Parameter output = new Parameter(Domain.Real, "output");
        output.SetBinding(DESIRED_OUTPUT_VALUE);

        //Defined a range between 1 & 10 for the input variables.
        Domain inputDomain = Domain.RealRange(1, 10);
        Decision inputA = new Decision(inputDomain, "inputA");
        Decision inputB = new Decision(inputDomain, "inputB");

        model.AddDecision(inputA);
        model.AddDecision(inputB);
        model.AddParameter(output);

        //The constraint, which given the value of output currently is not solvable.
        Constraint constraint = model.AddConstraint("result", output == inputA / inputB);

        /*Expected that the solver would report back quickly that this is no feasable solution.
         *However instead it just sits there with a blank screen... 
         */
        Solution solution = solver.Solve();
        Report report = solution.GetReport();
        Console.WriteLine(report);
        Console.ReadLine();

我观察到的是,如果约束被改变以至于没有解,并且其中表示的方程是除法或乘法,求解器似乎停止了,没有给出关于它是否仍在求解的任何反馈。

我怀疑这种类似停顿的行为与求解器正在处理实数并且正在进行一些详尽的搜索这一事实有关,但是如果更改约束以便有一个已知的解决方案,它会非常快速地工作。

在搜索了各种论坛之后,我仍然不确定是什么导致了这种行为,或者,鉴于这是我第一次使用 Microsoft Solver Foundation,我的实施方法是否正确。

有没有其他人遇到过这个问题或确实有解决方案?

d。

4

1 回答 1

1

Solver Foundation 选择的求解器取决于许多因素。一个重要因素是您如何在目标和约束中使用决策。在这种情况下,您正在划分两个决策,这意味着需要使用非常通用的求解器。

如果您可以编写模型以使目标和约束在决策对象中是线性的,那么您将获得更好的成功。我意识到这并不总是可能的,但在这种特定情况下,它可以:将 output == inputA / inputB 更改为 inputB * output == inputA。

我认为这应该有所帮助。内特

于 2012-05-01T14:42:50.790 回答