int Solver::calculatePenalty(Solution &newPosition, int pBestTmp) { int penaltyValue = 0; // Penalty function if constraint is violated for (int i = 0; i < currentProblem->m; ++i) { // Check constraint i int dist = checkConstraint(newPosition, i); if (dist) { // Constraint violated // Get total of all weights (TW) int diff = std::min(currentProblem->capacity.at(i), abs(getTotalOfAllWeights(i) - currentProblem->capacity.at(i))); // Penalty function int penalty = (int) (pBestTmp * (((double) dist) / (double) diff)); // Sum up with penalty function penaltyValue += penalty; } } return penaltyValue; }
C_FLOAT64 CFitItem::getConstraintViolation() const { switch (checkConstraint()) { case - 1: return *mpLowerBound - mLocalValue; break; case 1: return mLocalValue - *mpUpperBound; break; } return 0.0; }