【问题标题】:AnyLogic - trouble with custom experimentAnyLogic - 自定义实验的问题
【发布时间】:2017-07-21 00:53:31
【问题描述】:

我正在尝试构建一个自定义实验...但它给出了以下错误

我不明白出了什么问题!

是因为我在 Main 中定义了以下内容?

一开始我希望一个代理接收消息,为什么自定义实验给我带来麻烦,而普通模拟实验却没有?

我从示例模型中获取的自定义实验的代码

try {
// Create Engine, initialize random number generator:
Engine engine = createEngine();
// Set stop time:
engine.setStopTime( 3287 );

// Create optimization variable 
final COptQuestContinuousVariable v = new COptQuestContinuousVariable();
v.SetLowerBound(0.0);
v.SetUpperBound(0.03);

// Create objective
final COptQuestObjective obj = new COptQuestUserControlledObjective();
obj.SetMinimize();

// Create optimization engine
final COptQuestOptimization opt = ExperimentOptimization.createOptimization(engine, new OptimizationCallback() {

    @Override
    public void evaluate(COptQuestOptimization optimization,
            COptQuestSolution solution, Engine engine) {
        try {
            // Create new root object:
            Main root = new Main( engine, null, null );
            // Setup parameters of root object here
            root.susc_s = solution.GetVariableValue(v);
            // Prepare Engine for simulation:
            engine.start( root );
            // Start simulation in fast mode:
            engine.runFast();
            // Process results of simulation here
            solution.SetObjectiveValue( obj, root.objective );
            // Destroy the model:
            engine.stop();
        } catch (COptQuestException e) {
            traceln(e.Description());
        }
    }

    // Trace each iteration (optional!)
    @Override
    public void monitorStatus(COptQuestOptimization optimization,
            COptQuestSolution solution, Engine engine) {
        try {
            traceln(String.format("  %3d : %6.2f : %8.2f  -- %8.2f",
                solution.GetIteration(), solution.GetVariableValue(v),
                solution.GetObjectiveValue(),
                optimization.GetBestSolution() != null ?
                optimization.GetBestSolution().GetObjectiveValue(obj) : Double.NaN));
        } catch (COptQuestException e) {
            traceln(e.Description());
        }
    }

});

// Setup optimization engine
opt.AddVariable(v);
opt.AddObjective(obj);
// Set the number of iterations to run
opt.SetMaximumIterations(30);

// Add suggested solution (initial solution)
COptQuestSolution suggestedSolution = opt.CreateSolution();
suggestedSolution.SetVariableValue(v, 0.014);
opt.AddSuggestedSolution(suggestedSolution);

traceln(" Iter : Param  : Objective -- Best obj.");
traceln("-------------------------------------------");
// Perform optimization
opt.Optimize();
traceln("-------------------------------------------");

// Output results
COptQuestSolution bestSolution = opt.GetBestSolution();
traceln("Best objective: " + format(bestSolution.GetObjectiveValue(obj)));
traceln("   is feasible: " + format(bestSolution.IsFeasible()));
traceln("Best parameter: " + format(bestSolution.GetVariableValue(v)));
traceln("Best iteration: " + bestSolution.GetIteration());  }     catch (COptQuestException e) {
traceln(e.Description());  }

【问题讨论】:

    标签: anylogic


    【解决方案1】:

    很难从这个细节中明确地说出来,但我怀疑正在发生的事情是:

    • 您的susc_s 是一个参数/变量,它会影响从 S 状态开始的代理数量

    • 您的优化实验尝试了此参数的不同值。 (这就是优化所做的,因为您将其映射到您的连续优化变量。)

    • 它为第一次运行选择 0,这意味着您的 Main 启动代码在该状态下找不到任何代理,因此为 a 返回 null(导致异常)

    当您通过 Simulation 实验手动运行它时,您可能会将 susc_s 设置为某个非零值(或始终导致某些代理以 S 状态启动的值)。

    (或者有一些其他模型参数会影响从 S 状态开始的代理数量。因为您没有在自定义实验中明确设置它,所以它获取默认值,这意味着没有代理以 S 状态开始. 您设置优化变量以映射到您想要改变的模型参数,但您仍然需要适当地设置任何其他模型参数,除非默认值都可以。)

    【讨论】:

      猜你喜欢
      • 2017-07-06
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2021-03-17
      • 1970-01-01
      • 2011-07-08
      相关资源
      最近更新 更多