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