2016-08-12 3 views
1

Choco Solver를 사용하고 int vars의 배열이 주어지면 배열의 적어도 하나의 var가 static과 같은지 확인하는 제약 조건을 원합니다. 값 ... IntConstraintFactory#count 유사하지만 다음과 같은 문서와Choco Solver를 사용하는 Var 배열에서 적어도 하나의 Var이 X와 같습니다.

뭔가 :

/** 
* Let N be the number of variables of the VARIABLES collection assigned to value VALUE; 
* Enforce condition N >= LIMIT to hold. 
* <p> 
* 
* @param VALUE an int 
* @param VARS a vector of variables 
* @param LIMIT a variable 
*/ 
public static Constraint at_least(int VALUE, IntVar[] VARS, IntVar LIMIT) { 
    return new Constraint("At least", /* help here ? */); 
} 

하는가가 존재하거나 내가 효율적으로 구현할 수있는 방법을 경우 사람이 아는 사람? 당신이 Choco Solver에 제약 atLeast(VALUE,VARS, LIMIT)을 게시 할 경우

+0

대부분의 최적화 - 프리미티브 (SAT, MIP, CP)에 대해 일반적으로 접근하는 한 가지 접근법은 지시문 제약 조건을 도입하여 변수가 "목표 값"에 도달하면 표시합니다. 그런 다음 사용 가능한 카디널리티 접근 방식 중 하나를 추가합니다 (또는 경우에 따라 "OR"을 사용). – sascha

+0

CP 커뮤니티에서이 제약에 대한 일반적인 이름은 GCC (글로벌 카디널리티 제약) 일 수 있습니다. 이것은 아마도 당신이 (특히 choco에 익숙하지 않은) 대답을 찾는 데 도움이 될 것입니다. – tobyodavies

답변

1

, 당신은 단순히 X으로, 초기 도메인 [0,VARS.length]의으로 intVar를 count(VALUE,VARS,X)를 게시하고, arithm(X,">=",LIMIT)을 게시 할 수 있습니다. 이것은 일을 할 것입니다. 이를 위해 특정 제약 조건을 구현할 필요가 없습니다.

당신이 VARS에서 적어도 하나 개의 변수가 VALUE 같다는 것을 확인하려면

, 그것은 단순히 X의 초기 도메인으로 [1,VARS.length]count(VALUE, VARS, X)를 게시, 심지어는 간단하다. 따라서 VALUE의 최소 발생 수는 적어도 1이됩니다. 두 번째 변수와 산술 제약 조건을 만들 필요가 없습니다.

+0

큰 감사 ... – avianey