learn method

  1. @override
bool learn(
  1. List<P> samples,
  2. double targetGlobalError
)
override

Learn the training of sample. Called by train.

Implementation

@override
bool learn(List<P> samples, double targetGlobalError) {
  final base = ann.allWeights;
  if (_pos == null) {
    _pos = [
      List<double>.of(base),
      for (var i = 1; i < swarmSize; ++i) gaussianGenome(base, 0.5),
    ];
    _vel = List.generate(swarmSize, (_) => List<double>.filled(dim, 0));
    _pbest = _pos!.map((p) => List<double>.of(p)).toList();
    _pbestFit = _pos!.map(evaluate).toList();
    for (var i = 0; i < swarmSize; ++i) {
      if (_pbestFit[i] < _gbestFit) {
        _gbestFit = _pbestFit[i];
        _gbest = List<double>.of(_pos![i]);
      }
    }
  }

  final pos = _pos!;
  final gbest = _gbest!;
  for (var p = 0; p < swarmSize; ++p) {
    for (var i = 0; i < dim; ++i) {
      final r1 = random.nextDouble();
      final r2 = random.nextDouble();
      _vel[p][i] =
          inertia * _vel[p][i] +
          cognitive * r1 * (_pbest[p][i] - pos[p][i]) +
          social * r2 * (gbest[i] - pos[p][i]);
      pos[p][i] += _vel[p][i];
    }
    final f = evaluate(pos[p]);
    if (f < _pbestFit[p]) {
      _pbestFit[p] = f;
      _pbest[p] = List<double>.of(pos[p]);
      if (f < _gbestFit) {
        _gbestFit = f;
        _gbest = List<double>.of(pos[p]);
      }
    }
  }

  return finishGeneration(targetGlobalError);
}