Files
UnrealEngine/Engine/Plugins/Experimental/LearningAgents/Source/Learning/Public/LearningPSOOptimizer.h
2025-05-18 13:04:45 +08:00

62 lines
1.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "LearningOptimizer.h"
namespace UE::Learning
{
/**
* Settings for the PSO Optimizer. Defaults from https://www.jstage.jst.go.jp/article/imt/3/1/3_1_103/_pdf/-char/ja
*/
struct LEARNING_API FPSOOptimizerSettings
{
// Amount to pull particles toward their local best
float LocalGain = 1.49455f;
// Amount to pull particles toward the global best
float GlobalGain = 1.49455f;
// How much of the particle velocity to preserve between steps
float Momentum = 0.729f;
};
/**
* PSO Optimizer
*
* Gradient free optimizer based on Particle Swarm Optimization
*/
struct LEARNING_API FPSOOptimizer : public IOptimizer
{
FPSOOptimizer(const uint32 Seed, const FPSOOptimizerSettings& InSettings = FPSOOptimizerSettings());
virtual void Resize(const int32 SampleNum, const int32 DimensionsNum) override final;
virtual void Reset(
TLearningArrayView<2, float> OutSamples,
const TLearningArrayView<1, const float> InitialGuess) override final;
virtual void Update(
TLearningArrayView<2, float> InOutSamples,
const TLearningArrayView<1, const float> Losses,
const ELogSetting LogSettings = ELogSetting::Normal) override final;
private:
uint32 Seed = 0;
FPSOOptimizerSettings Settings;
int32 Iterations = 0;
TLearningArray<2, float> LocalBestPositions;
TLearningArray<1, float> LocalBestLoss;
TLearningArray<1, float> GlobalBestPosition;
float GlobalBestLoss = 0.0f;
TLearningArray<2, float> Velocities;
TLearningArray<2, float> LocalUniformSamples;
TLearningArray<2, float> GlobalUniformSamples;
};
}