1

特定の関数 F を最大化し、座標を返す小さなクラスをコーディングしています。たとえば、以下の 1 次元フィットネス関数を最大化する場合、現在次のようにしています。

using System;

public static class Program
{
    public static double F(double x)
    {
        // for example
        return Math.Exp(0.4 * Math.Pow(x - 0.4, 2) - 0.08 * Math.Pow(x, 4));
    }

    static void Main(string[] args)
    {

    Metaheutistic Solve = new Metaheutistic;

    Solve.Maximize(Mu, Lambda, Theta);

    }
}

クラス Metaheutistic のメソッド「Maximize」には、すべての作業を行うアルゴリズムが含まれています。私の問題は、このアルゴリズムがフィットネス関数がどのように見えるかを知らないクラスにあることです。

私は C# が初めてで、ここでベンダーに行ったことがあれば、それを正しく行うためにもう一度やり直しても構わないと思っています。ただし、Solver クラスをフィットネス関数から分離しておく必要があります。

どうもありがとう。*「合格」が探している正しい用語かどうかはわかりません

4

1 に答える 1

0

実際、デリゲートを使用してメソッドを関数に渡すことができます。次に例を示します。

public delegate double FitnessDelegate(double x);

doubleパラメーターを取り、doubleを返す関数へのデリゲートを宣言します。次に、実際の関数への参照を作成し、これを呼び出されるSolveメソッドに渡すことができます。

public static class Program
{
    public static double F(double x)
    {
        // for example
        return Math.Exp(0.4 * Math.Pow(x - 0.4, 2) - 0.08 * Math.Pow(x, 4));
    }

    static void Main(string[] args)
    {
    FitnessDelegate fitness = new FitnessDelegate(F);
    Metaheutistic Solve = new Metaheutistic;

    Solve.Maximize(fitness);

    }
}

Solveメソッド内では、メソッドと同じようにこのデリゲートを呼び出すことができ、実際には実際のメソッドを実行します。

class Metaheutistic 
{
  public void Maximise(FitnessDelegate fitness)
  {
    double result = fitness(1.23);
  }
}
于 2010-01-04T12:27:28.960 に答える