CriterionFunction: Array;
CriterionFunction: System.Array;
Свойство CriterionFunction определяет линейную часть целевой функции.
Индексация массива коэффициентов целевой функции должна начинаться с нуля.
Квадратичная часть целевой функции определяется свойством ISmQuadraticProgramming.QuadraticForm.
В примере задаются параметры и выполняется расчёт задачи квадратичного программирования.
Для выполнения примера добавьте ссылку на системную сборку «Stat».
Sub UserProc;
Var
QP: SmQuadraticProgramming;
i, Res: Integer;
CF, Lb, Ub, LinC1, LinC2, LinC3, init: Array[3] Of Double;
H: Array[3, 3] Of 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[0, 0] := -2; H[0, 1] := 2; H[0, 2] := 0;
H[1, 0] := 2; H[1, 1] := -2; H[1, 2] := 0;
H[2, 0] := 0; H[2, 1] := 0; H[2, 2] := -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; LinC2[0] := 2; LinC3[0] := 1;
LCon1 := QP.LinearConstraints.Add;
LCon1.Value := LinC1;
// Коэффициент линейного ограничения
LCon1.BoundaryLower := 1;
// линейное ограничение снизу
LCon1.BoundaryUpper := Double.PositiveInfinity; //линейное ограничение
сверху
LinC1[1] := 1; LinC2[1] := 1; LinC3[1] := -1;
LCon2 := QP.LinearConstraints.Add;
LCon2.Value := LinC2;
// Коэффициент линейного ограничения
LCon2.BoundaryLower := -1; // линейное ограничение
снизу
LCon2.BoundaryUpper := Double.PositiveInfinity; //линейное ограничение
сверху
LinC1[2] := 1; LinC2[2] := -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;
Результаты расчёта задачи квадратичного программирования выводятся в окно консоли:
== Значение целевой функции ==
2.2204460492503131E-016
== Решение ==
0: 0.99999999999999978
1: 0
2: -4.9303806576313227E-032
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.
Imports Prognoz.Platform.Interop.Stat;
…
Public Shared Sub UserProc();
Var
QP: SmQuadraticProgramming;
i, Res: Integer;
CF, Lb, Ub, LinC1, LinC2, LinC3, init: Array[3] Of Double;
H: Array[3, 3] Of 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[0, 0] := -2; H[0, 1] := 2; H[0, 2] := 0;
H[1, 0] := 2; H[1, 1] := -2; H[1, 2] := 0;
H[2, 0] := 0; H[2, 1] := 0; H[2, 2] := -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; LinC2[0] := 2; LinC3[0] := 1;
LCon1 := QP.LinearConstraints.Add();
LCon1.Value := LinC1; // Коэффициент
линейного ограничения
LCon1.BoundaryLower := 1; // линейное ограничение
снизу
LCon1.BoundaryUpper := Double.PositiveInfinity; //линейное ограничение
сверху
LinC1[1] := 1; LinC2[1] := 1; LinC3[1] := -1;
LCon2 := QP.LinearConstraints.Add();
LCon2.Value := LinC2; // Коэффициент
линейного ограничения
LCon2.BoundaryLower := -1; // линейное ограничение
снизу
LCon2.BoundaryUpper := Double.PositiveInfinity; //линейное ограничение
сверху
LinC1[2] := 1; LinC2[2] := -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 UserProc;
См. также
Код примерa