ISmQuadraticProgramming.ExtraSettings

Синтаксис

ExtraSettings: 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[
00] := 1.69; H[01] := 1.00; H[02] := 2.00; H[03] := 3.00; H[04] := 4.00; H[05] := 5.00; H[06] := 6.00; H[07] := 7.00;
    H[
10] := 1.00; H[11] := 1.69; H[12] := 1.00; H[13] := 2.00; H[14] := 3.00; H[15] := 4.00; H[16] := 5.00; H[17] := 6.00;
    H[
20] := 2.00; H[21] := 1.00; H[22] := 1.69; H[23] := 1.00; H[24] := 2.00; H[25] := 3.00; H[26] := 4.00; H[27] := 5.00;
    H[
30] := 3.00; H[31] := 2.00; H[32] := 1.00; H[33] := 1.69; H[34] := 1.00; H[35] := 2.00; H[36] := 3.00; H[37] := 4.00;
    H[
40] := 4.00; H[41] := 3.00; H[42] := 2.00; H[43] := 1.00; H[44] := 1.69; H[45] := 1.00; H[46] := 2.00; H[47] := 3.00;
    H[
50] := 5.00; H[51] := 4.00; H[52] := 3.00; H[53] := 2.00; H[54] := 1.00; H[55] := 1.69; H[56] := 1.00; H[57] := 2.00;
    H[
60] := 6.00; H[61] := 5.00; H[62] := 4.00; H[63] := 3.00; H[64] := 2.00; H[65] := 1.00; H[66] := 1.69; H[67] := 1.00;
    H[
70] := 7.00; H[71] := 6.00; H[72] := 5.00; H[73] := 4.00; H[74] := 3.00; H[75] := 2.00; H[76] := 1.00; H[77] := 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;

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

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

См. также:

ISmQuadraticProgramming