LowerConstraintStatus: 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;
В результате выполнения примера в окно консоли будут выведены результаты расчета ограничений целевой задачи.
Связанные записи