2016-06-19 3 views
0

JAVA를 통해 Choco Solver로 다차원 배낭 문제를 구현하려고합니다. 제 아이디어는 2 개의 배낭에 3 개의 아이템을 할당하는 것입니다.Choco Solver로 배낭에서 아이템 할당

내 제품의 무게와 배낭 한도 : int [] itemWeight = {2, 2, 2}; int [] knapsackLimit = {4, 4};

그리고 내 결정 변수는 3 가지 항목이 {0, 1} 사이의 배낭을가집니다. int [] itemAllocation = {1, 1, 0};

나는 초코 솔버를 사용하여이 문제를 썼다 :

Model model = new Model("KnapsackProblem"); 

// Allocation variable 
IntVar[] x = new IntVar[3]; 
for (int i = 0; i < itemNumber; i++) { 
    x[i] = model.intVar("x"+i, 0, knapsackNumber-1); 
} 

// Knapsack capacities variables 
IntVar[] limitVar = new IntVar[knapsackNumber]; 
for (int i = 0; i < knapsackNumber; i++) { 
    limit[i] = model.intVar(knapsackLimit[i]); 
} 

IntVar[] itemWeightVar = new IntVar[itemNumber]; 
for (int i = 0; i < itemNumber; i++) { 
    itemWeightVar[i] = model.intVar(0, 2); 
    model.element(itemWeightVar[i], itemWeight,x[i]); 
} 

// Limit Cosntraints 
for (int i = 0; i < knapsackNumber; i++) { 
    model.sum(itemWeightVar, "<=", limit[x[i].getValue()]); 
} 

model.getSolver().solve(); 

불행하게도,이 방법이 작동하지 않습니다. 나는 항상 다음과 같은 할당을 얻습니다 : [x0 = 0, x1 = 0, x2 = 0]

미리 감사드립니다.

답변

0

이것은 일반적인 실수입니다. 제약 사항을 고려하지 않도록 POST를 잊어 버리는 것입니다. 예를 들어, 당신은 대신 (예를 들어 ifThen 문에서 발생하는)을 게시의 제약 조건을 구체화 할 수 있으므로 후 자동 아니라고

model.element(itemWeightVar[i], itemWeight,x[i]).post(); 

참고로

model.element(itemWeightVar[i], itemWeight,x[i]); 

를 교체해야합니다.

https://www.cosling.com/

+0

최저

는 답변 주셔서 감사합니다. 코코라는 Choco Solver의 새로운 이름인가요? – AkrogAmes

+0

당신은 환영합니다. No Cosling은 우리 회사의 이름이지만 Choco Solver에 대한 전문적인 지원을 제공합니다. –