2017-11-04 24 views
0

현재 Cplex 및 정수 변수가있는 minos를 사용하여 나를 위해 실행되는 AMPL 모델을 풀려고합니다.AMPL Cplex 오류 : QP Hessian이 양의 정의가 아닙니다.

대부분의 문제를 해결했습니다 (제 생각에는). http://lpsolve.sourceforge.net/5.5/ratio.htm에서 "비율 트릭"을 도왔습니다. 그러나 지금은 "QP 헤 시안은 반 정체성이 아닙니다." 내 제약 중 하나에서 오류가 발생했습니다.

내가 좀 오류가 무엇을 의미하는지 알고, 아직이 제한 조건에 대해 보여주는 이유는 확실하지 않다 :/

#S 
set SOURCE; 
#D 
set HALFPROD; 
#K 
set HALFPRODU; 
#P 
set PROD; 

param surmax {SOURCE} >= 0; 
param prodmin {PROD} >= 0; 
param prodprofit {PROD} >= 0; 
param convSDmax >= 0; 
param convDKmax >= 0; 
param convSD {SOURCE, HALFPROD} >= 0; 
param convDK {HALFPROD, HALFPRODU} >= 0; 
param convDP {HALFPROD, PROD} >= 0; 
param convKP {HALFPRODU, PROD} >= 0; 

var xs {SOURCE} >= 0, integer; 
var xu {HALFPROD} >= 0, integer; 
var xpd {PROD, HALFPROD} >= 0, integer; 
var xpk {PROD, HALFPRODU} >= 0, integer; 
var isKUsed binary; 

var quantityD {j in HALFPROD} = sum {i in SOURCE} convSD[i,j] * xs[i]; 
var costSur = sum {i in SOURCE} xs[i]*12; 

var quantityK {k in HALFPRODU} = (sum {j in HALFPROD} xu[j] * convDK[j,k]) * isKUsed; 
var costK = isKUsed * 13000; 

var quantityProdD {l in PROD} = sum {j in HALFPROD} xpd[l,j] * convDP[j,l]; 
var quantityProdK {l in PROD} = sum {k in HALFPRODU} xpk[l,k] * convKP[k,l]; 
var quantityProd {l in PROD} = quantityProdD[l] + quantityProdK[l]; 

var profitProd = sum {l in PROD} prodprofit[l] * quantityProd[l]; 
var balance = profitProd - costSur - costUwod; 

subject to OgrSurMax {i in SOURCE}: xs[i] <= surmax[i]; 
subject to OgrconvSDMax: (sum {i in SOURCE} xs[i]) <= convSDmax; 
subject to OgrconvDKMax: (sum {j in HALFPROD} xu[j]) <= convDKmax; 
subject to OgrProdMin {l in PROD}: quantityProd[l] >= prodmin[l]; 
subject to OgrHALFPRODXPD {j in HALFPROD}: (sum {l in PROD} xpd[l,j]) + xu[j] - quantityD[j] <= 0; 
#------------------TRAITOR! 
subject to OgrHALFPRODXPK {k in HALFPRODU}: (sum {l in PROD} xpk[l,k]) - quantityK[k] <= 0; 
#-------------------------- 

maximize balanceMax: balance; 

이 내 모델입니다.

는 "전환"는 변환을 위해 약자

  • S-> D와 D- K는 비율은> "? 내가 S 변환에서 얼마나 많은 D의"
  • D-> P와 K-> P는 D 또는 K는 P로 변환 할 수 있는지 여부를 말한다 이진 행렬이다
이 모델

홈페이지 배우 XPD 및 xpk - 그들은에서 aquired 얼마나 많은 PROD라고 HALFPROD 또는 HALFPRODU를 전환합니다. 다중 변환 때문에 나는 D의 양을 추적해야합니다 - D -> K와 D -> P에 사용 된 D의 수는 S -> D에서 D보다 작거나 같아야합니다. 이것은 작동하지만 어떤 이유로 (더 쉬운) 제약 조건이 작동하지 않습니다 :/

문제점이나 해결 방법에 대한 단서가 있습니까?


UPDATE : 나는 그것을 선형화하기 위해 노력했습니다 어윈 Kalvelagens의 답변에 따라

. bigM 메서드와는 별도로 선형화하는 간단한 방법을 찾을 수 없습니다.

param quantityKMAX = 490860; 
var quantityK {k in HALFPRODU} >= 0; 
s.t. ogrK1 {k in HALFPRODU}: quantityK[k] <= quantityKMAX * isKUsed; 
s.t. ogrK2 {k in HALFPRODU}: quantityK[k] <= (sum {j in HALFPROD} xu[j] * convDK[j,k]); 
s.t. ogrK3 {k in HALFPRODU}: quantityK[k] <= (sum {j in HALFPROD} xu[j] * convDK[j,k]) - quantityKMAX * (1 - isKUsed); 

quantityKMAX이 ("가장주는"K에 D의 최대 가능 수를 변환 할 때) 전환에서 얻은 최대 수량이지만, 실제로했습니다 : 나는이 내 quantityD 부분을 변경했습니다 임의로 큰 숫자로 시도했습니다. 즉, 수량 K의 가능한 값보다 커졌습니다.

작동!

답변

1

Cplex는 특정 클래스의 2 차 제약 조건 만 처리 할 수 ​​있습니다 (일반적으로 - 예외가 있지만 볼록하게 유지해야 함). 변수 quantityK의 정의에서 Cplex가 처리 할 수없는 2 차 표현식을 소개합니다.

한 가지 간단한 접근법은 문제를 두 번 해결하는 것입니다. 한번은 isKUsed=0으로, 한 번은 isKUsed=1으로 두 번 해결하십시오. 그런 다음 최상의 솔루션을 선택하십시오.

그렇지 않으면 사물을 선형화 할 수 있습니다. 이항 변수에 연속 (또는 정수) 음이 아닌 변수를 곱하면 매우 선형화하기가 어렵지 않습니다.

+0

고마워요! 내 질문이 임무처럼 보이는 것은 비밀이 아닙니다. 그것은 하나입니다. 나는 당신의 대답이 최고의 스택 오버 플로우 대답이라고 희망해야한다. 문제를 두 번 해결하는 것은 쉽습니다. 그러나 나는 그것을 선형화해야합니다.Imma 시도 & 결과와 함께 당신에게 돌아갈;) – MKK