35 #define BESTFOUNDSOFAR 2
36 #define NumDirection 10
59 (
unsigned C_INT32) 600);
93 const double **
Minimum = mOptProblem->getParameterMin().array();
94 const double **
Maximum = mOptProblem->getParameterMax().array();
108 Parameter[dd] = mParameters->
array();
112 double current_best_value, la;
113 int i, j, last_update, u10, u30, u50;
143 linear =
FALSE; la = 1.0;
145 if ((*Maximum[j] <= 0.0) || (*Minimum[j] < 0.0)) linear =
TRUE;
148 la = log10(*Maximum[j]) - log10(
std::min(*Minimum[j], std::numeric_limits< C_FLOAT64 >::epsilon()));
150 if (la < 1.8) linear =
TRUE;
161 individual[i][j] = (*Maximum[j] - *Minimum[j]) * 0.5 + *Minimum[j];
188 std::ofstream finalout(
"debugopt.dat");
192 std::cout <<
"debugopt.dat cannot be opened!" << std::endl;
196 finalout <<
"----------------------------- the best result at each generation---------------------" << std::endl;
197 finalout <<
"Generation\t" <<
"Best candidate value for object function\t" <<
"Display " <<
NumParameter <<
" parameters" << std::endl;
198 finalout << std::endl;
201 srand(time(NULL)); rand();
209 std::cout << std::endl;
210 std::cout <<
"GA is processing at generation " << i << std::endl;
229 if (floor(10*rand() / RAND_MAX) > 5)
313 if (mut <= *Minimum[j]) mut = *Minimum[j] + std::numeric_limits< C_FLOAT64 >::epsilon();
316 if (mut < *Minimum[j]) mut = *Minimum[j];
319 if (mut >= *Maximum[j]) mut = *Maximum[j] - std::numeric_limits< C_FLOAT64 >::epsilon();
322 if (mut > *Maximum[j]) mut = *Maximum[j];
342 if ((i % 2) == 0)
select(2);
350 if ((i >= 1) && (i % 1000 == 0))
352 for (
int optKK = 0; optKK < 6; optKK++)
373 if ((u50 == 0) && (i - last_update > 50))
383 linear =
FALSE; la = 1.0;
385 if ((*Maximum[jj] <= 0.0) || (*Minimum[jj] < 0.0)) linear =
TRUE;
388 la = log10(*Maximum[jj]) - log10(
std::min(*Minimum[jj], std::numeric_limits< C_FLOAT64 >::epsilon()));
390 if (la < 1.8) linear =
TRUE;
401 individual[mm][jj] = (*Maximum[jj] - *Minimum[jj]) * 0.5 + *Minimum[jj];
420 u50 = 50; u30 = 30; u10 = 10;
425 if ((u30 == 0) && (i - last_update > 30))
428 for (
int mm = (
int)floor(PopulationSize * 0.7); mm <
PopulationSize; mm++)
435 linear =
FALSE; la = 1.0;
437 if ((*Maximum[jj] <= 0.0) || (*Minimum[jj] < 0.0)) linear =
TRUE;
440 la = log10(*Maximum[jj]) - log10(
std::min(*Minimum[jj], std::numeric_limits< C_FLOAT64 >::epsilon()));
442 if (la < 1.8) linear =
TRUE;
453 individual[mm][jj] = (*Maximum[jj] - *Minimum[jj]) * 0.5 + *Minimum[jj];
477 if ((u10 == 0) && (i - last_update > 10))
480 for (
int mm = (
int) floor(PopulationSize * 0.9); mm <
PopulationSize; mm++)
487 linear =
FALSE; la = 1.0;
489 if ((*Maximum[jj] <= 0.0) || (*Minimum[jj] < 0.0)) linear =
TRUE;
492 la = log10(*Maximum[jj]) - log10(
std::min(*Minimum[jj], std::numeric_limits< C_FLOAT64 >::epsilon()));
494 if (la < 1.8) linear =
TRUE;
505 individual[mm][jj] = (*Maximum[jj] - *Minimum[jj]) * 0.5 + *Minimum[jj];
540 mOptProblem->getSolutionVariables() = Parameter;
548 std::cout << std::endl;
549 std::cout <<
"GA has successfully done!" << std::endl;
640 int pp1, pp2, tmp, l;
674 CrossPoint[i] = 1 + CrossPoint[i - 1] + (l == 0 ? 0 : (int)fabs(floor(l * rand() / RAND_MAX)));
687 if (i == 0) s = 0;
else s =
CrossPoint[i - 1];
690 for (j = s; j < e; j++)
703 int i, parent1, parent2;
720 int i, j, TournamentSize, RandomRival;
721 int RandomIndividual;
724 switch (SelectionStrategy)
740 TournamentSize = PopulationSize / 5;
743 if (TournamentSize < 1) TournamentSize = 1;
750 for (j = 0; j < TournamentSize; j++)
753 RandomRival = (int)fabs(floor((PopulationSize * 2 - 1) * rand() / RAND_MAX));
785 RandomIndividual = (int)fabs(floor((PopulationSize * 2 - 1) * rand() / RAND_MAX));
815 std::ofstream finalout(
"debugopt.dat", std::ios::app);
819 std::cout <<
"debugopt.dat cannot be opened!" << std::endl;
830 finalout << std::endl;
831 finalout << std::endl;
841 C_INT32 NumSignificantPoint, NumTempChange, NumIteration = 1000;
846 double candFuncValue;
849 double thisFuncValue;
857 double TempDecreaseRate = 0.85;
858 double BoltzmannConstant = 1.0;
860 double InitialTemp = 1.0;
863 double ConvgCriterion = 0.01;
864 double ChangeValue, EnergyDifference;
878 const double **
Minimum = mOptProblem->getParameterMin().array();
879 const double **
Maximum = mOptProblem->getParameterMax().array();
891 NumSignificantPoint = 0;
924 candparameter[kk] = thisparameter[kk] = newparameter[kk] = SAParameter[kk];
927 double FitnessValue = mOptProblem->calculate();
928 thisFuncValue = candFuncValue = FitnessValue;
931 for (
int mm = 0; mm <
BESTFOUNDSOFAR; mm++) fk[mm] = thisFuncValue;
936 NumStepAccep[jj] = 0;
937 step[jj] = fabs(candparameter[jj]);
945 for (
int ff = 0; ff < NumIteration; ff++)
947 std::cout <<
"New individual begins ......" << index << std::endl;
948 std::cout <<
"New iteration begins ......" << std::endl;
949 std::cout <<
"Current Temperature: " << t << std::endl;
950 std::cout <<
"Number of Temperature Change: " << NumTempChange << std::endl;
957 ChangeValue = tan(2 *
PI * pRandSA->
getRandomCC()) * (t / pow(pow(2, 2.0) + t * t, (NumParameter + 1) / 2.0));
958 newparameter[hh] = thisparameter[hh] + step[hh] * ChangeValue;
960 if (newparameter[hh] < *Minimum[hh]) newparameter[hh] = *Minimum[hh] + pRandSA->
getRandomCC() * (*Maximum[hh] - *Minimum[hh]);
962 if (newparameter[hh] > *Maximum[hh]) newparameter[hh] = *Minimum[hh] + pRandSA->
getRandomCC() * (*Maximum[hh] - *Minimum[hh]);
970 double FitnessValue = mOptProblem->calculate();
971 newFuncValue = FitnessValue;
974 EnergyDifference = newFuncValue - thisFuncValue;
977 if (newFuncValue <= thisFuncValue)
984 thisFuncValue = newFuncValue;
986 NumSignificantPoint++;
989 if (thisFuncValue < candFuncValue)
992 individual[index][aa] = SAParameter[aa] = candparameter[aa] = thisparameter[aa];
996 if (!mOptProblem->checkFunctionalConstraints())
1016 double Probability = exp(-(newFuncValue - thisFuncValue) / (BoltzmannConstant * t));
1026 thisFuncValue = newFuncValue;
1027 NumSignificantPoint++;
1037 double StepAdjustment = (double) NumStepAccep[nn] / (
double)
NumDirection;
1039 if (StepAdjustment > 0.6) step[nn] *= 1 + 5 * (StepAdjustment - 0.6);
1041 if (StepAdjustment < 0.4) step[nn] /= 1 + 5 * (0.4 - StepAdjustment);
1043 NumStepAccep[nn] = 0;
1048 t *= TempDecreaseRate;
1052 if (NumTempChange == 1) ready =
FALSE;
1059 if (fabs(fk[ii] - thisFuncValue) > ConvgCriterion)
1067 for (
int aa = 0; aa < BESTFOUNDSOFAR - 1; aa++)
1068 fk[aa] = fk[aa + 1];
1070 fk[BESTFOUNDSOFAR - 1] = thisFuncValue;
1075 if (fabs(thisFuncValue - candFuncValue) > ConvgCriterion)ready =
FALSE;
1080 NumSignificantPoint++;
1083 thisparameter[kk] = candparameter[kk];
1085 thisFuncValue = candFuncValue;
virtual void exchange(int o, int d)
virtual void select(int method)
qreal linear(qreal a, qreal b, qreal t)
virtual void swap(int o, int d)
virtual int fittest(void)
virtual ~COptMethodHGASA()
virtual void replicate(void)
double Get_BestFoundSoFar_candidate()
static CRandom * createGenerator(CRandom::Type type=CRandom::mt19937, unsigned C_INT32 seed=0)
virtual C_FLOAT64 getRandomCC()
const Value & getValue() const
virtual void copy(int o, int d)
bool addParameter(const CCopasiParameter ¶meter)
virtual void crossover(int p1, int p2, int c1, int c2)
virtual void TrackDataFile(int i)