Создание списка методов на выбор и получение их количества параметров в c# - PullRequest
3 голосов
/ 28 февраля 2020

Я создаю проект, похожий на this , который был создан Карлом Симсом. Основываясь на публикации , опубликованной Симсом, я понял, что для создания «мозга» для существа мне нужно создать своего рода нейронную сеть, которая в данном случае представляет собой ориентированный граф узлов. Я не буду go подробно рассказывать о том, как работает вся сеть.

Мне нужно создать нейроны, которые являются узлами, которые получают некоторые входные значения и производят еще одно значение на основе своих функций. На них можно указать и указать один или несколько других узлов. Каждый нейрон также имеет функцию, которую он использует для производства своей стоимости. Первым шагом в создании сети является создание экземпляров нейронов без указателей, затем назначение каждому нейрону функции, а затем указание указателей нейронов на входы (другие узлы в сети). Моя проблема в том, что я не могу связать выбранную функцию с количеством требуемых параметров.

Например, предположим, что нейроны могут иметь эти 3 функции:

    public float Sum2(float a, float b)
    {
        return a + b;
    }

    public float Mul3(float a, float b, float c)
    {
        return a * b * c;
    }

    public float Threshold(float a){
        if(a > 0.5)
            return a;
        return 0;
    }

Где-то в коде Мне нужен класс, подобный следующему:

    class NeuronData{
        FunctionIdendifier func; // An object that points to one of the functions Sum2, Mul3, or Threshold. Through it I can reach the original method easily. 
        int numOfInputs;
    }


Я думал о создании словаря, в котором ключи являются функциями, а значения являются суммами параметров, но это кажется слишком сложным, и в нем также есть место для человеческая ошибка.

Заранее спасибо:)

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

Я использовал подход, аналогичный @Posix, я выложу код для полного решения. Здесь 10 нейронов создаются и получают случайную функцию из словаря, которая включает функцию в качестве ключа и значение параметра в качестве значения.

    class Program
    {
        static void Main(string[] args)
        {
            for(int i = 0; i < 10; i++)
            {
                Neuron n = new Neuron();                
            }

        }
    }

Диспетчер функций:

    public delegate float NeuralFunction (params float[] inputs);
    public class FunctionManager
    {
        private static Random rand = new Random();
        private static FunctionManager singleton = new FunctionManager();

        private Dictionary<NeuralFunction,int> functionDict;

        private FunctionManager() {
            functionDict = new Dictionary<NeuralFunction, int>();

            functionDict.Add(Thresh, 1);
            functionDict.Add(Sum2, 2);
            functionDict.Add(Mul3, 3);
        }

        public static FunctionManager Singleton { get { return singleton; } }


        public float Sum2(params float[] inputs)
        {
            // 2 Inputs
            if (inputs.Length != 2)
                throw new InvalidOperationException();
            float n1 = inputs[0];
            float n2 = inputs[1];
            return n1 + n2;
        }

        public float Mul3(params float[] inputs)
        {
            // 3 Inputs
            if (inputs.Length != 3)
                throw new InvalidOperationException();
            float n1 = inputs[0];
            float n2 = inputs[1];
            float n3 = inputs[2];
            return n1 * n2 * n3;
        }

        public float Thresh(params float[] inputs)
        {
            // 1 Inputs
            if (inputs.Length != 1)
                throw new InvalidOperationException();
            float n1 = inputs[0];
            if (n1 > 0.5)
                return n1;
            return 0;
        }

        public KeyValuePair<NeuralFunction, int> GetRandomFunction()
        {                        
            List<NeuralFunction> keys = Enumerable.ToList(functionDict.Keys);            
            NeuralFunction function = keys[rand.Next(0, keys.Count)];
            return new KeyValuePair<NeuralFunction, int>(function, functionDict[function]);

        }
    }    

Нейронный класс:

class Neuron
    {
        NeuralFunction function;
        int paramAmount;

        public Neuron()
        {
            KeyValuePair<NeuralFunction, int> keyVal = FunctionManager.Singleton.GetRandomFunction();
            function = keyVal.Key;
            paramAmount = keyVal.Value;
            MethodInfo method = function.Method;
            Console.WriteLine("-- Method: " + method.Name + "Has " + paramAmount + " Parameters");
        }
    }
0 голосов
/ 28 февраля 2020

Как насчет массива в качестве ввода. Но он всегда ожидает тип данных с плавающей запятой.

float SumN(float[] args)
{
    return args.Sum();
}

float MulN(float[] args)
{
    return args.Aggregate((s, x) => s * x);
}

float Threshold(float[] args)
{
    if (args.Length != 1)
    {
        throw new InvalidOperationException();
    }
    float value = args[0];
    return value > 0.5 ? value : 0f;
}

class NeuronData
{
    Func<float[], float> func;

    public NeuronData(Func<float[], float> func)
    {
        this.func = func;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...