使用two和语句重写max

时间:2010-01-12 02:28:33

标签: logic

假设我想仅使用AND语句和子句重写A< = MAX(B,100)。 < =表示更小或相等。 A和B是变量。有可能吗?

我似乎无法在这个人为的例子中使用微软解决方案基础的OR,这是我在工作中遇到的问题的简化:

决定x =新决定(Domain.Real,“x”);             model.AddDecisions(X);

        Decision y = new Decision(Domain.Real, "y");
        model.AddDecisions(y);

        // Add a constraint
        // x <= MAX(y,200);
        model.AddConstraints("zero", x + Math.Sin(44) == 33.2);
        model.AddConstraints("one", y + x == 5);
        model.AddConstraints("three", x <= -y);
        model.AddConstraints("four", x <= 200);
        // Solve the problem
        context.Solve();

        // Display the results 
        Console.WriteLine("x: {0}", x);
        Console.WriteLine("y: {0}", y);

3 个答案:

答案 0 :(得分:0)

嗯,“NOT(A&gt; MAX(B,100))”的错误是什么?


由于不允许使用MAX,请尝试“NOT(x&gt; a)和NOT(x&gt; 100)”。

答案 1 :(得分:0)

这会有效吗?

  • A)假设B <= 100,求解A和B.如果A> 100或B> 100,那么这个答案就是垃圾。
  • B)假设B> = 100,求解A和B.如果B < 100,然后答案是垃圾。
  • C)断言你A)和B)都没有给出答案。
  • D)编写数十个单元测试(或者用XML等提供)。如果一个断言被提出,那么暂停并检查发生了什么。

答案 2 :(得分:0)

B是非否定的吗?然后MAX是无穷大范数,因为你允许乘法,你可以近似:

A*A*A*A*A*A <= B*B*B*B*B*B + 100*100*100*100*100*100

如果六范数对于无穷大范数不够好,则添加更多项。

此外,可以调整链接的解决方案,甚至不需要MIP:

A <= B + M1
A <= 100 + M2
M1*M2 <= 0