AddTargetProblem(TargetProblem: IMsTargetProblem;
Level:
DimCalendarLevel
):
IMsCalculationChainTarget;
AddTargetProblem(TargetProblem: Prognoz.Platform.Interop.Ms.IMsTargetProblem;
Level:
Prognoz.Platform.Interop.Dimensions.DimCalendarLevel
):
Prognoz.Platform.Interop.Ms.IMsCalculationChainTarget;
TargetProblem. Целевая задача, для которой добавляется целевая функция;
Level. Календарная динамика добавляемой целевой функции.
Метод AddTargetProblem добавляет целевую функцию в цепочку расчета метамодели.
Добавлять целевую функцию в цепочку расчета необходимо, если настраиваемая задача моделирования предназначена для работы в веб-приложении.
Если TargetProblem принимает значение Null, то целевая функция будет создана автоматически и добавлена в коллекцию дополнительных параметров задачи. Для задания параметров созданной целевой функции используйте свойство IMsCalculationChainTarget.TargetProblem.
После добавления целевой функции в цепочку расчета необходимо задать сценарий оптимизационной задачи.
Для выполнения примера в репозитории предполагается наличие контейнера моделирования с идентификатором «MS», содержащего задачу моделирования с идентификатором «CHAIN_TARGET_CONSTRANT». Данная задача должна быть предназначена для веб-приложения и содержать несколько сценариев.
Добавьте ссылки на системные сборки: Dimensions, Metabase, Ms.
Sub UserProc;
Var
mb: IMetabase;
MsObj: IMetabaseObjectDescriptor;
Ms: IMsModelSpace;
Problem: IMsProblem;
MetaModel: IMsMetaModel;
CalcChain: IMsCalculationChainEntries;
Transform: IMsFormulaTransform;
TransformVarables: IMsFormulaTransformVariables;
TransVar: IMsFormulaTransformVariable;
Slice: IMsFormulaTransformSlice;
Target: IMsTargetProblem;
AdditionalDetails: IMsProblemDetailsArray;
MetaTarget: IMsCalculationChainTarget;
OperandTerm: IMsFormulaTerm;
exVar: Boolean;
MetaVisual: IMsMetaModelVisualController;
VarOutp: IMsCalculationChainVariable;
VarEx: Boolean;
InVarKey, InModelKey: Integer;
InpKeys: Array[1] Of Integer;
SimpleModel: IMsModel;
Operands: IMsFormulaTermList;
Begin
// Получаем текущий репозиторий
mb := MetabaseClass.Active;
// Получаем контейнер моделирования
MsObj := mb.ItemById("MS");
Ms := MsObj.Bind As IMsModelSpace;
// Получаем задачу моделирования
Problem := mb.ItemByIdNamespace("CHAIN_TARGET_CONSTRANT", MsObj.Key).Edit As IMsProblem;
// Получаем цепочку расчёта и очищаем её
MetaModel := Problem.EditMetaModel;
CalcChain := MetaModel.CalculationChain;
CalcChain.Clear;
// Если необходимо, то создаем для метамодели внутреннюю БД временных рядов
MetaVisual := MetaModel.VisualController;
If Not MetaVisual.HasVariableRubricator Then
MetaVisual.HasVariableRubricator := True;
End If;
// Создаем внутреннюю переменную
VarOutp := MetaVisual.CreateVariable("Внутренняя переменная", "", DimCalendarLevel.Year, VarEx);
InpKeys[0] := VarOutp.Key;
// Создаем внутреннюю модель
SimpleModel := MetaVisual.CreateSimpleModel(-1, InpKeys, VarOutp.Key, MsFormulaKind.LinearRegression, "", InVarKey, InModelKey, -1, -1, True);
// Создаем целевую задачу
Target := New MsTargetProblem.Create;
// Устанавливаем параметры целевой задачи
AdditionalDetails := Problem.AdditionalDetails;
AdditionalDetails.Clear;
AdditionalDetails.AddDetails(Target, VarOutp.Slice);
// Задаем сценарий оптимизационной задачи
Target.OptimisticScenario := Problem.Scenarios.Item(0);
// Добавляем переменные целевой функции
Operands := Target.Operands;
Transform := SimpleModel.Transform;
TransformVarables := Transform.Outputs;
TransVar := TransformVarables.Item(0);
Slice := TransVar.Slices.Item(0);
OperandTerm := Operands.Add(Slice);
// Задаем целевую функцию
Target.CriterionFunction.AsString := OperandTerm.TermToInnerText;
// Добавляем целевую задачу в цепочку расчета
MetaTarget := CalcChain.AddTargetProblem(Target, DimCalendarLevel.Year);
// Задаем пользовательское имя целевой задачи
MetaTarget.UseCustomName := True;
MetaTarget.Name := "Новая целевая функция";
// Сохраняем изменения
(Problem As IMetabaseObject).Save;
End Sub UserProc;
В результате выполнения примера в задачу моделирования будет добавлена внутренняя модель и целевая функция.
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.Ms;
…
Public Shared Sub Main(Params: StartParams);
Var
mb: IMetabase;
MsObj: IMetabaseObjectDescriptor;
Ms: IMsModelSpace;
Problem: IMsProblem;
MetaModel: IMsMetaModel;
CalcChain: IMsCalculationChainEntries;
Transform: IMsFormulaTransform;
TransformVarables: IMsFormulaTransformVariables;
TransVar: IMsFormulaTransformVariable;
Slice: IMsFormulaTransformSlice;
Target: MsTargetProblem;
AdditionalDetails: IMsProblemDetailsArray;
MetaTarget: IMsCalculationChainTarget;
OperandTerm: IMsFormulaTerm;
exVar: Boolean;
MetaVisual: IMsMetaModelVisualController;
VarOutp: IMsCalculationChainVariable;
VarEx: Boolean;
InVarKey, InModelKey: Integer;
InpKeys: Array[1] Of integer;
SimpleModel: IMsModel;
Operands: IMsFormulaTermList;
Begin
// Получаем текущий репозиторий
mb := Params.Metabase;
// Получаем контейнер моделирования
MsObj := mb.ItemById["MS"];
Ms := MsObj.Bind() As IMsModelSpace;
// Получаем задачу моделирования
Problem := mb.ItemByIdNamespace["CHAIN_TARGET_CONSTRANT", MsObj.Key].Edit() As IMsProblem;
// Получаем цепочку расчёта и очищаем её
MetaModel := Problem.EditMetaModel;
CalcChain := MetaModel.CalculationChain;
CalcChain.Clear();
// Если необходимо, то создаем для метамодели внутреннюю БД временных рядов
MetaVisual := MetaModel.VisualController;
If Not MetaVisual.HasVariableRubricator Then
MetaVisual.HasVariableRubricator := True;
End If;
// Создаем внутреннюю переменную
VarOutp := MetaVisual.CreateVariable("Внутренняя переменная", "", DimCalendarLevel.dclYear,
Var VarEx, uinteger.maxValue, False);
InpKeys[0] := VarOutp.Key As integer;
// Создаем внутреннюю модель
SimpleModel := MetaVisual.CreateSimpleModel(-1, InpKeys, VarOutp.Key As integer, MsFormulaKind.mfkLinearRegression,
"" , Var InVarKey, Var InModelKey, uinteger.maxValue, uinteger.maxValue, True);
// Создаем целевую задачу
Target := New MsTargetProblem.Create();
// Устанавливаем параметры целевой задачи
AdditionalDetails := Problem.AdditionalDetails;
AdditionalDetails.Clear();
AdditionalDetails.AddDetails(Target, VarOutp.Slice);
// Задаем сценарий оптимизационной задачи
Target.OptimisticScenario := Problem.Scenarios.Item[0];
// Добавляем переменные целевой функции
Operands := Target.Operands;
Transform := SimpleModel.Transform;
TransformVarables := Transform.Outputs;
TransVar := TransformVarables.Item[0];
Slice := TransVar.Slices.Item[0];
OperandTerm := Operands.Add(Slice);
// Задаем целевую функцию
Target.CriterionFunction.AsString := OperandTerm.TermToInnerText();
// Добавляем целевую задачу в цепочку расчета
MetaTarget := CalcChain.AddTargetProblem(Target, DimCalendarLevel.dclYear);
// Задаем пользовательское имя целевой задачи
MetaTarget.UseCustomName := True;
MetaTarget.Name := "Новая целевая функция";
// Сохраняем изменения
(Problem As IMetabaseObject).Save();
End Sub;
См. также: