1

私が取り組んでいるソルバー プロジェクト (C#) では、品質に関係なく、解決策があるかどうか、または一部の入力が事前に定義された実数の範囲内に収まる問題がないかどうかをテストする必要があります。

値 (パラメーター型) と 2 つの変数 (決定型) で構成される方程式の間の単純な等価性テストを表す 1 つの制約を含む次の例をまとめました。

        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 が選択するソルバーは、多くの要因によって異なります。大きな要因は、目標と制約で決定をどのように使用するかです。この場合、2 つの決定を分割しているため、非常に一般的なソルバーを使用する必要があります。

目標と制約が Decision オブジェクトで線形になるようにモデルを記述できれば、成功率は大幅に向上します。これは常に可能であるとは限りませんが、この特定のケースでは、出力 == 入力 A / 入力 B を入力 B * 出力 == 入力 A に変更できます。

これは役立つはずだと思います。ネイト

于 2012-05-01T14:42:50.790 に答える