*Passando um método para uma classe
Pergunta
Estou codificando uma classe pequena que maximiza uma determinada função f e retorna as coordenadas. Por exemplo, para maximizar a função de condicionamento de condicionamento unidimensional abaixo, atualmente tenho:
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);
}
}
O método "maximizar" na metaheutista da classe contém o algoritmo que faz todo o trabalho. Meu problema é que esse algoritmo está em uma classe que não sabe como é a função de condicionamento físico.
Eu sou novo no C# e se eu fui um pouco aqui, estou aberto a fazer tudo de novo para acertar. No entanto, preciso manter a classe solucionadora separada da função de condicionamento físico.
Muito Obrigado. *Não tenho certeza de "passar" é o termo correto que estou procurando
Solução
Você pode realmente passar métodos em funções usando um delegado, por exemplo:
public delegate double FitnessDelegate(double x);
Declara um delegado para uma função que pega um parâmetro duplo e retorna um dobro. Você pode criar uma referência à função real e passar isso para o método de resolução a ser chamado.
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);
}
}
Dentro do método de resolução, você pode chamar esse delegado como faria com um método e ele estará de fato executando o método real:
class Metaheutistic
{
public void Maximise(FitnessDelegate fitness)
{
double result = fitness(1.23);
}
}