ISmQuadraticProgramming.ExtraSettings

Синтаксис

ExtraSettings: IQPExtraSettings;

ExtraSettings: Prognoz.Platform.Interop.Stat.IQPExtraSettings;

Описание

Свойство ExtraSettings возвращает дополнительные настройки, используемые при расчёте с помощью внешнего модуля решений Gurobi.

Комментарии

Свойство актуально, если в свойстве SolverType выбран модуль решений Gurobi.

Пример

Для выполнения примера на компьютере пользователя должен быть установлен внешний модуль решений Gurobi.

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

Sub UserProc;
Var
    QP: SmQuadraticProgramming;
    i, j, Res, N: Integer;
    Time: Double;
    CF, Lb, Ub, Init, LinC1, H: Array 
Of Double;
    Bound: ISlBoundaryRegion;
    LCon1: ISlLinearConstraint;
Begin
    QP := New SmQuadraticProgramming.Create;
    N := 
8;
    CF := 
New Double[N];
    Lb := 
New Double[N];
    Ub := 
New Double[N];
    LinC1 := 
New Double[N];
    Init := 
New Double[N];
    
// Область определения
    Lb[0] := -1; Ub[0] := 1;
    Lb[
1] := -2.1;  Ub[1] := 2;
    Lb[
2] := -3.2;  Ub[2] := 3;
    Lb[
3] := -4.3;  Ub[3] := 4;
    Lb[
4] := -5.4;  Ub[4] := 5;
    Lb[
5] := -6.5;  Ub[5] := 6;
    Lb[
6] := -7.6;  Ub[6] := 7;
    Lb[
7] := -8.7;  Ub[7] := 8;
    
// Начальные приближения
    Init[0] := -1;
    Init[
1] := -2;
    Init[
2] := -3;
    Init[
3] := -4;
    Init[
4] := -5;
    Init[
5] := -6;
    Init[
6] := -7;
    Init[
7] := -8;
    QP.InitialApproximation.AutoCreate := 
False;
    QP.InitialApproximation.InitValues := Init;
    
//Целевая функция
    CF[0] := 7;
    CF[
1] := 6;
    CF[
2] := 5;
    CF[
3] := 4;
    CF[
4] := 3;
    CF[
5] := 2;
    CF[
6] := 1;
    CF[
7] := 0;
    H := 
New Double[N, N];
    H[
0, 0] := 1.69; H[0, 1] := 1.00; H[0, 2] := 2.00; H[0, 3] := 3.00; H[0, 4] := 4.00; H[0, 5] := 5.00; H[0, 6] := 6.00; H[0, 7] := 7.00;
    H[
1, 0] := 1.00; H[1, 1] := 1.69; H[1, 2] := 1.00; H[1, 3] := 2.00; H[1, 4] := 3.00; H[1, 5] := 4.00; H[1, 6] := 5.00; H[1, 7] := 6.00;
    H[
2, 0] := 2.00; H[2, 1] := 1.00; H[2, 2] := 1.69; H[2, 3] := 1.00; H[2, 4] := 2.00; H[2, 5] := 3.00; H[2, 6] := 4.00; H[2, 7] := 5.00;
    H[
3, 0] := 3.00; H[3, 1] := 2.00; H[3, 2] := 1.00; H[3, 3] := 1.69; H[3, 4] := 1.00; H[3, 5] := 2.00; H[3, 6] := 3.00; H[3, 7] := 4.00;
    H[
4, 0] := 4.00; H[4, 1] := 3.00; H[4, 2] := 2.00; H[4, 3] := 1.00; H[4, 4] := 1.69; H[4, 5] := 1.00; H[4, 6] := 2.00; H[4, 7] := 3.00;
    H[
5, 0] := 5.00; H[5, 1] := 4.00; H[5, 2] := 3.00; H[5, 3] := 2.00; H[5, 4] := 1.00; H[5, 5] := 1.69; H[5, 6] := 1.00; H[5, 7] := 2.00;
    H[
6, 0] := 6.00; H[6, 1] := 5.00; H[6, 2] := 4.00; H[6, 3] := 3.00; H[6, 4] := 2.00; H[6, 5] := 1.00; H[6, 6] := 1.69; H[6, 7] := 1.00;
    H[
7, 0] := 7.00; H[7, 1] := 6.00; H[7, 2] := 5.00; H[7, 3] := 4.00; H[7, 4] := 3.00; H[7, 5] := 2.00; H[7, 6] := 1.00; H[7, 7] := 1.69;
    
For i := 0 To N - 1 Do
        
For j := 0 To N - 1 Do
            
If i <> j Then
                H[i, j] := 
0;
                H[j, i] := 
0;
            
End If;
        
End For;
    
End For;
    
//Целевая функция
    QP.CriterionFunction := CF;
    QP.QuadraticForm := H;
    Bound := QP.Boundary;
    Bound.BoundaryLower := Lb; 
//Нижняя граница области     
    Bound.BoundaryUpper := Ub; //Верхняя граница области
    LCon1 := QP.LinearConstraints.Add;
    LinC1[
0] := -1; LinC1[1] := 1;
    LCon1.Value := LinC1; 
// Коэф. линейного ограничения
    LCon1.BoundaryLower := -1.00; // Линейное ограничение снизу
    LCon1.BoundaryUpper := Double.PositiveInfinity; //Линейное ограничение сверху
    LinC1[0] := 0; LinC1[1] := 0;
    LCon1 := QP.LinearConstraints.Add;
    LinC1[
1] := -1; LinC1[2] := 1;
    LCon1.Value := LinC1; 
// Коэф. линейного ограничения
    LCon1.BoundaryLower := -1.05; // Линейное ограничение снизу
    LCon1.BoundaryUpper := Double.PositiveInfinity; // Линейное ограничение сверху
    LinC1[1] := 0; LinC1[2] := 0;
    LCon1 := QP.LinearConstraints.Add;
    LinC1[
2] := -1; LinC1[3] := 1;
    LCon1.Value := LinC1; 
// Коэф. линейного ограничения
    LCon1.BoundaryLower := -1.10; // Линейное ограничение снизу
    LCon1.BoundaryUpper := Double.PositiveInfinity; // Линейное ограничение сверху
    LinC1[2] := 0; LinC1[3] := 0;
    LCon1 := QP.LinearConstraints.Add;
    LinC1[
3] := -1; LinC1[4] := 1;
    LCon1.Value := LinC1; 
// Коэф. линейного ограничения
    LCon1.BoundaryLower := -1.15; // Линейное ограничение снизу
    LCon1.BoundaryUpper := Double.PositiveInfinity; // Линейное ограничение сверху
    LinC1[3] := 0; LinC1[4] := 0;
    LCon1 := QP.LinearConstraints.Add;
    LinC1[
4] := -1; LinC1[5] := 1;
    LCon1.Value := LinC1; 
// Коэф. линейного ограничения
    LCon1.BoundaryLower := -1.2; // Линейное ограничение снизу
    LCon1.BoundaryUpper := Double.PositiveInfinity; // Линейное ограничение сверху
    LinC1[4] := 0; LinC1[5] := 0;
    LCon1 := QP.LinearConstraints.Add;
    LinC1[
5] := -1; LinC1[6] := 1;
    LCon1.Value := LinC1; 
// Коэф. линейного ограничения
    LCon1.BoundaryLower := -1.25; // Линейное ограничение снизу
    LCon1.BoundaryUpper := Double.PositiveInfinity; // Линейное ограничение сверху
    LinC1[5] := 0; LinC1[6] := 0;
    LCon1 := QP.LinearConstraints.Add;
    LinC1[
6] := -1; LinC1[7] := 1;
    LCon1.Value := LinC1; 
// Коэф. линейного ограничения
    LCon1.BoundaryLower := -1.30; // Линейное ограничение снизу
    LCon1.BoundaryUpper := Double.PositiveInfinity; // Линейное ограничение сверху
    LinC1[6] := 0; LinC1[7] := 0;
    
// Использовать Gurobi
    QP.SolverType := QPSolverType.Grb;
    QP.ExtraSettings.DLLPath := 
"c:\gurobi752\win64\bin\gurobi75.dll";
    QP.ExtraSettings.SaveLogToFilePath := 
"c:\Files\Gurobi.log";
    QP.ExtraSettings.SaveModelToFilePath := 
"c:\Files\Model.mps";
    
// Выполняем расчёт
    Res := QP.Execute;
    Time := QP.PerformanceTime / 
1000;
    Debug.WriteLine(
"Time[sec] = " + time.ToString);
    Debug.WriteLine(
"RES = " + Res.ToString);
    Debug.WriteLine(QP.Errors);
    Debug.WriteLine(
"Gurobi error code = " + QP.ExtraSettings.nErrorCode.ToString);
    Debug.WriteLine(
"Gurobi message = " + QP.ExtraSettings.MessageString);
    
If Res = 0 Then
        Debug.WriteLine(
"== Значение целевой функции ==");
        Debug.WriteLine(QP.OptimalFunctionValue.ToString);
        Debug.WriteLine(
"== Решение ==");
        Debug.Indent;
        
For i := 0 To QP.Solution.Length - 1 Do
            Debug.WriteLine(i.ToString + 
": " + lb[i].ToString + " <= " + QP.Solution[i].ToString + " <= " + ub[i].ToString);
        
End For;
        Debug.Unindent;
        Debug.WriteLine(
"== Линейные ограничения ==");
        Debug.Indent;
        
For i := 0 To QP.LinearConstraints.Count - 1 Do
            LCon1 := QP.LinearConstraints.Item(i);
            Debug.WriteLine(i.ToString + 
": " + LCon1.BoundaryLower.ToString + " <= " + LCon1.Result.ToString + " <= " + LCon1.BoundaryUpper.ToString);
        
End For;
        Debug.Unindent;
    
End If;
End Sub UserProc;

Imports Prognoz.Platform.Interop.Stat;

Sub UserProc();
Var
    QP: SmQuadraticProgramming = 
New SmQuadraticProgramming();
    i, j, Res, N: Integer;
    Time: Double;
    CF, Lb, Ub, Init, LinC1: Array 
Of Double;
    H: Array[
8, 8] Of Double;
    Sol: Array;
    Bound: ISlBoundaryRegion;
    LCon1: ISlLinearConstraint;
Begin
    N := 
8;
    CF := 
New Double[N];
    Lb := 
New Double[N];
    Ub := 
New Double[N];
    LinC1 := 
New Double[N];
    Init := 
New Double[N];
    
// Область определения
    Lb[0] := -1; Ub[0] := 1;
    Lb[
1] := -2.1;  Ub[1] := 2;
    Lb[
2] := -3.2;  Ub[2] := 3;
    Lb[
3] := -4.3;  Ub[3] := 4;
    Lb[
4] := -5.4;  Ub[4] := 5;
    Lb[
5] := -6.5;  Ub[5] := 6;
    Lb[
6] := -7.6;  Ub[6] := 7;
    Lb[
7] := -8.7;  Ub[7] := 8;
    
// Начальные приближения
    Init[0] := -1;
    Init[
1] := -2;
    Init[
2] := -3;
    Init[
3] := -4;
    Init[
4] := -5;
    Init[
5] := -6;
    Init[
6] := -7;
    Init[
7] := -8;
    QP.InitialApproximation.AutoCreate := 
False;
    QP.InitialApproximation.InitValues := Init;
    
//Целевая функция
    CF[0] := 7;
    CF[
1] := 6;
    CF[
2] := 5;
    CF[
3] := 4;
    CF[
4] := 3;
    CF[
5] := 2;
    CF[
6] := 1;
    CF[
7] := 0;
    H := 
New Double[N, N];
    H[
0, 0] := 1.69; H[0, 1] := 1.00; H[0, 2] := 2.00; H[0, 3] := 3.00; H[0, 4] := 4.00; H[0, 5] := 5.00; H[0, 6] := 6.00; H[0, 7] := 7.00;
    H[
1, 0] := 1.00; H[1, 1] := 1.69; H[1, 2] := 1.00; H[1, 3] := 2.00; H[1, 4] := 3.00; H[1, 5] := 4.00; H[1, 6] := 5.00; H[1, 7] := 6.00;
    H[
2, 0] := 2.00; H[2, 1] := 1.00; H[2, 2] := 1.69; H[2, 3] := 1.00; H[2, 4] := 2.00; H[2, 5] := 3.00; H[2, 6] := 4.00; H[2, 7] := 5.00;
    H[
3, 0] := 3.00; H[3, 1] := 2.00; H[3, 2] := 1.00; H[3, 3] := 1.69; H[3, 4] := 1.00; H[3, 5] := 2.00; H[3, 6] := 3.00; H[3, 7] := 4.00;
    H[
4, 0] := 4.00; H[4, 1] := 3.00; H[4, 2] := 2.00; H[4, 3] := 1.00; H[4, 4] := 1.69; H[4, 5] := 1.00; H[4, 6] := 2.00; H[4, 7] := 3.00;
    H[
5, 0] := 5.00; H[5, 1] := 4.00; H[5, 2] := 3.00; H[5, 3] := 2.00; H[5, 4] := 1.00; H[5, 5] := 1.69; H[5, 6] := 1.00; H[5, 7] := 2.00;
    H[
6, 0] := 6.00; H[6, 1] := 5.00; H[6, 2] := 4.00; H[6, 3] := 3.00; H[6, 4] := 2.00; H[6, 5] := 1.00; H[6, 6] := 1.69; H[6, 7] := 1.00;
    H[
7, 0] := 7.00; H[7, 1] := 6.00; H[7, 2] := 5.00; H[7, 3] := 4.00; H[7, 4] := 3.00; H[7, 5] := 2.00; H[7, 6] := 1.00; H[7, 7] := 1.69;
    
For i := 0 To N - 1 Do
        
For j := 0 To N - 1 Do
            
If i <> j Then
                H[i, j] := 
0;
                H[j, i] := 
0;
            
End If;
        
End For;
    
End For;
    
//Целевая функция
    QP.CriterionFunction := CF;
    QP.QuadraticForm := H;
    Bound := QP.Boundary;
    Bound.BoundaryLower := Lb; 
//Нижняя граница области     
    Bound.BoundaryUpper := Ub; //Верхняя граница области
    LCon1 := QP.LinearConstraints.Add();
    LinC1[
0] := -1; LinC1[1] := 1;
    LCon1.Value := LinC1; 
// Коэф. линейного ограничения
    LCon1.BoundaryLower := -1.00; // Линейное ограничение снизу
    LCon1.BoundaryUpper := Double.PositiveInfinity; //Линейное ограничение сверху
    LinC1[0] := 0; LinC1[1] := 0;
    LCon1 := QP.LinearConstraints.Add();
    LinC1[
1] := -1; LinC1[2] := 1;
    LCon1.Value := LinC1; 
// Коэф. линейного ограничения
    LCon1.BoundaryLower := -1.05; // Линейное ограничение снизу
    LCon1.BoundaryUpper := Double.PositiveInfinity; // Линейное ограничение сверху
    LinC1[1] := 0; LinC1[2] := 0;
    LCon1 := QP.LinearConstraints.Add();
    LinC1[
2] := -1; LinC1[3] := 1;
    LCon1.Value := LinC1; 
// Коэф. линейного ограничения
    LCon1.BoundaryLower := -1.10; // Линейное ограничение снизу
    LCon1.BoundaryUpper := Double.PositiveInfinity; // Линейное ограничение сверху
    LinC1[2] := 0; LinC1[3] := 0;
    LCon1 := QP.LinearConstraints.Add();
    LinC1[
3] := -1; LinC1[4] := 1;
    LCon1.Value := LinC1; 
// Коэф. линейного ограничения
    LCon1.BoundaryLower := -1.15; // Линейное ограничение снизу
    LCon1.BoundaryUpper := Double.PositiveInfinity; // Линейное ограничение сверху
    LinC1[3] := 0; LinC1[4] := 0;
    LCon1 := QP.LinearConstraints.Add();
    LinC1[
4] := -1; LinC1[5] := 1;
    LCon1.Value := LinC1; 
// Коэф. линейного ограничения
    LCon1.BoundaryLower := -1.2; // Линейное ограничение снизу
    LCon1.BoundaryUpper := Double.PositiveInfinity; // Линейное ограничение сверху
    LinC1[4] := 0; LinC1[5] := 0;
    LCon1 := QP.LinearConstraints.Add();
    LinC1[
5] := -1; LinC1[6] := 1;
    LCon1.Value := LinC1; 
// Коэф. линейного ограничения
    LCon1.BoundaryLower := -1.25; // Линейное ограничение снизу
    LCon1.BoundaryUpper := Double.PositiveInfinity; // Линейное ограничение сверху
    LinC1[5] := 0; LinC1[6] := 0;
    LCon1 := QP.LinearConstraints.Add();
    LinC1[
6] := -1; LinC1[7] := 1;
    LCon1.Value := LinC1; 
// Коэф. линейного ограничения
    LCon1.BoundaryLower := -1.30; // Линейное ограничение снизу
    LCon1.BoundaryUpper := Double.PositiveInfinity; // Линейное ограничение сверху
    LinC1[6] := 0; LinC1[7] := 0;
    
// Использовать Gurobi
    QP.SolverType := QPSolverType.qpstGrb;
    QP.ExtraSettings.DLLPath := 
"c:\gurobi752\win64\bin\gurobi75.dll";
    QP.ExtraSettings.SaveLogToFilePath := 
"c:\Files\Gurobi.log";
    QP.ExtraSettings.SaveModelToFilePath := 
"c:\Files\Model.mps";
    
// Выполняем расчёт
    Res := QP.Execute();
    Time := QP.PerformanceTime / 
1000;
    System.Diagnostics.Debug.WriteLine(
"Time[sec] = " + Time.ToString());
    System.Diagnostics.Debug.WriteLine(
"RES = " + Res.ToString());
    System.Diagnostics.Debug.WriteLine(QP.Errors);
    System.Diagnostics.Debug.WriteLine(
"Gurobi error code = " + QP.ExtraSettings.nErrorCode.ToString());
    System.Diagnostics.Debug.WriteLine(
"Gurobi message = " + QP.ExtraSettings.MessageString);
    
If Res = 0 Then
        System.Diagnostics.Debug.WriteLine(
"== Значение целевой функции ==");
        System.Diagnostics.Debug.WriteLine(QP.OptimalFunctionValue.ToString());
        System.Diagnostics.Debug.WriteLine(
"== Решение ==");
        System.Diagnostics.Debug.Indent();
        Sol := QP.Solution;
        
For i := 0 To Sol.Length - 1 Do
            System.Diagnostics.Debug.WriteLine(i.ToString() + 
": " + lb[i].ToString() + " <= " + Sol[i].ToString() + " <= " + ub[i].ToString());
        
End For;
        System.Diagnostics.Debug.Unindent();
        System.Diagnostics.Debug.WriteLine(
"== Линейные ограничения ==");
        System.Diagnostics.Debug.Indent();
        
For i := 0 To QP.LinearConstraints.Count - 1 Do
            LCon1 := QP.LinearConstraints.Item[i];
            System.Diagnostics.Debug.WriteLine(i.ToString() + 
": " + LCon1.BoundaryLower.ToString() + " <= " + LCon1.Result.ToString() + " <= " + LCon1.BoundaryUpper.ToString());
        
End For;
        System.Diagnostics.Debug.Unindent();
    
End If;
End Sub;

При выполнении примера будет произведён расчёт задачи квадратичного программирования с помощью внешнего модуля решений Gurobi. В консоль среды разработки будут выведены:

Отчёт о расчёте и модель будут сохранены в указанные файлы.

См. также:

ISmQuadraticProgramming