2017-11-28 6 views
0

해석 된 클래스 :초코 나는 초코 솔버와 마법의 사각형 프로그램을 해결하기 위해이 코드를 발견

public static void main(String[] args) { 
    int n = 4; 
    System.out.println("Magic Square Problem with n = " + n); 

    Problem myPb = new Problem(); 

    IntVar[] vars = new IntVar[n * n]; 
    for (int i = 0; i < n; i++) 
     for (int j = 0; j < n; j++) { 
     vars[i * n + j] = myPb.makeEnumIntVar("C" + i + "_" + j, 1, n * n); 
    } 
    IntVar sum = myPb.makeEnumIntVar("S", 1, n * n * (n * n + 1)/2); 

    myPb.post(myPb.eq(sum, n * (n*n + 1)/2)); 
    for (int i = 0; i < n * n; i++) 
     for (int j = 0; j < i; j++) 
     myPb.post(myPb.neq(vars[i], vars[j])); 

    int[] coeffs = new int[n]; 
    for (int i = 0; i < n; i++) { 
     coeffs[i] = 1; 
    } 

    for (int i = 0; i < n; i++) { 
    IntVar[] col = new IntVar[n]; 
    IntVar[] row = new IntVar[n]; 

    for (int j = 0; j < n; j++) { 
     col[j] = vars[i * n + j]; 
     row[j] = vars[j * n + i]; 
    } 

    myPb.post(myPb.eq(myPb.scalar(coeffs, row), sum)); 
    myPb.post(myPb.eq(myPb.scalar(coeffs, col), sum)); 

    myPb.solve(); 
}  

그러나 클래스 '문제'는 '모델'클래스로 대체 된 것으로 보인다. Problem.makeEnumIntVar 대신 Model.intVar을 사용하는 것이 맞습니까? Problem.neq, Problem.eq 및 Problem.scalar를 대체하는 현재 함수는 무엇이겠습니까?

답변

1

일부 비난 된 코드가있는 것 같습니다. 식이

Problem.scalar and Problem.eq 

int capacity = 34; // max capacity 
int[] volumes = new int[]{7, 5, 3}; 

// Problem.scalar 
model.scalar(new IntVar[]{obj1, obj2, obj3}, volumes, "=", capacity).post(); 

// Problem.eq 
model.arithm(obj1, "=", obj2).post(); 

같이 표현 될 수있다, 예를 들어 상기 코드는 스칼라 제품 용량 같다 제약 및 그 OBJ1obj2보다 같아야 표현 .

추가 읽기 및 자원 : 특히 https://github.com/chocoteam/choco-solver/tree/master/src/test/java/org/chocosolver/solver

: choco tutorial

마지막으로 당신은 또한 GitHub의에서 테스트 케이스를 확인하실 수 있습니다 : 여기

당신은 몇 가지 예제 코드로 latests 튜토리얼을 찾을 것입니다 변수의 표현에 대한 테스트가 흥미로울 수 있습니다.

여기에 몇 가지 코드 예제가 있습니다. more code samples

관련 문제