上次主要研究了一个优化任务的执行及结果的获取,见isight5.0 二次开发之 Application (1)。这次看看如何添加和设置各种组件,从零开始建立整个任务。
此次建立的模型很简单,一个优化组件加一个计算组件。
添加组件可以参照软件自带的例子,主要的问题是如何建立变量的映射和设置组件参数。
1 变量映射
变量映射的目的是为了实现组件之间参数值的传递,建立输入输出关系。这里采用 DtUtils 中的方法。
DtUtils.mapAddedParameterList
2 设置组件参数
对于优化组件来说,需要设定优化变量和优化目标,可以通过 OptimizationPlan 的方法进行设定。
对于计算组件,没有特定的类来实现参数设置,采用 ComponentAPI 的方式来设定。
下面是全部代码:
//========================================================================= /** * Method createMyOptModelFromScratch * * @throws Exception */ //========================================================================= private static void createMyOptModelFromScratch() throws Exception { DtModelManager mgr = DtModelManager.createEmptyModel(); mgr.getModelProperties().setModelName("My Optimization Model"); // MetaModel rootMM = MetaModelManager.instance().lookupMetaModel(EsiTypes.OPTIMIZATION_COMPONENT); DtComponent myTask = DtModelManager.createComponent(rootMM, "MyOptimization"); mgr.setRootComponent(myTask); // Now add a calculator to the task MetaModel calcMM = MetaModelManager.instance().lookupMetaModel("com.engineous.component.Calculator"); DtComponent calc = DtModelManager.createComponent(calcMM, "My Calc"); myTask.addComponent(calc); // DtControlFlow cf1 = DtModelManager.createControlFlow(null, calc); DtControlFlow cf2 = DtModelManager.createControlFlow(calc, null); myTask.addControlFlow(cf1); myTask.addControlFlow(cf2); // DtScalarVariable var = DtModelManager.createScalarVariable("x", EsiTypes.REAL, Variable.ROLE_PARAMETER, Variable.MODE_INPUT, null, null); var.getValueObj().setValue(100); calc.addParameter(var); DtUtils.copyParameters(calc, myTask); DtScalarVariable var2 = DtModelManager.createScalarVariable("y", EsiTypes.REAL, Variable.ROLE_PARAMETER, Variable.MODE_OUTPUT, null, null); calc.addParameter(var2); // OptimizationPlan optPlan = DesignDriverFactory.createOptPlan(myTask); DesignVariable dv = optPlan.addDesignVariable("x"); Objective obj = optPlan.addObjective("y", Objective.MINIMIZE); optPlan.store(myTask); // ComponentAPI calculatorAPI = calc.getAPI(); String calc1 = "y=x^2"; calculatorAPI.set("expression", calc1); calculatorAPI.apply(); // List<DtVariable> varToMap = new ArrayList<DtVariable>(); varToMap.add(var); DtUtils.mapAddedParameterList(varToMap); //Save the model // To verify what you have created, go load this into the Isight Gateway. String newName = "MyOptModel.zmf"; OutputStream savedFile = new FileOutputStream(newName); mgr.saveZippedModel(savedFile); }