SkillAgentSearch skills...

LibOptimization

LibOptimization is numerical optimization algorithm library for .NET Framework. / .NET用の数値計算、最適化ライブラリ

Install / Use

/learn @tomitomi3/LibOptimization

README

| appveyor | nuget | | ---- | ---- | | Build status | NuGet |

<img src="https://github.com/tomitomi3/LibOptimization/blob/master/github_pic/logo_liboptimization.png" width=30%>

LibOptimization

LibOptimization is a numerical optimization library that simplifies optimization using C#, VisualBasic.Net and other .NET Framework languages. This library is used by people who need optimization such as science (eg physics), engineering, sound, finance, statistics, medical care, structural design etc.

LibOptimizationは制約条件の無い数値最適化を行う.NET Frameworkのライブラリです。科学 (物理学など)、エンジニアリング、音響、金融、統計、医療、構造設計などの最適化を必要とする人に使用されているようです。

実装しているアルゴリズムは最急降下法、ニュートン法、HookeJeevesのパターンサーチ法、Nelder-Mead法(オリジナルの実装、Wikipediaの実装)、適応パラメータ Nelder-Mead法、実数値遺伝的アルゴリズム(BLX-α、UNDX、SPX(シンプレクス)、REX、世代交代はJGG、PCX(世代交代はG3))、進化戦略(Evolution Strategy、1+1 ES)、粒子群最適化(Basic PSO, LDIW-PSO, CDIW-PSO, CRIW-PSO, AIW-PSO)、Differential Evolution(差分進化? DE/rand/1/bin, DE/rand/2/bin, DE/best/1/bin, DE/best/2/bin)、JADE(自己適応型DE)ホタルアルゴリズム、Cuckoo Search(Matlabコードの移植版)、焼きなまし法、山登り法です。

Tutrial

LibOptimization tutorial🚀

Contact

I may miss your Issues. When a reply is slow, please give me e-mail.

<pre> tomi.nori+github atmark gmail.com </pre>

Cite

If you use LibOptimization in your publication, please cite the following

<pre> @misc{LibOptimization, author = "N.Tomita", title = "LibOptimization", howpublished = "\url{https://github.com/tomitomi3/LibOptimization}", } </pre>

Recent change

~~Changed absOptimiazation.NumberOfVariable from propety to function in ver1.9.0. Refactoring LibOptimization code with development branch. In the future, I will add new function to the new branch.~~

Introduction

LibOptimization has several optimization algorithms implemented. You design the objective function, you can use all the optimized algorithms implemented.

Implement Optimization algorithm

Require derivative algorithm

  • Steepest Descent Method
  • Newton Method

Derivative free algorithm (Direct search method)

  • Nelder Mead Method / Simplex Method (Original paper ver)
  • Nelder Mead Method (Wikipedia ver. add inside contraction)
  • Adaptive Nelder-Mead Simplex method
  • Hooke and Jeeves of Pattern Search (Direct Search)

Derivative free algorithm (Nature inspired algorithm)

  • Real-coded Genetic Algorithm
    • BLX-alpha and JGG(Just Generation Gap)
    • UNDX(Unimodal Normal Distribution Crossover) and JGG
    • SPX(Simplex Crossover) and JGG
    • REX(Real-coded Ensemble Crossover) and JGG
    • PCX(Parent Centric Recombination) and G3(Generalize Generation Gap)
  • Particle Swarm Optimization(PSO)
    • Basic PSO(GlobalBest, LocalBest)
    • PSO using Linear Decrease Inertia Weight
    • PSO using Chaotic inertia weight(CDIW-PSO, CRIW-PSO)
    • PSO using Adaptive inertia weight
    • Parallel Competitive Particle Swarm Optimization
  • Differential Evolution
    • DE/rand/1/bin
    • DE/rand/2/bin
    • DE/best/1/bin
    • DE/best/2/bin
    • JADE(self adaptation DE)
  • Evolution Strategy
    • (1+1)-ES )
  • Standrad Cuckoo Search
  • FireFly algorithm

Derivative free algorithm (Randomized algorithm)

  • Simulated Annealing
  • Hill Climbing

How to get

URL:https://www.nuget.org/packages/LibOptimization/

PM> Install-Package LibOptimization

How to use

Typical Use

  1. You inherit "absObjectiveFunction" class and design objective function.
  2. Choose an optimization method and implement code.
  3. Do optimization.
  4. Get result and evaluate.

See this link for details

Sample code

Typical use code

for VB.NET

'Instantiation optimization class and set objective function.
Dim optimization As New clsOptSteepestDescent(New clsBenchSphere(1))
'Initialize starting value
optimization.Init()
'Do calc
optimization.DoIteration()
'Get result. Check recent error.
If optimization.IsRecentError() = True Then
    Return
Else
    clsUtil.DebugValue(optimization)
End If

for C#

//Instantiation objective Function
var func = new RosenBlock();
//Instantiation optimization class and set objective function.
var opt = new clsOptNelderMead(func);
opt.Init();
//Do calc
opt.DoIteration();
//Check Error
if (opt.IsRecentError() == true)
{
    return;
}
else
{
    //Get Result
    clsUtil.DebugValue(opt);
}

Set boundary value for each variable.

  • Problem setting

objective function : clsBenchTest2(x1,x2) = x1^4 - 20x1^2 + 20x1 + x2^4 - 20x2^2 + 20x2

  • boundary variables

x1 -> 0.0 to 5.0

x2 -> 1.0 to 4.0

for VB.NET

'Set boundary variable
opt.LowerBounds = New Double() {0, 1.0}
opt.UpperBounds = New Double() {5, 4.0}
'Init
opt.Init()

for C#

//Set boundary variable
opt.LowerBounds = new double[] {0, 1.0};
opt.UpperBounds = new double[] {5, 4.0};
//Init
opt.Init();

Using my criterion

When using a typical code, internal criteria are enabled. For details, see EPS property, clsUtil.IsCriterion.

for C#

var opt = new LibOptimization.Optimization.clsOptDEJADE(new RosenBrock(10));
//Disable Internal criterion
opt.IsUseCriterion = false;

//Init
opt.Init();
clsUtil.DebugValue(opt);

//do optimization!
while (opt.DoIteration(100) == false)
{
    var eval = opt.Result.Eval;

    //my criterion
    if (eval < 0.01)
    {
        break;
    }
    else
    {
        clsUtil.DebugValue(opt, ai_isOutValue: false);
    }
}
clsUtil.DebugValue(opt);

set initial position

Generate initial positions around x1=10 and x2=10.

for VB.NET

optimization.InitialPosition = {10, 10}
optimization.Init()
optimization.DoIteration()
clsUtil.DebugValue(optimization)

for C#

opt.InitialPosition = new double[] { 10, 10 };
optimization.Init()
optimization.DoIteration()
clsUtil.DebugValue(optimization)

Set inital position and inital value range

Generate the initial position in the range of 7 to 10.

for VB.NET

Dim optimization As New Optimization.clsOptDE(New clsBenchSphere(2))
'set initialposition
optimization.InitialPosition = New Double() {10, 10}
'Initial value is generated in the range of -3 to 3.
optimization.InitialValueRangeLower = -3
optimization.InitialValueRangeLower = 3
'init and do optimization
optimization.Init()
optimization.DoIteration()
clsUtil.DebugValue(optimization)

for C#

var func = new RosenBrock(2);
var opt = new LibOptimization.Optimization.clsOptPSO(func);
opt.InitialPosition = new double[] { -10, -10 };
opt.InitialValueRangeLower = -3;
opt.InitialValueRangeUpper  = 3;
opt.Init();
opt.DoIteration();

Evaluate optimization result per N iteration

for VB.NET

Dim optimization As New clsOptSteepestDescent(New clsBenchSphere(2))
optimization.Init()
//per 5 iteration
While (optimization.DoIteration(5) = False)
    clsUtil.DebugValue(optimization)
End While
clsUtil.DebugValue(optimization, ai_isOnlyIterationCount:=True)
End With

for C#

//per 100 iteration
while (opt.DoIteration(100)==false)
{
    clsUtil.DebugValue(opt, ai_isOutValue: false);
}
clsUtil.DebugValue(opt);

fix Random Number Generator(RNG)

for VB.NET

//fix RND for random sequence
Util.clsRandomXorshiftSingleton.GetInstance.SetDefaultSeed()

Dim optimization As New Optimization.clsOptDE(New clsBenchSphere(2))
//fix RND for generate position
optimization.Random = New Util.clsRandomXorshift()

'init
optimization.Init()

for C#

//fix RND for random sequence
LibOptimization.Util.clsRandomXorshiftSingleton.GetInstance().SetDefaultSeed();

var func = new RosenBrock(2);
var opt = new LibOptimization.Optimization.clsOptPSO(func);
//fix RND for generate position
opt.Random = new LibOptimization.Util.clsRandomXorshift();

//init
opt.Init();

Retry optmization(Elite strategy).

for VB.NET

Dim optimization As New Optimization.clsOptRealGAREX(New clsBenchDeJongFunction3())

'1st try
optimization.Init()
While (optimization.DoIteration(100) = False)
    clsUtil.DebugValue(optimization, ai_isOutValue:=False)
End While
clsUtil.DebugValue(optimization)

'2nd try reuse
optimization.InitialPosition = optimization.Result().ToArray()
optimization.Init()
While (optimization.DoIteration(100) = False)
    clsUtil.DebugValue(optimization, ai_isOutValue:=False)
End While
clsUtil.DebugValue(optimization)

You can use other optimization method(inherit absObjctiveFcuntion).

Dim optimization As New clsOptRealGASPX(New clsBenchRastriginFunction(20))
optimization.Init()
clsUtil.DebugValue(optimization)
While True
    If optimization.DoIteration(10) = True Then
        Exit While
    End If
    clsUtil.DebugValue(optimization, ai_isOutValue:=False)
End While
If optimization.IsRecentError() = True Then
    Return
End If
clsUtil.DebugValue(optimization)

Multi point and MultiThread. Multipoint avoids Local minimum by preparing many values.

'prepare many optimization class.
Dim multipointNumber As Integer = 30
Dim listOptimization As New List(Of absOptimization)
For i As Integer = 0 To multipointNumber - 1
    Dim tempOpt As New clsOptNelderMead(New clsBenchAckley(20))
    tempOpt.Init()
    listOptimization.Add(tempOpt)
Next

'using Parallel.ForEach
Dim lockObj As New Object()
Dim best As LibOptimization.absOptimization = Nothing
Threading.Tasks.Parallel.ForEach(listOptimization, Sub(opt As absOptimization)
                                                       opt.DoIteration()
                                                       'Swap best result
                                                       SyncLock lockObj
                                                           If best Is Nothing Then
                                                               best = opt
                                                           ElseIf best.Result.Eval > opt.Result.Eval
View on GitHub
GitHub Stars62
CategoryDevelopment
Updated2mo ago
Forks19

Languages

Visual Basic .NET

Security Score

100/100

Audited on Jan 26, 2026

No findings