Witam,
piszę algorytm Insa dla problemu szeregowania zadań w job shop'ie dla przykładów Tailarda. Zasadniczo napisałem cały kod, kompiluje się, jednak przy debuggowaniu gdb wyrzuca mi Segmentation Fault dla linii typu:
if(0 == this->FirstOnMachines[this->PSorted[i]->iMachineNum])
(Jeśli zamiast 0 stosuje NULL'a jest to samo).
http://wyslijto.pl/plik/eef8cjbcti <<-- tutaj kompletny kod programu wraz z jednym przykładem Tailarda.
Sprawdzałem działanie poszczególnych metod i błąd tyczy się tej części kodu:
int CInsa::CheckPosition(){
int iTemp = 0;
if(0 == this->pTemp->pk){
if(0 == this->pObjectToAdd->nt) iTemp = this->pTemp->Operation.q;
else iTemp = max(this->pObjectToAdd->Operation.q,this->pTemp->Operation.q);
if(0 != this->pObjectToAdd->pt) iTemp += this->pObjectToAdd->pt->Operation.r;
iTemp += this->pObjectToAdd->Operation.p;
}else{
if(0 == this->pObjectToAdd->nt) iTemp = this->pTemp->Operation.q;
else iTemp = max(this->pObjectToAdd->Operation.q,this->pTemp->Operation.q);
if(0 == this->pObjectToAdd->pt) iTemp += this->pTemp->pk->Operation.r;
else iTemp += max(this->pObjectToAdd->Operation.r,this->pTemp->pk->Operation.r);
iTemp += this->pObjectToAdd->Operation.p;
}
return iTemp;
}
void CInsa::AddOperation(){
if(0 == this->pPosition->pk){
this->pObjectToAdd->nk = pPosition;
this->pPosition->pk = pObjectToAdd;
}else{
if(0 == this->pPosition->nk){
this->pObjectToAdd->pk = this->pPosition;
this->pPosition->nk = this->pObjectToAdd;
}else{
this->pPosition->pk->nk = this->pObjectToAdd;
this->pObjectToAdd->pk = this->pPosition->pk;
this->pObjectToAdd->nk = this->pPosition;
this->pPosition->pk = this->pObjectToAdd;
}
}
}
void CInsa::InsaAlg(){
this->SortP();
int iTemp,iCmaxTmp;
STaskData* pLast;
for(int i=1;i<this->iSize;i++){
this->SetTopologicalQueue();
this->CalcR();
this->CalcQ();
iCmaxTmp = -1;
iTemp = 0;
this->pPosition = 0;
this->pObjectToAdd = 0;
this->pTemp = 0;
pLast = 0;
if(0 == this->FirstOnMachines[this->PSorted[i]->iMachineNum]){
this->FirstOnMachines[this->PSorted[i]->iMachineNum] = this->PSorted[i];
this->PSorted[i]->pk = 0;
this->PSorted[i]->nk = 0;
}else{
this->pTemp = this->FirstOnMachines[this->PSorted[i]->iMachineNum];
while(this->pTemp != 0){
iTemp = this->CheckPosition();
if((-1 == iCmaxTmp)||(iTemp < iCmaxTmp)){
iCmaxTmp = iTemp;
this->pPosition = this->pTemp;
}
if(0 == this->pTemp->nk) pLast = this->pTemp;
this->pTemp = this->pTemp->nk;
}
if(0 == this->PSorted[i]->pt) iTemp = pLast->Operation.r;
else iTemp = max(this->PSorted[i]->pt->Operation.r,pLast->Operation.r);
if(0 != this->PSorted[i]->nt) iTemp += this->PSorted[i]->nt->Operation.q;
iTemp += this->PSorted[i]->Operation.p;
if(iTemp < iCmaxTmp){
iCmaxTmp = iTemp;
this->pPosition = pLast;
}
this->AddOperation();
if(this->pPosition == FirstOnMachines[this->PSorted[i]->iMachineNum])
FirstOnMachines[this->PSorted[i]->iMachineNum] = this->PSorted[i];
}
}
this->CalcR();
this->iCmax = this->Data[1].Operation.r;
for(int i=2;i<this->iSize;i++) if(this->Data[i].Operation.r > this->iCmax) this->iCmax = this->Data[i].Operation.r;
pLast = 0;
}
Wdzięczny bym był za pomoc, najlepiej szybką bo do poniedziałku powinienem to oddać, a ja już 3 dzień siedzę kombinuję i nic:/
Pzdr.,
Kamil
</cpp></url>