ISmQuadraticProgramming.CriterionFunction

Синтаксис Fore

CriterionFunction: Array;

Синтаксис Fore.NET

CriterionFunction: System.Array;

Описание

Свойство CriterionFunction определяет линейную часть целевой функции.

Комментарии

Индексация массива коэффициентов целевой функции должна начинаться с нуля.

Квадратичная часть целевой функции определяется свойством ISmQuadraticProgramming.QuadraticForm.

Пример Fore

Добавьте ссылку на системную сборку Stat.

Sub UserProc;
Var
    QP: SmQuadraticProgramming;
    i, Res: Integer;
    CF, Lb, Ub, LinC1, LinC2, LinC3, init: Array[3Of Double;
    H: Array[33Of Double;
    Bound: ISlBoundaryRegion;
    LCon1, LCon2, LCon3: ISlLinearConstraint;
Begin
    QP := New SmQuadraticProgramming.Create;
    // Задаем начальные приближения
    init[0] := 1; init[1] := 1;
    QP.InitialApproximation.AutoCreate := False;
    QP.InitialApproximation.InitValues := init;
    // Задаем линейную часть целевой функции
    CF[0] := 1; CF[1] := 1; CF[2] := -1;
    QP.CriterionFunction := CF;
    //Задаем квадратичную часть целевой функции
    H[00] := -2; H[01] := 2; H[02] := 0;
    H[10] := 2; H[11] := -2; H[12] := 0;
    H[20] := 0; H[21] := 0; H[22] := -2;
    QP.QuadraticForm := H;
    // Задаем область определения
    Lb[0] := 0; Lb[1] := 0; Lb[2] := 0;
    Ub[0] := 1; Ub[1] := 1; Ub[2] := 1;
    Bound := QP.Boundary;
    // Задаем границы области
    Bound.BoundaryLower := Lb;
    Bound.BoundaryUpper := Ub;
    // Задаем первый коэффициент линейного ограничения
    LinC1[0] := 1; LinC1[1] := 1; LinC1[2] := 1;
    LCon1 := QP.LinearConstraints.Add;
    LCon1.Value := LinC1;
    // Задаем границы первого коэффициента линейного ограничения
    LCon1.BoundaryLower := 1;
    LCon1.BoundaryUpper := Double.PositiveInfinity;
    // Задаем второй коэффициент линейного ограничения
    LinC2[0] := 2; LinC2[1] := 1; LinC2[2] := -1;
    LCon2 := QP.LinearConstraints.Add;
    LCon2.Value := LinC2;
    // Задаем границы второго коэффициента линейного ограничения
    LCon2.BoundaryLower := -1;
    LCon2.BoundaryUpper := Double.PositiveInfinity;
    // Задаем третий коэффициент линейного ограничения
    LinC3[0] := 1; LinC3[1] := -1; LinC3[2] := 1;
    LCon3 := QP.LinearConstraints.Add;
    LCon3.Value := LinC3;
    // Задаем границы третьего коэффициента линейного ограничения
    LCon3.BoundaryLower := 0;
    LCon3.BoundaryUpper := 0;
    // Выполняем расчёт и выводим результаты
    Res := QP.Execute;
    If res = 0 Then
        Debug.WriteLine("== Значение целевой функции ==");
        Debug.WriteLine(QP.OptimalFunctionValue.ToString);
        Debug.WriteLine("== Решение ==");
        For i := 0 To QP.Solution.Length - 1 Do
            Debug.WriteLine(i.ToString + ": " + QP.Solution[i].ToString);
        End For;
    End If;
End Sub UserProc;

В результате выполнения примера в окно консоли будут выведены результаты расчёта задачи квадратичного программирования.

Пример Fore.NET

Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.

Imports Prognoz.Platform.Interop.Stat;

Public Shared Sub Main(Params: StartParams);
Var
    QP: SmQuadraticProgramming;
    i, Res: integer;
    CF, Lb, Ub, LinC1, LinC2, LinC3, init: Array[3Of double;
    H: Array[33Of double;
    Bound: ISlBoundaryRegion;
    LCon1, LCon2, LCon3: ISlLinearConstraint;
Begin
    QP := New SmQuadraticProgramming.Create();
    // Задаем начальные приближения
    init[0] := 1; init[1] := 1;
    QP.InitialApproximation.AutoCreate := False;
    QP.InitialApproximation.InitValues := init;
    // Задаем линейную часть целевой функции
    CF[0] := 1; CF[1] := 1; CF[2] := -1;
    QP.CriterionFunction := CF;
    //Задаем квадратичную часть целевой функции
    H[00] := -2; H[01] := 2; H[02] := 0;
    H[10] := 2; H[11] := -2; H[12] := 0;
    H[20] := 0; H[21] := 0; H[22] := -2;
    QP.QuadraticForm := H;
    // Задаем область определения
    Lb[0] := 0; Lb[1] := 0; Lb[2] := 0;
    Ub[0] := 1; Ub[1] := 1; Ub[2] := 1;
    Bound := QP.Boundary;
    // Задаем границы области
    Bound.BoundaryLower := Lb;
    Bound.BoundaryUpper := Ub;
    // Задаем первый коэффициент линейного ограничения
    LinC1[0] := 1; LinC1[1] := 1; LinC1[2] := 1;
    LCon1 := QP.LinearConstraints.Add();
    LCon1.Value := LinC1;
    // Задаем границы первого коэффициента линейного ограничения
    LCon1.BoundaryLower := 1;
    LCon1.BoundaryUpper := Double.PositiveInfinity;
    // Задаем второй коэффициент линейного ограничения
    LinC2[0] := 2; LinC2[1] := 1; LinC2[2] := -1;
    LCon2 := QP.LinearConstraints.Add();
    LCon2.Value := LinC2;
    // Задаем границы второго коэффициента линейного ограничения
    LCon2.BoundaryLower := -1;
    LCon2.BoundaryUpper := Double.PositiveInfinity;
    // Задаем третий коэффициент линейного ограничения
    LinC3[0] := 1; LinC3[1] := -1; LinC3[2] := 1;
    LCon3 := QP.LinearConstraints.Add();
    LCon3.Value := LinC3;
    // Задаем границы третьего коэффициента линейного ограничения
    LCon3.BoundaryLower := 0;
    LCon3.BoundaryUpper := 0;
    // Выполняем расчёт и выводим результаты
    Res := QP.Execute();
    If res = 0 Then
        System.Diagnostics.Debug.WriteLine("== Значение целевой функции ==");
        System.Diagnostics.Debug.WriteLine(QP.OptimalFunctionValue.ToString());
        System.Diagnostics.Debug.WriteLine("== Решение ==");
        For i := 0 To QP.Solution.Length - 1 Do
            System.Diagnostics.Debug.WriteLine(i.ToString() + ": " + QP.Solution.GetValue(i).ToString());
        End For;
    End If;
End Sub;

См. также

ISmQuadraticProgramming