java中的约束满足

java中的约束满足,java,constraint-programming,Java,Constraint Programming,我在用java编程时遇到了一个问题,这是一个约束满足问题: 如果我有这样的约束: x1+x2>x3 x2-x4=2 x1+x4

我在用java编程时遇到了一个问题,这是一个约束满足问题:

如果我有这样的约束:

  • x1+x2>x3
  • x2-x4=2
  • x1+x4
    x1
    x5
    中的每一个都在域
    {0,1,2}

    如何对不同的组合进行编程,使每个约束都有一组元组:
    {(0,0,0),(0,0,1),(0,1,1),(1,0,0),…}

    即即时约束1具有元组的域,例如
    {(0,0,0),(0,0,1),(0,1,0),(0,1,1),(1,0,0),(0,1,2),(2,0,1)…}


    我需要任何语言的回复,但最好是java。

    您可以通过使用google commons collect库中的一些助手方法来实现这一点。它看起来像这样:

    我假设元组(0,0,0)等是约束输入的元组,(x0,x1,x2)用于约束t1,(x2,x4)用于约束t2等

    因此,对于constraint1,首先我们用所有可能的组合填充一个列表:

        final List<int[]> allCombos = new ArrayList<int[]>();
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                for (int k = 0; k < 3; k++) {
                    allCombos.add(new int[] {i, j, k});
                }
            }
        }
        for (final int[] i : allCombos) {
            System.out.println(i[0] + ", " + i[1] + ", " + i[2]);
        }
    

    我将让您对其他约束执行相同的操作。

    您可能可以通过使用google commons collect库中的一些辅助方法来执行此操作。它看起来像这样:

    我假设元组(0,0,0)等是约束输入的元组,(x0,x1,x2)用于约束t1,(x2,x4)用于约束t2等

    因此,对于constraint1,首先我们用所有可能的组合填充一个列表:

        final List<int[]> allCombos = new ArrayList<int[]>();
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                for (int k = 0; k < 3; k++) {
                    allCombos.add(new int[] {i, j, k});
                }
            }
        }
        for (final int[] i : allCombos) {
            System.out.println(i[0] + ", " + i[1] + ", " + i[2]);
        }
    

    我会让你对其他约束做同样的事情。

    哈扎哈扎感谢一百万,这让人大开眼界,它确实会有帮助,但在我的线性方程中的变量数量无法预先确定的情况下,例如1)x1+x2=x3,2)x1-x2+x3=x4,3)x2+x3-x5=x1+x6。您有什么建议?约束是在运行时确定的吗?或者它们是硬编码的?在运行时请。我们希望它能够适应任何长度的变量的任何线性/SAT方程。我不确定我是否理解您在这里试图实现的目标。你想要一个工厂来生产满足特定标准的输入组合表吗?这些标准是否相关?这些标准从何而来?我并不是说这些赘肉必须满足一个标准,而是说所有有机会满足这个标准的赘肉;考虑其他变量。当一个约束有三个变量时,你一开始就得到了它,但它怎么能是动态的,以至于天气元组是'2':{0,0},'3':{1,0,1},'4':{1,0,1,2}等等,它是可以解的。感谢一百万,这让人大开眼界,这确实会有帮助,但在线性方程中的变量数量无法预先确定的情况下,例如1)x1+x2=x3,2)x1-x2+x3=x4,3)x2+x3-x5=x1+x6。您有什么建议?约束是在运行时确定的吗?或者它们是硬编码的?在运行时请。我们希望它能够适应任何长度的变量的任何线性/SAT方程。我不确定我是否理解您在这里试图实现的目标。你想要一个工厂来生产满足特定标准的输入组合表吗?这些标准是否相关?这些标准从何而来?我并不是说这些赘肉必须满足一个标准,而是说所有有机会满足这个标准的赘肉;考虑其他变量。当一个约束有三个变量时,你就得到了它,但是它怎么能是动态的,使得天气元组是'2':{0,0},'3':{1,0,1},'4':{1,0,1,2}等等,它是可解的。
    0, 1, 0
    0, 2, 0
    0, 2, 1
    1, 0, 0
    1, 1, 0
    1, 1, 1
    1, 2, 0
    1, 2, 1
    1, 2, 2
    2, 0, 0
    2, 0, 1
    2, 1, 0
    2, 1, 1
    2, 1, 2
    2, 2, 0
    2, 2, 1
    2, 2, 2