LowerConstraintStatus: TargetConstraintStatusType;
LowerConstraintStatus: Prognoz.Platform.Interop.Cp.TargetConstraintStatusType;
Свойство LowerConstraintStatus возвращает состояние нижней границы ограничения.
Значение доступно после расчета целевой задачи. Для получения состояния верхней границы ограничения используйте свойство IMsTargetConstraintCommon.UpperBoundFixed.
Для выполнения примера в репозитории предполагается наличие контейнера моделирования с идентификатором «MS», содержащего настроенную целевую задачу с идентификатором «TARGETPROBLEM».
Добавьте ссылки на системные сборки: Cp, Metabase, Ms.
Sub
UserProc;
Var
mb: IMetabase;
MsObj: IMetabaseObject;
Ms: IMsModelSpace;
Problem: IMsProblem;
TargetProblem: IMsTargetProblem;
i, j: Integer;
CalcSettings: IMsProblemCalculationSettings;
Calc: IMsProblemCalculation;
targetConstraints: IMsTargetConstraints;
targetConstr: IMsTargetConstraint;
targetConstrArray: IMsTargetConstraintInfoArray;
targetConstrInfo: IMsTargetConstraintInfo;
controlVariables: IMsFormulaTermList;
controlTerm: IMsTargetFormulaTerm;
varConstraints: IMsTargetVarConstraints;
varConstr: IMsTargetVarConstraint;
Begin
// Получаем текущий репозиторий
mb := MetabaseClass.Active;
// Получаем контейнер моделирования
MsObj := mb.ItemById("MS").Bind;
Ms := MsObj As IMsModelSpace;
// Получаем целевую задачу
Problem := mb.ItemByIdNamespace("TARGETPROBLEM",
MsObj.Key).Bind As IMsProblem;
TargetProblem := Problem.AdditionalDetails.Item(0) As IMsTargetProblem;
// Создаем настройки расчета
задачи
CalcSettings := Problem.CreateCalculationSettings;
// Создаем объект для расчета
задачи
Calc := Problem.Calculate(CalcSettings);
// Выполняем расчет
Calc.Run;
// Получаем рассчитанную
задачу и выводим результаты в окно консоли
TargetProblem := (Problem.AdditionalDetails.Item(0) As IMsTargetProblem);
// Получаем ограничения целевой
функции
targetConstraints := targetProblem.Constraints;
// Перебираем все ограничения
целевой функции
For i := 0 To targetConstraints.Count
- 1 Do
targetConstr := targetConstraints.Item(i);
Debug.WriteLine("Ограничение
целевой функции: " + (i + 1).ToString);
//
Получаем значения ограничения целевой функции и выводим их в окно консоли
targetConstrArray
:= targetConstr.ConstraintInfoArray;
Debug.Indent;
Debug.WriteLine("Значение,
отвечающее оптимальному решению");
Debug.Indent;
For
j := 0 To targetConstrArray.Count
- 1 Do
targetConstrInfo
:= targetConstrArray.Item(j);
Debug.WriteLine(targetConstrInfo.OptimalValue);
End
For;
Debug.Unindent;
Debug.WriteLine("Значения
нижней границы; Статус");
Debug.Indent;
For
j := 0 To targetConstrArray.Count
- 1 Do
targetConstrInfo
:= targetConstrArray.Item(j);
Debug.Write(targetConstrInfo.LowerBound.ToString
+ "; " + #9);
Debug.WriteLine(StatusToStr(targetConstrInfo.LowerConstraintStatus));
End
For;
Debug.Unindent;
Debug.WriteLine("Значения
множителя Лагранжа для нижней границы");
Debug.Indent;
For
j := 0 To targetConstrArray.Count
- 1 Do
targetConstrInfo
:= targetConstrArray.Item(j);
Debug.WriteLine(targetConstrInfo.LowerBoundLagrangeMultiplier);
End
For;
Debug.Unindent;
Debug.WriteLine("Значения
верхней границы; Статус");
Debug.Indent;
For
j := 0 To targetConstrArray.Count
- 1 Do
targetConstrInfo
:= targetConstrArray.Item(j);
Debug.Write(targetConstrInfo.UpperBound.ToString
+ "; " + #9);
Debug.WriteLine(StatusToStr(targetConstrInfo.UpperConstraintStatus));
End
For;
Debug.Unindent;
Debug.WriteLine("Значения
множителя Лагранжа для верхней границы");
Debug.Indent;
For
j := 0 To targetConstrArray.Count
- 1 Do
targetConstrInfo
:= targetConstrArray.Item(j);
Debug.WriteLine(targetConstrInfo.UpperBoundLagrangeMultiplier);
End
For;
Debug.Unindent;
Debug.Unindent;
End For;
// Получаем управляющие переменные
controlVariables := TargetProblem.ControlVariables;
// Перебираем управляющие
переменные
For i := 0 To controlVariables.Count
- 1 Do
controlTerm := controlVariables.Item(i)
As IMsTargetFormulaTerm;
Debug.WriteLine("Управляющая
переменная: " + controlTerm.TermToText);
Debug.Indent;
//
Получаем ограничения управляющей переменной и выводим их в окно консоли
varConstraints :=
controlTerm.VarConstraints;
Debug.WriteLine("Значения
нижней границы; Статус");
Debug.Indent;
For
j := 0 To varConstraints.Count
- 1 do
varConstr
:= varConstraints.Item(j);
Debug.Write(varConstr.LowerBound.ToString
+ "; " + #9);
Debug.WriteLine(StatusToStr(varConstr.LowerConstraintStatus));
End
For;
Debug.Unindent;
Debug.WriteLine("Значения
верхней границы; Статус");
Debug.Indent;
For
j := 0 To varConstraints.Count
- 1 do
varConstr
:= varConstraints.Item(j);
Debug.Write(varConstr.UpperBound.ToString
+ "; " + #9);
Debug.WriteLine(StatusToStr(varConstr.UpperConstraintStatus));
End
For;
Debug.Unindent;
Debug.Unindent;
End For;
End Sub UserProc;
// Функция для вывода статуса
Function StatusToStr(Status: TargetConstraintStatusType):
String;
Var
s: String;
Begin
Select Case
Status
Case
TargetConstraintStatusType.Disabled: s := "Снято";
Case
TargetConstraintStatusType.NotReached: s := "Не
достигнуто";
Case
TargetConstraintStatusType.Reached: s := "Достигнуто";
End Select;
Return s;
End Function
StatusToStr;
В результате выполнения примера в окно консоли будут выведены результаты расчета ограничений целевой задачи.
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.
Imports
Prognoz.Platform.Interop.Cp;
Imports Prognoz.Platform.Interop.Ms;
…
Public Shared
Sub Main(Params: StartParams);
Var
mb: IMetabase;
MsObj: IMetabaseObject;
Ms: IMsModelSpace;
Problem: IMsProblem;
TargetProblem: IMsTargetProblem;
i, j: Integer;
CalcSettings: IMsProblemCalculationSettings;
Calc: IMsProblemCalculation;
targetConstraints: IMsTargetConstraints;
targetConstr: IMsTargetConstraint;
targetConstrArray: IMsTargetConstraintInfoArray;
targetConstrInfo: IMsTargetConstraintInfo;
controlVariables: IMsFormulaTermList;
controlTerm: IMsTargetFormulaTerm;
varConstraints: IMsTargetVarConstraints;
varConstr: IMsTargetVarConstraint;
Begin
// Получаем текущий репозиторий
mb := Params.Metabase;
// Получаем контейнер моделирования
MsObj := mb.ItemById["MS"].Bind();
Ms := MsObj As IMsModelSpace;
// Получаем целевую задачу
Problem := mb.ItemByIdNamespace["TARGETPROBLEM",
MsObj.Key].Bind() As IMsProblem;
TargetProblem := Problem.AdditionalDetails.Item[0] As IMsTargetProblem;
// Создаем настройки расчета
задачи
CalcSettings := Problem.CreateCalculationSettings();
// Создаем объект для расчета
задачи
Calc := Problem.Calculate(CalcSettings);
// Выполняем расчет
Calc.Run();
// Получаем рассчитанную
задачу и выводим результаты в окно консоли
TargetProblem := (Problem.AdditionalDetails.Item[0] As IMsTargetProblem);
// Получаем ограничения целевой
функции
targetConstraints := targetProblem.Constraints;
// Перебираем все ограничения
целевой функции
For i := 0 To targetConstraints.Count
- 1 Do
targetConstr := targetConstraints.Item[i];
System.Diagnostics.Debug.WriteLine("Ограничение целевой функции: " +
(i + 1).ToString());
//
Получаем значения ограничения целевой функции и выводим их в окно консоли
targetConstrArray
:= targetConstr.ConstraintInfoArray;
System.Diagnostics.Debug.Indent();
System.Diagnostics.Debug.WriteLine("Значение, отвечающее оптимальному решению");
System.Diagnostics.Debug.Indent();
For
j := 0 To targetConstrArray.Count
- 1 Do
targetConstrInfo
:= targetConstrArray.Item[j];
System.Diagnostics.Debug.WriteLine(targetConstrInfo.OptimalValue);
End
For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Значения нижней границы; Статус");
System.Diagnostics.Debug.Indent();
For
j := 0 To targetConstrArray.Count
- 1 Do
targetConstrInfo
:= targetConstrArray.Item[j];
System.Diagnostics.Debug.Write(targetConstrInfo.LowerBound.ToString()
+ "; " + char.ConvertFromUtf32(9));
System.Diagnostics.Debug.WriteLine(StatusToStr(targetConstrInfo.LowerConstraintStatus));
End
For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Значения множителя Лагранжа для нижней границы");
System.Diagnostics.Debug.Indent();
For
j := 0 To targetConstrArray.Count
- 1 Do
targetConstrInfo
:= targetConstrArray.Item[j];
System.Diagnostics.Debug.WriteLine(targetConstrInfo.LowerBoundLagrangeMultiplier);
End
For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Значения верхней границы; Статус");
System.Diagnostics.Debug.Indent();
For
j := 0 To targetConstrArray.Count
- 1 Do
targetConstrInfo
:= targetConstrArray.Item[j];
System.Diagnostics.Debug.Write(targetConstrInfo.UpperBound.ToString()
+ "; " + char.ConvertFromUtf32(9));
System.Diagnostics.Debug.WriteLine(StatusToStr(targetConstrInfo.UpperConstraintStatus));
End
For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Значения множителя Лагранжа для верхней границы");
System.Diagnostics.Debug.Indent();
For
j := 0 To targetConstrArray.Count
- 1 Do
targetConstrInfo
:= targetConstrArray.Item[j];
System.Diagnostics.Debug.WriteLine(targetConstrInfo.UpperBoundLagrangeMultiplier);
End
For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.Unindent();
End For;
// Получаем управляющие переменные
controlVariables := TargetProblem.ControlVariables;
// Перебираем управляющие
переменные
For i := 0 To controlVariables.Count
- 1 Do
controlTerm := controlVariables.Item[i]
As IMsTargetFormulaTerm;
System.Diagnostics.Debug.WriteLine("Управляющая переменная: " + controlTerm.TermToText());
System.Diagnostics.Debug.Indent();
//
Получаем ограничения управляющей переменной и выводим их в окно консоли
varConstraints :=
controlTerm.VarConstraints;
System.Diagnostics.Debug.WriteLine("Значения нижней границы; Статус");
System.Diagnostics.Debug.Indent();
For
j := 0 To varConstraints.Count
- 1 do
varConstr
:= varConstraints.Item[j];
System.Diagnostics.Debug.Write(varConstr.LowerBound.ToString()
+ "; " + char.ConvertFromUtf32(9));
System.Diagnostics.Debug.WriteLine(StatusToStr(varConstr.LowerConstraintStatus));
End
For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Значения верхней границы; Статус");
System.Diagnostics.Debug.Indent();
For
j := 0 To varConstraints.Count
- 1 Do
varConstr
:= varConstraints.Item[j];
System.Diagnostics.Debug.Write(varConstr.UpperBound.ToString()
+ "; " + char.ConvertFromUtf32(9));
System.Diagnostics.Debug.WriteLine(StatusToStr(varConstr.UpperConstraintStatus));
End
For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.Unindent();
End For;
End Sub;
// Функция для вывода статуса
Public Shared
Function StatusToStr(Status: TargetConstraintStatusType):
String;
Var
s: String;
Begin
Select Case
Status
Case
TargetConstraintStatusType.tcstDisabled: s := "Снято";
Case
TargetConstraintStatusType.tcstNotReached: s := "Не
достигнуто";
Case
TargetConstraintStatusType.tcstReached: s := "Достигнуто";
End Select;
Return s;
End Function
StatusToStr;