137 unsigned int maxIter,
139 unsigned int nSwarms,
141 unsigned int nParticles,
165 int verbose=0;
if(status!=NULL) {verbose=status->
verbose; fp=status->
fp;}
167 fprintf(fp,
"\n%s(NLOPT, %d, status)\n", __func__, doLocal);
180 if(verbose>0) {fprintf(stderr,
"Error: too low limit for function calls.\n"); fflush(stderr);}
188 if(verbose>1 && fixedParNr>0) fprintf(fp,
"fixedParNr := %d\n", fixedParNr);
189 unsigned int fittedParNr=nlo->
totalNr-fixedParNr;
190 if(verbose>2) fprintf(fp,
"fittedParNr := %d\n", fittedParNr);
197 for(
unsigned int i=0; i<nlo->
totalNr; i++) {
199 if(!(nlo->
xtol[i]>0.0)) {
200 if(verbose>0) {fprintf(stderr,
"Error: invalid xtol[].\n"); fflush(stderr);}
208 if(verbose>2) fprintf(fp,
"\nInitializing MPSO\n");
210 if(maxIter<10) maxIter=1000;
211 if(nSwarms<2) nSwarms=2+fittedParNr;
212 if(nParticles<5) nParticles=5+2*fittedParNr;
213 if(!(wInertia>0.0)) wInertia=0.333;
214 if(!(wParticle>0.0)) wParticle=1.00;
215 if(!(wSwarm>0.0)) wSwarm=1.60;
216 if(!isfinite(wGlobal)) wGlobal=0.40;
217 if(!isfinite(pDeath) || pDeath>=0.1)
218 pDeath=0.005;
else if(pDeath<0.0) pDeath=0.0;
219 if(!isfinite(pImmigration) || pImmigration>=0.1)
220 pImmigration=0.025;
else if(pImmigration<0.0) pImmigration=0.0;
229 unsigned int pFrustration=10;
230 unsigned int nFrustration=15;
233 fprintf(fp,
"maxIter := %u\n", maxIter);
234 fprintf(fp,
"maxFunCalls := %u\n", nlo->
maxFunCalls);
235 fprintf(fp,
"nSwarms := %u\n", nSwarms);
236 fprintf(fp,
"nParticles := %u\n", nParticles);
237 fprintf(fp,
"dim := %u\n", dim);
238 fprintf(fp,
"wInertia := %g\n", wInertia);
239 fprintf(fp,
"wParticle := %g\n", wParticle);
240 fprintf(fp,
"swarm/social (wSwarm) := %g\n", wSwarm);
241 fprintf(fp,
"multi-swarm/global (wGlobal) := %g\n", wGlobal);
242 fprintf(fp,
"probability of death := %g\n", pDeath);
243 fprintf(fp,
"probability of immigration := %g\n", pImmigration);
244 fprintf(fp,
"pFrustration := %u\n", pFrustration);
245 fprintf(fp,
"nFrustration := %u\n", nFrustration);
250 MPSO_MULTISWARM multi;
251 multi.dim=dim; multi.sn=nSwarms; multi.pn=nParticles;
252 multi.bestPosition=calloc(dim,
sizeof(
double));
253 multi.swarm=calloc(nSwarms,
sizeof(MPSO_SWARM));
254 for(
unsigned int si=0; si<nSwarms; si++) {
255 multi.swarm[si].particle=calloc(nParticles,
sizeof(MPSO_PARTICLE));
256 multi.swarm[si].bestPosition=calloc(dim,
sizeof(
double));
257 for(
unsigned int pi=0; pi<nParticles; pi++) {
258 multi.swarm[si].particle[pi].position=calloc(dim,
sizeof(
double));
259 multi.swarm[si].particle[pi].velocity=calloc(dim,
sizeof(
double));
260 multi.swarm[si].particle[pi].bestPosition=calloc(dim,
sizeof(
double));
269 int initGuessAvailable=1;
270 double initGuessCost=nan(
"");
271 for(
unsigned int i=0; i<dim; i++) {
272 if(isnan(nlo->
xfull[i])) {initGuessAvailable=0;
break;}
273 if(nlo->
xfull[i]<nlo->
xlower[i]) {initGuessAvailable=0;
break;}
274 if(nlo->
xfull[i]>nlo->
xupper[i]) {initGuessAvailable=0;
break;}
276 if(initGuessAvailable) {
278 if(!isfinite(initGuessCost)) initGuessAvailable=0;
280 fprintf(fp,
"valid initial guess with cost=%g\n", initGuessCost); fflush(fp);
288 multi.bestCost=nan(
"");
289 for(
unsigned int si=0; si<nSwarms; si++) {
290 for(
unsigned int pi=0; pi<nParticles; pi++) {
293 for(
unsigned int i=0; i<dim; i++)
294 multi.swarm[si].particle[pi].velocity[i]-=multi.swarm[si].particle[pi].position[i];
295 multi.swarm[si].particle[pi].cost=
296 (*nlo->
_fun)(dim, multi.swarm[si].particle[pi].position, nlo->
fundata);
299 multi.swarm[si].particle[pi].bestCost=multi.swarm[si].particle[pi].cost;
300 doubleCopy(multi.swarm[si].particle[pi].bestPosition,
301 multi.swarm[si].particle[pi].position, dim);
302 multi.swarm[si].particle[pi].since=0;
305 if(si==0 && initGuessAvailable) {
306 multi.swarm[si].bestCost=initGuessCost;
309 multi.swarm[si].bestCost=multi.swarm[si].particle[pi].cost;
310 doubleCopy(multi.swarm[si].bestPosition, multi.swarm[si].particle[pi].position, dim);
313 if(!isfinite(multi.swarm[si].bestCost) ||
314 multi.swarm[si].bestCost>multi.swarm[si].particle[pi].cost)
316 multi.swarm[si].bestCost=multi.swarm[si].particle[pi].cost;
317 doubleCopy(multi.swarm[si].bestPosition, multi.swarm[si].particle[pi].position, dim);
323 multi.bestCost=multi.swarm[si].bestCost;
324 doubleCopy(multi.bestPosition, multi.swarm[si].bestPosition, dim);
326 if(!isfinite(multi.bestCost) || multi.bestCost>multi.swarm[si].bestCost) {
327 multi.bestCost=multi.swarm[si].bestCost;
328 doubleCopy(multi.bestPosition, multi.swarm[si].bestPosition, dim);
331 multi.swarm[si].since=0;
337 if(initGuessAvailable)
339 for(; si<nSwarms; si++)
343 for(
unsigned int i=0; i<dim; i++) sd[i]=0.13*(nlo->
xupper[i]-nlo->
xlower[i]);
344 for(
unsigned int si=0; si<nSwarms; si++) {
345 for(
unsigned int pi=1; pi<nParticles; pi++) {
347 multi.swarm[si].particle[0].position, sd, nlo->
xlower, nlo->
xupper, dim,
352 for(
unsigned int i=0; i<dim; i++) sd[i]=0.23*(nlo->
xupper[i]-nlo->
xlower[i]);
353 double mvel[dim];
for(
unsigned int i=0; i<dim; i++) mvel[i]=0.0;
354 for(
unsigned int si=0; si<nSwarms; si++) {
355 for(
unsigned int pi=0; pi<nParticles; pi++) {
357 mvel, sd, NULL, NULL, dim, &multi.mt);
361 multi.bestCost=nan(
"");
362 for(
unsigned int si=0; si<nSwarms; si++) {
363 multi.swarm[si].bestCost=nan(
"");
364 for(
unsigned int pi=0; pi<nParticles; pi++) {
365 multi.swarm[si].particle[pi].cost=
366 (*nlo->
_fun)(dim, multi.swarm[si].particle[pi].position, nlo->
fundata);
369 multi.swarm[si].particle[pi].bestCost=multi.swarm[si].particle[pi].cost;
370 doubleCopy(multi.swarm[si].particle[pi].bestPosition,
371 multi.swarm[si].particle[pi].position, dim);
372 multi.swarm[si].particle[pi].since=0;
374 if(!isfinite(multi.swarm[si].bestCost) ||
375 multi.swarm[si].bestCost>multi.swarm[si].particle[pi].cost)
377 multi.swarm[si].bestCost=multi.swarm[si].particle[pi].cost;
379 multi.swarm[si].particle[pi].position, dim);
383 if(!isfinite(multi.bestCost) || multi.bestCost>multi.swarm[si].bestCost) {
384 multi.bestCost=multi.swarm[si].bestCost;
385 doubleCopy(multi.bestPosition, multi.swarm[si].bestPosition, dim);
387 multi.swarm[si].since=0;
394 double lastBestPosition[dim];
395 unsigned int movementCounter=0;
396 unsigned int convergenceCounter=0;
398 unsigned int stopCostLimit=20, stopCost=0;
399 double lastBestCost=multi.bestCost;
401 unsigned int iterNr=0;
402 while(iterNr<maxIter && nlo->funCalls<nlo->maxFunCalls) {
405 fprintf(fp,
"-----------------------------\nloop %d\n", iterNr);
406 fprintf(fp,
"bestCost=%g since %u iterations\n", multi.bestCost, multi.since);
407 if(verbose>5) fprintf(fp,
"function_calls_so_far=%d\n", nlo->
funCalls);
414 unsigned int swarmsConcentrated=0;
415 for(
unsigned int si=0; si<nSwarms; si++) {
416 double psd[dim], vmean[dim], vsd[dim];
420 fprintf(fp,
"swarm %d bestCost=%g since %u\n", 1+si,
421 multi.swarm[si].bestCost, multi.swarm[si].since);
423 fprintf(fp,
" bestPosition: %g", multi.swarm[si].bestPosition[0]);
424 for(
unsigned int i=1; i<dim; i++) fprintf(fp,
", %g", multi.swarm[si].bestPosition[i]);
427 if(verbose>9 || iterNr==1) {
428 for(
unsigned int i=0; i<dim; i++)
429 fprintf(fp,
" parameter %d: meanPosition %g +- %g\n", 1+i, pmean[i], psd[i]);
430 for(
unsigned int i=0; i<dim; i++)
431 fprintf(fp,
" parameter %d: meanAbsVelocity %g +- %g\n", 1+i, vmean[i], vsd[i]);
438 for(i=0; i<dim; i++) {
439 if(fabs(pmean[i] - multi.swarm[si].bestPosition[i]) > 0.01*nlo->
xtol[i])
break;
440 if(psd[i]>0.02*nlo->
xtol[i])
break;
443 if(verbose>5) fprintf(fp,
" swarm %d particles inside tolerance.\n", 1+si);
444 swarmsConcentrated++;
447 if(swarmsConcentrated==nSwarms) {
448 if(verbose>2) fprintf(fp,
" all swarm particles shrunk inside swarm tolerance.\n");
455 unsigned int swarmsConcentrated=0;
457 for(
unsigned int si=0; si<nSwarms; si++) {
458 multi.swarm[si].since++;
461 double pmean[dim], psd[dim], vmean[dim], vsd[dim];
465 fprintf(fp,
"swarm %d bestCost=%g since %u\n", 1+si,
466 multi.swarm[si].bestCost, multi.swarm[si].since);
468 fprintf(fp,
" bestPosition: %g", multi.swarm[si].bestPosition[0]);
469 for(
unsigned int i=1; i<dim; i++) fprintf(fp,
", %g", multi.swarm[si].bestPosition[i]);
472 if(verbose>7 || iterNr==1) {
473 for(
unsigned int i=0; i<dim; i++)
474 fprintf(fp,
" parameter %d: meanPosition %g +- %g\n", 1+i, pmean[i], psd[i]);
475 for(
unsigned int i=0; i<dim; i++)
476 fprintf(fp,
" parameter %d: meanAbsVelocity %g +- %g\n", 1+i, vmean[i], vsd[i]);
484 for(i=0; i<dim; i++) {
485 if(fabs(pmean[i] - multi.swarm[si].bestPosition[i]) > 0.01*nlo->
xtol[i])
break;
486 if(psd[i]>0.02*nlo->
xtol[i])
break;
489 if(verbose>5) fprintf(fp,
" swarm %d particles inside tolerance.\n", 1+si);
490 swarmsConcentrated++;
497 int swarmFrustrated=0;
498 if(multi.swarm[si].since>=nFrustration) {
499 swarmFrustrated=1; multi.swarm[si].since=0;
500 if(verbose>5) {fprintf(fp,
"swarm is frustrated\n"); fflush(fp);}
504 if(doLocal && !swarmFrustrated && (iterNr%10)==0) {
505 if(verbose>5) {fprintf(fp,
"local optimization:\n"); fflush(fp);}
509 for(
unsigned int i=0; i<dim; i++) {
511 if(psd[i]>nlo->
xtol[i]) {nlo->
xdelta[i]=psd[i];
continue;}
515 fprintf(fp,
"initial guesses and deltas, with cost %g:\n", multi.swarm[si].bestCost);
516 for(
unsigned int i=0; i<dim; i++) fprintf(fp,
"\t%e\t%e\n", nlo->
xfull[i], nlo->
xdelta[i]);
521 if(cost<multi.swarm[si].bestCost) {
522 multi.swarm[si].bestCost=cost;
524 multi.swarm[si].since=0;
526 fprintf(fp,
"results: %e", multi.swarm[si].bestPosition[0]);
527 for(
unsigned int i=1; i<dim; i++) fprintf(fp,
", %e", multi.swarm[si].bestPosition[i]);
528 fprintf(fp,
", with cost: %g\n", cost); fflush(fp);
531 if(verbose>10) fprintf(fp,
"local optimization did not provide lower cost (%e)\n", cost);
534 if(verbose>10) fprintf(fp,
"local optimization failed.\n");
539 for(
unsigned int pi=0; pi<nParticles; pi++) {
542 fprintf(fp,
" particle %d bestCost=%g since %u\n", 1+pi,
543 multi.swarm[si].particle[pi].bestCost, multi.swarm[si].particle[pi].since);
551 || isnan(multi.swarm[si].particle[pi].cost))
553 killed=1; multi.swarm[si].particle[pi].since=0;
555 if(verbose>12) {fprintf(fp,
"death of particle %u\n", 1+pi); fflush(fp);}
559 for(
unsigned int i=0; i<dim; i++)
560 multi.swarm[si].particle[pi].velocity[i]-=multi.swarm[si].particle[pi].position[i];
562 multi.swarm[si].particle[pi].cost=
563 (*nlo->
_fun)(dim, multi.swarm[si].particle[pi].position, nlo->
fundata);
566 if(multi.swarm[si].particle[pi].bestCost>multi.swarm[si].particle[pi].cost) {
567 if(verbose>10) printf(
"Miracle: resurrection led to a new best!\n");
568 multi.swarm[si].particle[pi].bestCost=multi.swarm[si].particle[pi].cost;
569 doubleCopy(multi.swarm[si].particle[pi].bestPosition,
570 multi.swarm[si].particle[pi].position, dim);
577 immigrated=1; multi.swarm[si].particle[pi].since=0;
579 if(verbose>12) {fprintf(fp,
" immigration\n"); fflush(fp);}
582 sj=si+1;
if(sj>=nSwarms) sj=si-1;
586 if(verbose>12) fprintf(fp,
" swapping particle %d between swarms %d and %d\n", 1+pi, 1+si, 1+sj);
587 for(
unsigned int i=0; i<dim; i++) {
589 double d=multi.swarm[si].particle[pi].position[i];
590 multi.swarm[si].particle[pi].position[i]=multi.swarm[sj].particle[pi].position[i];
591 multi.swarm[sj].particle[pi].position[i]=d;
593 d=multi.swarm[si].particle[pi].velocity[i];
594 multi.swarm[si].particle[pi].velocity[i]=multi.swarm[sj].particle[pi].velocity[i];
595 multi.swarm[sj].particle[pi].velocity[i]=d;
598 double d=multi.swarm[si].particle[pi].cost;
599 multi.swarm[si].particle[pi].cost=multi.swarm[sj].particle[pi].cost;
600 multi.swarm[sj].particle[pi].cost=d;
602 d=multi.swarm[si].particle[pi].bestCost;
603 multi.swarm[si].particle[pi].bestCost=multi.swarm[sj].particle[pi].bestCost;
604 multi.swarm[sj].particle[pi].bestCost=d;
605 for(
unsigned int i=0; i<dim; i++) {
606 double d=multi.swarm[si].particle[pi].bestPosition[i];
607 multi.swarm[si].particle[pi].bestPosition[i]=multi.swarm[sj].particle[pi].bestPosition[i];
608 multi.swarm[sj].particle[pi].bestPosition[i]=d;
611 if(multi.swarm[si].bestCost>multi.swarm[si].particle[pi].bestCost) {
612 multi.swarm[si].bestCost=multi.swarm[si].particle[pi].bestCost;
613 doubleCopy(multi.swarm[si].bestPosition, multi.swarm[si].particle[pi].bestPosition, dim);
615 if(multi.swarm[sj].bestCost>multi.swarm[sj].particle[pi].bestCost) {
616 multi.swarm[sj].bestCost=multi.swarm[sj].particle[pi].bestCost;
617 doubleCopy(multi.swarm[sj].bestPosition, multi.swarm[sj].particle[pi].bestPosition, dim);
623 if(multi.swarm[si].particle[pi].since>=nFrustration && !killed && !immigrated) {
626 if(!frustrated && !killed && !immigrated && multi.swarm[si].particle[pi].since>2) {
629 for(
unsigned int pj=0; pj<nParticles; pj++)
if(pi!=pj)
630 if(multi.swarm[si].particle[pj].cost>multi.swarm[si].particle[pi].cost) {
631 frustrated=0;
break;}
634 multi.swarm[si].particle[pi].since=0;
637 fprintf(fp,
" particle %u became frustrated\n", 1+pi);
638 fprintf(fp,
" current position: %g", multi.swarm[si].particle[pi].position[0]);
639 for(
unsigned int i=1; i<dim; i++) fprintf(fp,
", %g", multi.swarm[si].particle[pi].position[i]);
640 fprintf(fp,
" -> %g\n", multi.swarm[si].particle[pi].cost);
648 for(
unsigned int i=0; i<dim; i++)
if(nlo->
xupper[i]>nlo->
xlower[i]) {
649 multi.swarm[si].particle[pi].velocity[i] =
650 wInertia*multi.swarm[si].particle[pi].velocity[i];
652 (multi.swarm[si].particle[pi].bestPosition[i] - multi.swarm[si].particle[pi].position[i]);
654 (multi.swarm[si].bestPosition[i] - multi.swarm[si].particle[pi].position[i]);
657 (multi.bestPosition[i] - multi.swarm[si].particle[pi].position[i]);
659 if(swarmFrustrated) {
661 for(
unsigned int i=0; i<dim; i++)
if(nlo->
xupper[i]>nlo->
xlower[i]) {
663 if(multi.swarm[si].particle[pi].velocity[i]>0.0)
664 multi.swarm[si].particle[pi].velocity[i]+=v;
665 else multi.swarm[si].particle[pi].velocity[i]-=v;
670 for(
unsigned int i=0; i<dim; i++)
if(nlo->
xupper[i]>nlo->
xlower[i]) {
671 multi.swarm[si].particle[pi].velocity[i] =
672 0.11*wInertia*multi.swarm[si].particle[pi].velocity[i] +
673 0.89*(pmean[i] - multi.swarm[si].particle[pi].position[i]);
676 if(wGlobal<0.0 && nSwarms>1) {
677 for(
unsigned int sj=0; sj<nSwarms; sj++)
if(si!=sj) {
678 for(
unsigned int i=0; i<dim; i++)
if(nlo->
xupper[i]>nlo->
xlower[i]) {
680 (multi.swarm[sj].bestPosition[i] - multi.swarm[si].particle[pi].position[i]);
684 if(verbose>15 || (verbose>12 && frustrated)) {
685 fprintf(fp,
" updated velocities: %g", multi.swarm[si].particle[pi].velocity[0]);
686 for(
unsigned int i=1; i<dim; i++)
687 fprintf(fp,
", %g", multi.swarm[si].particle[pi].velocity[i]);
692 for(
unsigned int i=0; i<dim; i++)
693 multi.swarm[si].particle[pi].position[i]+=multi.swarm[si].particle[pi].velocity[i];
695 for(
unsigned int i=0; i<dim; i++)
696 if(multi.swarm[si].particle[pi].position[i]<nlo->
xlower[i]) {
697 multi.swarm[si].particle[pi].position[i]=nlo->
xlower[i];
699 multi.swarm[si].particle[pi].velocity[i]*=-0.1;
700 }
else if(multi.swarm[si].particle[pi].position[i]>nlo->
xupper[i]) {
701 multi.swarm[si].particle[pi].position[i]=nlo->
xupper[i];
703 multi.swarm[si].particle[pi].velocity[i]*=-0.1;
705 if(verbose>15 || (verbose>12 && frustrated)) {
706 fprintf(fp,
" updated positions: %g", multi.swarm[si].particle[pi].position[0]);
707 for(
unsigned int i=1; i<dim; i++) fprintf(fp,
", %g", multi.swarm[si].particle[pi].position[i]);
713 multi.swarm[si].particle[pi].cost=
714 (*nlo->
_fun)(dim, multi.swarm[si].particle[pi].position, nlo->
fundata);
716 if(verbose>15 || (verbose>12 && frustrated))
717 fprintf(fp,
" updated_cost=%g\n", multi.swarm[si].particle[pi].cost);
721 if(multi.swarm[si].particle[pi].bestCost>multi.swarm[si].particle[pi].cost) {
722 multi.swarm[si].particle[pi].bestCost=multi.swarm[si].particle[pi].cost;
723 doubleCopy(multi.swarm[si].particle[pi].bestPosition,
724 multi.swarm[si].particle[pi].position, dim);
725 multi.swarm[si].particle[pi].since=0;
727 multi.swarm[si].particle[pi].since++;
732 if(multi.swarm[si].bestCost>multi.swarm[si].particle[pi].bestCost) {
733 multi.swarm[si].bestCost=multi.swarm[si].particle[pi].bestCost;
734 doubleCopy(multi.swarm[si].bestPosition, multi.swarm[si].particle[pi].bestPosition, dim);
735 multi.swarm[si].since=0;
741 if(multi.bestCost>multi.swarm[si].bestCost) {
742 multi.bestCost=multi.swarm[si].bestCost;
743 doubleCopy(multi.bestPosition, multi.swarm[si].bestPosition, dim);
750 if(swarmsConcentrated==nSwarms) {
751 if(verbose>2) fprintf(fp,
" all swarm particles shrunk inside swarm tolerance.\n");
758 if(nSwarms>1 && iterNr>10) {
759 int swarmsConverged=1;
760 for(
unsigned int i=0; i<dim; i++) {
761 for(
unsigned int si=0; si<nSwarms; si++) {
762 double d=fabs(multi.bestPosition[i]-multi.swarm[si].bestPosition[i]);
763 if(d>nlo->
xtol[i]) {swarmsConverged=0; convergenceCounter=0;
break;}
765 if(!swarmsConverged)
break;
767 if(swarmsConverged) {
768 convergenceCounter++;
769 if(convergenceCounter>5) {
770 if(verbose>3) fprintf(fp,
"all swarms converged into one minimum.\n");
780 for(
unsigned int i=0; i<dim; i++) {
781 double d=fabs(lastBestPosition[i]-multi.bestPosition[i]);
782 if(d>0.1*nlo->
xtol[i]) {moved=1; movementCounter=0;
break;}
786 if(movementCounter>10) {
788 fprintf(fp,
"best position did not improve in %d last loops.\n", movementCounter);
790 if(verbose>80 && movementCounter>10) {
791 fprintf(fp,
"Why does the movement not continue?\n");
792 for(
unsigned int si=0; si<nSwarms; si++) {
793 fprintf(fp,
"Swarm %d : bestCost=%g\n", 1+si, multi.swarm[si].bestCost);
795 unsigned int pBest=0;
796 double pBestCost=multi.swarm[si].particle[0].cost;
797 for(
unsigned int pi=1; pi<nParticles; pi++)
798 if(multi.swarm[si].particle[pi].cost<pBestCost) {
799 pBestCost=multi.swarm[si].particle[pi].cost; pBest=pi;
801 fprintf(fp,
" currentBestCost=%g\n", pBestCost);
802 fprintf(fp,
"\tDim\toPos\tcPos\tcVel\n");
803 for(
unsigned int i=0; i<dim; i++) {
804 fprintf(fp,
"\t%d\t%g\t%g\t%g\n", 1+i, multi.swarm[si].bestPosition[i],
805 multi.swarm[si].particle[pBest].position[i],
806 multi.swarm[si].particle[pBest].velocity[i]);
813 if(movementCounter>20+dim) {
814 fprintf(fp,
"best position did not move markedly in %d last loops.\n", movementCounter);
818 doubleCopy(lastBestPosition, multi.bestPosition, dim);
822 if(multi.bestCost<lastBestCost) {
823 lastBestCost=multi.bestCost;
828 if(stopCost>=stopCostLimit) {
829 if(verbose>1) fprintf(fp,
"Cost did not improve in %d last iterations.\n", stopCost);
837 if(iterNr>=maxIter) {
838 if(verbose>1) fprintf(fp,
"exceeded the maximum number for loops.\n");
841 if(verbose>1) fprintf(fp,
"exceeded the maximum number for function calls.\n");
849 fprintf(fp,
"\n---- MPSO end analysis ----\n");
850 fprintf(fp,
"loops: %d\n", iterNr);
851 fprintf(fp,
"function calls: %d\n", nlo->
funCalls);
852 for(
unsigned int si=0; si<nSwarms; si++) {
853 fprintf(fp,
"\nSwarm %d : bestCost=%g\n", 1+si, multi.swarm[si].bestCost);
854 for(
unsigned int i=0; i<dim; i++) {
855 fprintf(fp,
"parameter %d: bestPosition %g\n", 1+i, multi.swarm[si].bestPosition[i]);
857 double pmean[dim], psd[dim];
859 for(
unsigned int i=0; i<dim; i++) {
860 fprintf(fp,
"parameter %d: meanPosition %g +- %g\n", 1+i, pmean[i], psd[i]);
863 for(
unsigned int i=0; i<dim; i++) {
864 fprintf(fp,
"parameter %d: meanAbsVelocity %g +- %g\n", 1+i, pmean[i], psd[i]);
868 fprintf(fp,
"\nOverall bestCost=%g\n", multi.bestCost);
869 fprintf(fp,
"at position: %g", multi.bestPosition[0]);
870 for(
unsigned int i=1; i<dim; i++) fprintf(fp,
", %g", multi.bestPosition[i]);
871 fprintf(fp,
"\n"); fflush(fp);
875 for(
unsigned int si=0; si<nSwarms; si++) {
876 for(
unsigned int pi=0; pi<nParticles; pi++) {
877 free(multi.swarm[si].particle[pi].position);
878 free(multi.swarm[si].particle[pi].velocity);
879 free(multi.swarm[si].particle[pi].bestPosition);
881 free(multi.swarm[si].particle);
882 free(multi.swarm[si].bestPosition);
884 free(multi.bestPosition);