2017-02-17 10 views
0

Я построил свою первую основанную на агентах модель с AnyLogic, и теперь мне нужно ее откалибровать. Я пробовал с доступными экспериментами, но это занимает слишком много времени, и я не могу имитировать более 10.000 агентов. Поэтому я хочу попробовать собственный эксперимент ... но я не знаю, как его построить!AnyLogic - как создать собственный эксперимент

Я построил очень простую модель enter image description here где параметр bernoulli(main.calib), а затем я хочу, чтобы максимизировать количество агентов, которые идут в конечном состоянии.

Я скопировал код из экспериментов, доступных с помощью и сделал некоторые незначительные коррективы

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

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

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

// 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.calib = 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.end); 
      // 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.5); 
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()); }

и следующий результат ...

enter image description here

Я не понимаю, почему цель всегда равна нулю ...

Спасибо за помощь!

+0

Я так долго не работал с обычным экспериментом. в основном с изменениями параметров. Но где вы рассказываете эксперимент о количестве агентов на заключительном этапе? –

ответ

0

Личный учебный выпуск AnyLogic имеет некоторые ограничения на то, сколько агентов могут делать определенные вещи, и это ТАКЖЕ не позволяет выполнять собственные эксперименты. Возможно, AnyLogic терпит неудачу. Просто выстрел в темноте, так как я не обычный пользователь AnyLogic.