diff --git a/include/swarm.hpp b/include/swarm.hpp index 002ee55..4c3ff26 100644 --- a/include/swarm.hpp +++ b/include/swarm.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -45,15 +46,38 @@ namespace ParamChange { }; } }; + + template + struct MTanhAlg { + vec<3> operator()( + float visc, float nostal, float peerp, int curr, int max) { + float pct_done = (float)curr / (float)max; + float scale_factor = (std::tanh(steepness * (pct_done - 0.5)) + 1) / 2; + return { + visc - (0.9f - 0.4f) * scale_factor, + nostal - (2.5f - 0.5f) * scale_factor, + peerp + (2.5f - 0.5f) * scale_factor, + }; + } + }; }; -template +template> struct Particle : public Agent> { std::pair> best() const override { return {pb, pb_pos}; }; void move(float dt=1) override { position = position + velocity * dt; } void step() override { + vec<3> params = alg(kviscosity, knostalgia, kpeer_pressure, + curr_iter, max_iter); + + viscosity = params.x; + nostalgia = params.y; + peer_pressure = params.z; + + curr_iter++; + velocity = viscosity * velocity + nostalgia * (pb_pos - position) + peer_pressure * (peer.best().second - position); @@ -63,15 +87,6 @@ struct Particle : public Agent> { pb = y; pb_pos = position; } - - vec<3> params = alg(kviscosity, knostalgia, kpeer_pressure, - curr_iter, max_iter); - - viscosity = params.x; - nostalgia = params.y; - peer_pressure = params.z; - - curr_iter++; }; const float kviscosity = 0.9f; @@ -146,7 +161,7 @@ struct Swarm : public Agent> { const std::vector>& get_particles() { return particles; }; - Swarm(Agent>::F f, unsigned max_iter = 150) + Swarm(Agent>::F f, unsigned max_iter) : Agent>(f), max_iter(max_iter) {} private: unsigned max_iter;