在求解器基金会中使用实数范围Microsoft

本文关键字:实数 范围 Microsoft 基金会 | 更新日期: 2023-09-27 18:32:07

我正在处理的求解器项目(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求解器基金会的经验,我的实现方法是否正确。

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

d.

在求解器基金会中使用实数范围Microsoft

求解器基金会选择的求解器取决于许多因素。一个重要因素是你如何在目标和约束中使用决策。在本例中,您将两个决策分开,这意味着需要使用非常通用的求解器。

如果可以编写模型,使决策对象中的目标和约束是线性的,则会取得更好的成功。我意识到这并不总是可能的,但在这种特定情况下,它可以:将输出 == 输入 A/输入 B 更改为输入 B * 输出 == 输入 A。

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