void TabuSearchClass::getNeighbour(int *p, int *q) { int n = 0; double ran2 = 0.0; double ran1 = 0.0; copyGene(p, q); for (int i = 0; i < G.Nnum; i++) { if (p[i] == 1) { n++; } } if (n >= G.Cnum) { do { ran1 = (rand() % n) / (double) n * n; } while (p[(int) ran1] != 1); q[(int) ran1] = 0; } else { ran2 = (rand() % Conlength) / (double) Conlength * Conlength; if (p[(int) ran2] == 0) q[(int) ran2] = 1; else q[(int) ran2] = 0; } }
void TabuSearchClass::BeginSolve() { int n; bestTabuSearchValue = 0; number4Gene = 0; initGene(); copyGene(initNode, bestNode); curtEvaluationValue = Evaluat(initNode); bestEvauValue = curtEvaluationValue; bestNodeNumber = G.chosNum; while (number4Gene < MAX_GENERATION) { n = 0; while (n < neighbourNum) { getNeighbour(initNode, tempNode); tempEvaluationValue = Evaluat(tempNode); if (isTabuTable(tempNode) != 0) { if (tempEvaluationValue < bestEvauValue) { copyGene(tempNode, currenttNode); curtEvaluationValue = tempEvaluationValue; } n++; } else if (isTabuTable(tempNode) == 0) { if (G.Nnum < 500) { if (n == 0) { if (tempEvaluationValue <= (int) curtEvaluationValue * 1.0005) { copyGene(tempNode, currenttNode); curtEvaluationValue = tempEvaluationValue; n++; } continue; } } if (tempEvaluationValue < curtEvaluationValue) { copyGene(tempNode, currenttNode); curtEvaluationValue = tempEvaluationValue; } n++; } } if (curtEvaluationValue < bestEvauValue) { bestTabuSearchValue = number4Gene; copyGene(currenttNode, bestNode); bestEvauValue = curtEvaluationValue; bestNodeNumber = G.chosNum; } if ((int) clock() / (CLOCKS_PER_SEC /*/ 1000*/) >= 87) break; number4Gene++; copyGene(currenttNode, initNode); TabuTableFlush(currenttNode); } }
void mkTabFile(char *db, struct genePred *genes, FILE *tabFh) /* create a tab file to load, optionally adding binning or stripping extended * fields if not requested */ { struct genePred *gene; for (gene = genes; gene != NULL; gene = gene->next) copyGene(db, gene, tabFh); if (gInvalidCnt > 0) { if (gSkipInvalid) fprintf(stderr, "Warning: skipping %d invalid genePreds\n", gInvalidCnt); else errAbort("Error: %d invalid genePreds, database unchanged", gInvalidCnt); } }