Choco Solver: как настроить CSP с реальными переменными и ограничениями

Я хотел бы написать программу для автоматического создания помещений. С этой целью я рассмотрел идею постановки задачи в виде CSP, где переменными являются:

  • x_o, y_o: положение объекта o в среде

  • theta_o: ориентация объекта o

и домены:

  • определенный диапазон [a,b] для x и y (т. е. размеры двумерной сетки)

  • [0,90,180,270] градусов для ориентации.

Для реализации этой проблемы я использую Choco в Eclipse 4.7.1a.

Моя проблема заключается в следующем:

Я хотел бы выразить ограничение как: объект а перед объектом б.

Поскольку объекты имеют ориентацию, я подумал, что возможный способ выразить это ограничение:

  • x_b == x_a + cos (theta_a) && y_b == y_a + sin (theta_a)

Из этого ресурса я узнал, что Choco использует Ibex для решения реальных проблем. Я следовал инструкциям по установке и добавил общую библиотеку к java.library.path, Чтобы определить реальное ограничение, я следовал этой документации, но когда я запускаю этот фрагмент кода:

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 ответ

@Tobi Я использую 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());
        }
    }

}
Другие вопросы по тегам