2012-02-28 7 views
0

정수 프로그래밍 모델을 가지고 있고 그것을 cplex로 선형 이완으로 풀고 싶습니다. 원래, 나는 나의 변수를 정의했다 :cplex를 사용하여 LP를 해결합니다.

BoolVarMatrix X(env,I); 
for(IloInt i = 0; i < I; i++){ 
    X[i] = IloBoolVarArray(env, J); 
} 

IloBoolVarArray y(env,J); 

하지만 지금은 0 < = X < = 1, 0 < = Y < = 1의 범위로 휴식을 취한다. 그렇게하기 위해 정의를 다음과 같이 변경했습니다.

NumVarMatrix X(env,I, 0, 1); 
for(IloInt i = 0; i < I; i++){ 
    X[i] = IloNumVarArray(env, J, 0, 1); 
} 

IloNumVarArray y(env,J, 0, 1); 

그러나 여전히 정수 솔루션을 제공합니다. 대신 내가 어떻게해야합니까?

답변

0

여유있는 LP도 정수일 수있는 최적의 솔루션을 가지고있을 가능성이 큽니다. 바인딩을 추가하는 것을 확인하는 한 가지 빠른 방법은이 일부 분수 값을 갖도록 만듭니다.

X1에 대해 lb 및 ub를 수정하십시오. 0 <= x1 <= 1을 가져 와서 (예 : 0.01 <= x1 <= 0.99) 이제 LP를 해결하십시오. 원래 공식에서 바이너리 인 모든 변수에 대해 이렇게하십시오.

즉, 소수가되도록 UBIloNumVarArray파운드을하고 당신이 당신의 최적의 솔루션에 분수 값을 얻는 경우에, 당신은 당신이 바로 휴식을 수행 한 것을 알고있다.

0

아마 당신의 제약 계수 행렬 A (AX = b)는 단일 모달입니다.

0

이진 변수를 ILOFLOAT로 변환 할 필요가 없습니다. LPRelax처럼, 새로운 모델 인스턴스를 정의하고 다음과 같이 IloConversion 사용

IloModel LpRelax(env); 
LpRelax.add(model); 
LpRelax.add(IloConversion(env, vars, ILOFLOAT)); 

IloCplex cplex(env); 
cplex.extract(LpRelax); 
cplex.solve(); 

을 여전히 통합 솔루션을 얻을 경우 문제 는 통합 수 있습니다. 당신의 coefficinet은 통합 된 RHS와 함께 TOTALY UNIMODULARITY와 같은 특별한 속성을 가지고 있습니다.

희망 사항 :-).