10

정수 프로그래밍 문제를 해결하려고합니다.정수 선형 프로그램 문제 해결 : 해결할 수있는 인스턴스가 실행 불가능하다고 주장하는 이유는 무엇입니까?

Int32 a = 0, b = 0; 
a = a*-6 + b + 0x74FA - valA; 
b = b/3 + a + 0x81BE - valA; 
a = a*-6 + b + 0x74FA - valA; 
b = b/3 + a + 0x81BE - valA; 
// a == -86561, b == -32299 

나는이 정수로 구현 : 나는 A와 B의 최종 값을 주어, 모두 사용 SCIP 예를 들어 LPSolve

을 시도했습니다, 나는 다음과 같은 C# 코드에 발라 대한 해결하려는 LP 형식 프로그램합니다 (절단 분할 몇 합병증 발생)

The model is INFEASIBLE 
01,235,164 : 다음

min: ; 
+valA >= 0; 
+valA < 92; 
remAA_sign >= 0; 
remAA_sign <= 1; 
remAA <= 2; 
remAA >= -2; 
remAA +2 remAA_sign >= 0; 
remAA +2 remAA_sign <= 2; 
remAA +4294967296 remAA_range >= -2147483648; 
remAA +4294967296 remAA_range <= 2147483647; 
remAA +4294967296 remAA_range +2147483648 remAA_sign >= 0; 
remAA +4294967296 remAA_range +2147483648 remAA_sign <= 2147483648; 
-1 remAA +4294967296 remAA_range +3 remAA_mul3 = 0; 
remAB_sign >= 0; 
remAB_sign <= 1; 
remAB <= 2; 
remAB >= -2; 
remAB +2 remAB_sign >= 0; 
remAB +2 remAB_sign <= 2; 
remAB +4294967296 remAB_range >= -2147483648; 
remAB +4294967296 remAB_range <= 2147483647; 
remAB +4294967296 remAB_range +2147483648 remAB_sign >= 0; 
remAB +4294967296 remAB_range +2147483648 remAB_sign <= 2147483648; 
+1431655765 remAA +1 offA -2 valA +1 offB -1 remAB +4294967296 remAB_range +3 remAB_mul3 = 0; 
a = -86561; 
b = -32299; 
offA = 29946; 
offB = 33214; 
-4 offA +3 valA +1431655765 remAA +1 offB +4294967296 Fa - a = 0; 
+477218588 remAA -1431655769 offA -1431655764 valA -1431655763 offB +1431655765 remAB +4294967296 Fb - b = 0; 
int valA; 
int remAA; 
int remAA_range; 
int remAA_sign; 
int remAA_mul3; 
int remAB; 
int remAB_range; 
int remAB_sign; 
int remAB_mul3; 
int Fa; 
int Fb; 
int offA; 
int offB; 
int a; 
int b; 

하고 그것을 해결하려고

그러나 실제로 가능한 변수 할당을 알고 있기 때문에 실현 가능한 솔루션이 있다는 것을 알고 있습니다. 해결책을 찾을 수 다음과 같은 조건을 원인 추가 :

a = -86561; 
b = -32299; 
offA = 29946; 
offB = 33214; 
valA = 3; 
remAA = 0; 
remAA_range = 0; 
remAA_sign = 0; 
remAA_mul3 = 0; 
remAB = 1; 
remAB_range = 0; 
remAB_sign = 0; 
remAB_mul3 = -21051; 
Fa = 0; 
Fb = 21054; 

두 개의 서로 다른 해법이 가능한 문제가 불가능하다 주장했다. 내가 쓴 조건을 위반하고 있습니까? 무슨 일이야? 실제로 문제를 해결하는 해결사가 있습니까?

+0

모델을 빌드하고 .lp 파일을 내 보낸 다음 CPLEX를 통해 실행합니다. 그것은 좋은 갈등 (infeasibility) 정보가 있습니다. 내 이메일 주소는 gmail.com에있는 내 사용자 이름입니다. 나는 당신이 Pastebin 또는 비슷한 것에 붙여 놓을 수 있다고 생각합니다. – raoulcousins

+0

@raoul 내가 scip에 사용했던 lp-cplex 파일을 이메일로 보냈습니다. –

+0

CPLEX로 해결 했으므로 실현 가능했습니다. 최적해는 목적 함수 값이 0입니다. 이것은 조건 완화가 (카파)가 3.4 인 기본 매트릭스를 갖는 LP 완화와 동일합니다. 여분의 제약으로, 목적 함수는 동일했다. 조건 수는 4.6입니다.CPLEX이이 특정 문제에 대해 SCIP와 다른 후드에서 무엇을하는지 확신 할 수 없습니다. neos-server.org로 모델을 풀고 CPLEX를 사용할 수 있습니까? – raoulcousins

답변

14

MIP 해석기는 부동 소수점 데이터와 함께 작동합니다. 데이터의 크기가 큰 편차가있는 것과 같은 문제의 경우 반올림 오류가 발생합니다. 모든 LP 솔버는 문제를 증폭시킬 수있는이 데이터에 대한 연산을 수행해야합니다. 문제와 같은 경우에는 문제가 실행 불가능할 때 실행 불가능하다고 결론을 내릴 수 있습니다. 변수를 고치면 솔버는 더 적은 수의 부동 소수점 연산을 수행합니다.

Gurobi 또는 cplex와 같은 상용 솔버는 일반적으로 당신처럼 수치 적으로 어려운 데이터로 작업하는 것이 좋습니다. Gurobi는 고정밀 부동 소수점 숫자로 작동하는 QuadPrecision 매개 변수를 가지고 있습니다. 대부분의 해석기는 수치 적으로 어려운 데이터로 해석기를 더 잘 작동하게하는 매개 변수를 가지고 있습니다. 예를 들어, LPSolve는 정수로 간주하는 것을 완화시키는 파라미터 epsint을 가지고 있습니다. 매개 변수의 기본값은 10e-7이므로 0.9999999는 정수로 간주되지만 0.9999998은 그렇지 않습니다. 이 값을 더 크게 만들 수는 있지만 용인 할 수없는 결과가 발생할 위험이 있습니다.

leaky abstrction이 발생했습니다. 문제는 기술적으로 Mixed-Integer Programming의 범위에 있지만 MIP 해석기는이를 해결하도록 설계되지 않았습니다. 혼합 정수 프로그래밍은 NP 하드 문제입니다. 모든 입력에 대해 빠르고 안정적으로 작동하는 솔버를 갖는 것은 불가능합니다. MIP 솔버는 포트폴리오 최적화, 공급망 계획 및 네트워크 흐름과 같은 다양한 영역에서 발생하는 문제에 대해 잘 처리하려고 노력합니다. 이들은 암호 문제를 해결하도록 설계되지 않았습니다.

0

SCIP 3.1.0과 특히 확장 된 정밀 산술 기능을 살펴볼 수도 있습니다. GMP를 사용하면 LP 솔루션을 매우 정확하게 계산할 수 있습니다.