-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathPSOSolver.cpp
More file actions
86 lines (73 loc) · 2.46 KB
/
PSOSolver.cpp
File metadata and controls
86 lines (73 loc) · 2.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*
* Swarm.cpp
*
* Created on: Jul 2, 2025
* Author: iztok
*/
#include <algorithm>
#include "PSOSolver.h"
PSOSolver::PSOSolver(int dim, int popSize, Problem problem) : gBestFitness(0.0), nDim(dim), numParticles(popSize), inertia(0.9), social(0.1), cognitive(0.1) {
prob = problem;
dimension = eval.encode(dim, prob);
particles.reserve(numParticles);
}
PSOSolver::~PSOSolver(void) {
particles.clear();
gBestPosition.clear();
}
void PSOSolver::Setup(double w, double c1, double c2, int n_intervals) {
inertia = w;
cognitive = c1;
social = c2;
intervals = n_intervals;
for (int i = 0; i < numParticles; i++) {
Particle row(dimension, inertia, cognitive, social);
particles.push_back(row);
gBestPosition.push_back(0.0);
}
}
void PSOSolver::optimize(int run, int maxFEs, Archive &rules) {
int maxGenerations = maxFEs/numParticles; // determine maximum number of evaluation
if((maxGenerations%numParticles) > 0)
maxGenerations++;
gBestFitness = 0.0;
// int i = 0;
for (int iter = 0; iter < maxGenerations; iter++) {
cout << "generation= " << iter << endl;
for (auto& particle : particles) {
Rule rule;
particle.fitness = eval.EnergyFunction(particle.position, prob, rule, intervals);
//cout << "trial= " << ++i << " trialEnergy= " << particle.fitness << " vs. globalBestFitness" << gBestFitness << " ===> " << endl;
// determining the personal best solution
if (particle.fitness > particle.pBestFitness) {
particle.pBestFitness = particle.fitness;
particle.pBestPosition = particle.position;
rules.add(rule);
// determining the global best solotion
if (particle.fitness > gBestFitness) {
gBestFitness = particle.fitness;
gBestPosition = particle.position;
cout << "bestFitness= " << gBestFitness << " at " << iter << " generation." << endl;
if(gBestFitness == 1.0)
return;
}
}
}
// print_swarm();
//exit(-1);
for (auto& particle : particles) {
particle.updateVelocity(gBestPosition);
particle.updatePosition();
}
}
}
void PSOSolver::print_swarm() {
cout << "Print swarm:" << endl;
for (int i = 0; i < numParticles; i++) {
cout << "[" << i << "] : (";
for(int j=0;j<dimension;j++) {
cout << particles[i].position[j] << ",";
}
cout << ") --> fit= " << particles[i].fitness << endl;
}
}