Функция оптимизации C#: System.NotImplementedExceptionC#

Место общения программистов C#
Ответить
Anonymous
 Функция оптимизации C#: System.NotImplementedException

Сообщение Anonymous »

Вот более понятная версия вашего сообщения:
Привет всем!
В настоящее время я работаю над финансовым проектом на C#, где я необходимо провести оптимизацию портфеля. Моя цель — создать класс или функцию, которая принимает три входных вектора (по одному для рисков, доходности и продолжительности облигаций) вместе с тремя целевыми значениями (по одному для каждого). Цель состоит в том, чтобы оптимизировать вес каждой облигации в портфеле для достижения как можно более точной целевой дюрации с ограничениями, основанными на риске и доходности.
Хотя я знаком с ООП и Python, я новичок в C#, поэтому изо всех сил пытаюсь заставить свой код работать. Я постоянно сталкиваюсь с этой ошибкой:

Код: Выделить всё

    Unhandled exception.  System.NotImplementedException: The method or operation is not implemented.at Proj.ObjectiveFunction.MathNet.Numerics.Optimization.IObjectiveFunctionEvaluation.get_Gradient() in /Users/ally/Desktop/NewProj/NewProj/ClasseOptimisation.cs:line 57
at MathNet.Numerics.Optimization.MinimizerBase.ValidateGradientAndObjective(IObjectiveFunctionEvaluation eval)
at MathNet.Numerics.Optimization.BfgsMinimizer.FindMinimum(IObjectiveFunction objective, Vector`1 initialGuess)
at Proj.Optimisation.SolverEquation() in /Users/ally/Desktop/NewProj/NewProj/ClasseOptimisation.cs:line 172
at Program.$(String[] args) in /Users/ally/Desktop/NewProj/NewProj/Program.cs:line 34
Я попробовал множество вещей, включая реализацию интерфейса IObjectiveFunction, который затем выдал мне следующую строку:

Код: Выделить всё

 void IObjectiveFunction.EvaluateAt(Vector point)
{
throw new NotImplementedException();
}
Я пытался прокомментировать строку и заменить ее возвращаемым значением 0, чтобы она работала, но, похоже, я всегда получаю одну и ту же ошибку...
Интернет-версия документация по пакету мне не очень помогла, поэтому буду признателен за любую помощь.
Вот весь мой класс оптимизации:

Код: Выделить всё

using MathNet.Numerics.Optimization;
using MathNet.Numerics.LinearAlgebra;
using System;
using System.Security.Cryptography.X509Certificates;

namespace Proj
{
public class ObjectiveFunction : IObjectiveFunction
{
private readonly List _durations;

public ObjectiveFunction(List durations)
{
_durations = durations;
}

// Méthode pour calculer la valeur de la fonction objective
public double Value(Vector point)
{
double totalDuration = 0;
for (int i = 0; i < point.Count; i++)
{
totalDuration += point[i] * _durations[i];
}
return totalDuration;
}

// Méthode pour calculer le gradient de la fonction objective
public Vector Gradient(Vector point)
{
var gradient = Vector.Build.Dense(point.Count);
for (int i = 0; i < point.Count; i++)
{
gradient[i] = _durations[i];
}
return gradient;
}

public IObjectiveFunctionPoint Evaluate(Vector point)
{
double value = Value(point);
Vector gradient = Gradient(point);
return new ObjectiveFunctionPoint(point, value, gradient);
}

// Propriétés requises par `IObjectiveFunction`
public bool IsGradientSupported => true;
public bool IsHessianSupported => false;

public Vector Point => throw new NotImplementedException();

double IObjectiveFunctionEvaluation.Value => throw new NotImplementedException();

Vector IObjectiveFunctionEvaluation.Gradient => throw new NotImplementedException();

public Matrix Hessian => throw new NotImplementedException();

public IObjectiveFunction CreateNew()
{
return new ObjectiveFunction(_durations);
}

public IObjectiveFunction Fork()
{
throw new NotImplementedException();
}

void IObjectiveFunction.EvaluateAt(Vector point)
{
throw new NotImplementedException();
}
}

public class ObjectiveFunctionPoint : IObjectiveFunctionPoint
{
public Vector Point { get; private set; }
public double Value { get; private set; }
public Vector Gradient { get; private set; }
public Matrix Hessian => null; // Hessienne non supportée dans cet exemple

public ObjectiveFunctionPoint(Vector point, double value, Vector gradient)
{
Point = point;
Value = value;
Gradient = gradient;
}
}

public interface IObjectiveFunctionPoint
{
}

public class Optimisation
{
// Paramètres cible
public double DurationCible { get; set; }
public double RisqueCible { get; set;  }
public double RendCible { get; set; }

// Données
public List DurationsOblig { get; set; }
public List RisquesOblig { get; set; }
public List RendementsOblig { get; set; }

// Taille du portefeuille
public int n => DurationsOblig.Count;

public Optimisation(List durations, List risques, List rendements, double durationCible, double risqueCible, double rendCible)
{
DurationsOblig = durations;
RisquesOblig = risques;
RendementsOblig = rendements;
DurationCible = durationCible;
RisqueCible = risqueCible;
RendCible = rendCible;
}

public List SolverEquation()
{
// Assurez-vous que la taille de `initialWeights` est correcte
if (DurationsOblig.Count != RisquesOblig.Count || DurationsOblig.Count != RendementsOblig.Count)
{
throw new InvalidOperationException("Les listes de durées, risques, et rendements doivent avoir la même taille.");
}

int n = DurationsOblig.Count;

// Initialisation des poids avec un nombre d'éléments égal à `n`
var initialWeights = Vector.Build.Dense(n, 1.0 / n);

// Création de la fonction objective
var objective = new ObjectiveFunction(DurationsOblig);

// Vérifiez la taille du vecteur dans la classe `ObjectiveFunction`
if (objective == null || DurationsOblig.Count != n)
{
throw new InvalidOperationException("La taille du vecteur des durées dans ObjectiveFunction doit correspondre au nombre de poids.");
}

// Créez les contraintes en vérifiant les tailles des vecteurs utilisés
Func RiskConstraint = weights =>
{
double totalRisk = 0;
for (int i = 0; i < n; i++)
{
totalRisk += weights[i] * RisquesOblig[i];
}
return totalRisk - RisqueCible;
};

Func ReturnConstraint = weights =>
{
double totalReturn = 0;
for (int i = 0; i < n; i++)
{
totalReturn += weights[i] * RendementsOblig[i];
}
return totalReturn - RendCible;
};

Func WeightSumConstraint = weights =>
{
double totalWeight = weights.Sum();
return totalWeight - 1;
};

// Utilisation du solveur d'optimisation
var optimizer = new BfgsMinimizer(1e-6, 1e-6, 1e-6, 1000);
var result = optimizer.FindMinimum(objective, initialWeights);

if (result.ReasonForExit == ExitCondition.Converged)
{
Console.WriteLine("Optimisation réussie !");
return result.MinimizingPoint.ToList();
}
else
{
Console.WriteLine("L'optimisation a échoué.");
return Enumerable.Repeat(0.0, n).ToList();
}
}
}
}
Все строки с вызовом new NotImplementedException(); были добавлены с помощью справки по коду VS.
Заранее спасибо!!

Подробнее здесь: https://stackoverflow.com/questions/791 ... dexception
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»