当前位置: 首页 > 知识库问答 >
问题:

Choco Solver:如何使用真实变量和约束设置CSP

云和硕
2023-03-14

我想写一个自动生成室内环境的程序。为此,我考虑了将问题表述为CSP的想法,其中变量为:

>

  • x_o,y_o:对象o在环境中的位置

    θo:对象o的方向

    和域是:

    >

  • x和y的某个范围[a, b](即2D网格的尺寸)

    方向为[0,90180270]度。

    为了实现这个问题,我在Eclipse4.7.1a中使用了Choco。

    我的问题如下:

    我想表达一个约束,比如:对象a在对象b前面。

    由于物体有方向,我认为表达这种约束的一种可能方式是:

    • x_b==x_a cos(θa)

    从这个资源中,我发现Choco使用Ibex来解决实际的约束。我按照安装说明将共享库添加到java。图书馆路径。为了定义一个真正的约束,我遵循以下文档,但当我运行这段代码时:

    import org.chocosolver.solver.Model;
    import org.chocosolver.solver.Solution;
    import org.chocosolver.solver.variables.RealVar;
    
    public class EnvironmentGenerationMain {
    
        public static void main(String[] args) {
            Model model = new Model("Environment generation problem");
            System.out.println(model.getName());
    
            //A
            RealVar x_a = model.realVar("X_a", 0, 2, 1.0d);
            RealVar y_a = model.realVar("Y_a", 0, 2, 1.0d);
            RealVar z_a = model.realVar("Z_a", 0, 270, 90.0d);
    
            //A
            RealVar x_b = model.realVar("X_b", 0, 2, 1.0d);
            RealVar y_b = model.realVar("Y_b", 0, 2, 1.0d);
            RealVar z_b = model.realVar("Z_b", 0, 270, 90.0d);
    
            model.post(model.realIbexGenericConstraint("{0}={1}+cos{2}", x_b,x_a,z_a));
            model.post(model.realIbexGenericConstraint("{0}={1}+sin{2}", y_b,y_a,z_a));
    
    
            Solution solution = model.getSolver().findSolution();
            if(solution != null){
                System.out.println(solution.toString());
            }
    
        }
    
    }
    

    这是我得到的错误:

    Environment generation problem
    #
    # A fatal error has been detected by the Java Runtime Environment:
    #
    #  SIGSEGV (0xb) at pc=0x00007f7e322b0891, pid=21072, tid=0x00007f7e63562700
    #
    # JRE version: OpenJDK Runtime Environment (8.0_151-b12) (build 1.8.0_151-8u151-b12-0ubuntu0.16.04.2-b12)
    # Java VM: OpenJDK 64-Bit Server VM (25.151-b12 mixed mode linux-amd64 compressed oops)
    # Problematic frame:
    # C  [libibex-java.so+0x4891]  Java_org_chocosolver_solver_constraints_real_Ibex_add_1ctr+0x61
    #
    # Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
    #
    # An error report file with more information is saved as:
    # /home/dede/eclipse-workspace/EnvironmentGeneration/hs_err_pid21072.log
    #
    # If you would like to submit a bug report, please visit:
    #   http://bugreport.java.com/bugreport/crash.jsp
    # The crash happened outside the Java Virtual Machine in native code.
    # See problematic frame for where to report the bug.
    #
    

    我发现这是一个常见的问题:

    写入核心转储失败。核心转储已被禁用

    但是我在网上找到的答案都没有解决我的问题。

    所以,如果有人能给我指出一个解决方案,我会非常高兴的!!!

    谢谢

  • 共有1个答案

    轩辕炎彬
    2023-03-14

    @托比:我在用Linux

    升级到Choco 4.0.6和Ibex 2.6.3解决了这个问题。为了让事情顺利进行,我还必须调试代码。这是一个有效的例子:

    package it.semanticmapping.environmentgeneration;
    
    import org.chocosolver.solver.Model;
    import org.chocosolver.solver.Solution;
    import org.chocosolver.solver.variables.RealVar;
    
    public class EnvironmentGenerationMain {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Model model = new Model("Environment Generation");
            System.out.println(model.getName());
    
    
            //A
            RealVar x_a = model.realVar("X_a", 0, 2, 0.0001d);
            RealVar y_a = model.realVar("Y_a", 0, 2, 0.0001d);
            RealVar z_a = model.realVar("Z_a", 0, Math.PI*3/2, Math.PI/2);
    
            //B
            RealVar x_b = model.realVar("X_b", 0, 2, 0.0001d);
            RealVar y_b = model.realVar("Y_b", 0, 2, 0.0001d);
            RealVar z_b = model.realVar("Z_b", 0, Math.PI*3/2, Math.PI/2);
    
            RealVar cost = model.realVar(0);
    
            model.post(model.realIbexGenericConstraint("{0}={1}", z_a,cost));
            model.post(model.realIbexGenericConstraint("{0}={1}+cos({2})", x_b,x_a,z_a));
            model.post(model.realIbexGenericConstraint("{0}={1}+sin({2})", y_b,y_a,z_a));
            model.post(model.realIbexGenericConstraint("{0}={1}", z_b, z_a));
    
            Solution solution = model.getSolver().findSolution();
            if(solution != null){
                System.out.println(solution.toString());
            }
        }
    
    }
    
     类似资料:
    • 本文向大家介绍Java泛型变量如何添加约束,包括了Java泛型变量如何添加约束的使用技巧和注意事项,需要的朋友参考一下 有时,类或方法需要对类型变量加以约束。下面是一个典型的例子,我们要寻找数组中的最小元素: 上述代码中的限制了用于实例化类型参数T的类型,必须是实现Comparable接口(只含有compareTo方法的标准接口)的类。如果没有对T进行限制,那么无法确保实例化T的类型具有compa

    • 这个问题以前问过,但解决方案假设你熟悉OS X,不幸的是,我不熟悉,所以请耐心听我说。我想从终端命令中使用。在优胜美地,我找不到简单的方法。这里提出了解决方案,但我不知道如何使用它。解决方法如下 在OSX的早期版本中(小牛、山狮、狮子等),环境变量在/etc/launchd中配置。conf文件。从OSX优胜美地开始,这已经不起作用了。要配置环境变量,可以执行以下操作 ###############

    • 我花了两天时间尝试了混合和纯自动布局方法的各种解决方案,以实现在自动布局之前简单的滚动视图设置,现在它是正式的了——我一定太傻了。我主要是在故事板中设置这个(嗯,就是这样)。 所以我请求帮助。 视图树: 按钮应该水平滚动(从左到右,反之亦然)。有人能告诉我如何设置约束来使用纯自动布局实现这一点吗??? -- 我尝试了混合方法,如下所示: ...以及根据Apple的TechNote为< code>c

    • 问题内容: 我正在使用来更新旧的应用,并且当没有广告时,它会滑出屏幕。出现广告时,它会在屏幕上滑动。基本的东西。 旧样式,我将帧设置在动画块中。新样式,我对自动布局约束有一个确定Y位置,在这种情况下,它是距父视图底部的距离,并修改常量: 横幅完全按预期移动,但没有动画。 更新:我重新观看了WWDC 12讲的“掌握自动布局的最佳实践” ,其中涵盖了动画。它讨论了如何使用CoreAnimation更新

    • 问题内容: 对于多分支项目,我有一个声明性管道脚本,在该脚本中,我想读取文本文件并将结果存储为字符串变量,以供管道的后续步骤访问。使用摘要生成器,我尝试执行以下操作: 为此,这将是我的字符串。 在Jenkins控制台输出中出现错误: 我是否需要使用一个步骤来将Jenkins环境变量的输出设置为?如果是这样,怎么办? 谢谢 问题答案: 该错误是由于只允许您在指令中使用管道步骤。我知道一种解决方法是使

    • 这与本文有关,但不同之处在于我试图理解为什么我不能从地理定位的内部设置外部变量。getCurrentPosition 我似乎无法从中获得任何类型的返回值,也无法从中设置值。我只能从内部访问position对象。我已经试着把这个传进来了。 我用叉子叉了德里克-朕會功夫's fiddle并修改它:https://jsfiddle.net/TwoFistedJustice/c3qr29L7/1/ 这是另