/** {@inheritDoc} */
  @Override
  public Vector get(Particle particle) {
    Vector localGuide = (Vector) particle.getLocalGuide();
    Vector globalGuide = (Vector) particle.getGlobalGuide();

    PSO pso = (PSO) AbstractAlgorithm.get();
    List<Entity> positions = getRandomParentEntities(pso.getTopology());

    // select three random individuals, all different and different from particle
    ProbabilityDistributionFuction pdf = new UniformDistribution();

    Vector position1 = (Vector) positions.get(0).getCandidateSolution();
    Vector position2 = (Vector) positions.get(1).getCandidateSolution();
    //        Vector position3 = (Vector) positions.get(2).getContents();

    Vector.Builder builder = Vector.newBuilder();
    for (int i = 0; i < particle.getDimension(); ++i) {
      double r = pdf.getRandomNumber(0, 1);
      double attractor = r * localGuide.doubleValueOf(i) + (1 - r) * globalGuide.doubleValueOf(i);
      double stepSize =
          this.rand3.getRandomNumber(0, 1)
              * (position1.doubleValueOf(i) - position2.doubleValueOf(i));

      if (this.rand2.getRandomNumber(0, 1) > this.crossoverProbability.getParameter()) {
        builder.add(attractor + stepSize);
      } else {
        builder.add(((Vector) particle.getPosition()).doubleValueOf(i)); // position3.getReal(i));
      }
    }
    return builder.build();
  }
  @Override
  public Vector get(Particle particle) {
    Vector localGuide = (Vector) particle.getLocalGuide(); // personal best (yi)
    Vector globalGuide = (Vector) particle.getGlobalGuide(); // global best (y^i)

    Vector.Builder builder = Vector.newBuilder();
    for (int i = 0; i < particle.getDimension(); ++i) {
      // double tmp1 = cognitive.getParameter();
      // double tmp2 = social.getParameter();

      double sigma = Math.abs(localGuide.doubleValueOf(i) - globalGuide.doubleValueOf(i));
      if (sigma == 0) {
        sigma = 1;
      }
      // System.out.println("Sigma: "+sigma);
      // according to Kennedy
      double mean = (localGuide.doubleValueOf(i) + globalGuide.doubleValueOf(i)) / 2;
      // andries proposal: double mean = (tmp1*personalBestPosition.getReal(i) +
      // tmp2*nBestPosition.getReal(i)) / (tmp1+tmp2);
      if (Rand.nextDouble() < p) {
        builder.add(
            localGuide.doubleValueOf(i) + this.cauchyDistribution.getRandomNumber(mean, sigma));
      } else {
        builder.add(
            globalGuide.doubleValueOf(i) + this.gaussianDistribution.getRandomNumber(mean, sigma));
      }
    }
    return builder.build();
  }
예제 #3
0
  @Override
  public Vector get(Particle particle) {
    Vector velocity = (Vector) particle.getVelocity();
    Vector position = (Vector) particle.getPosition();
    PSO algorithm = (PSO) AbstractAlgorithm.get();
    int ns = (int) nSize.getParameter();
    fj.data.List<Particle> neighbours =
        algorithm
            .getTopology()
            .sort(
                Ord.ord(
                    VectorBasedFunctions.sortByDistance(particle, new EuclideanDistanceMeasure())))
            .take(ns);

    Vector.Builder builder = Vector.newBuilder();
    for (int i = 0; i < particle.getDimension(); ++i) {
      double informationSum = 0.0;
      double randomSum = 0;

      for (Particle currentTarget : neighbours) {
        Vector currentTargetPosition = (Vector) currentTarget.getBestPosition();
        double randomComponent = Rand.nextDouble() * (4.1 / ns);
        informationSum += randomComponent * currentTargetPosition.doubleValueOf(i);
        randomSum += randomComponent;
      }

      double value =
          inertiaWeight.getParameter()
              * (velocity.doubleValueOf(i)
                  + randomSum * ((informationSum / (ns * randomSum) - position.doubleValueOf(i))));
      builder.add(value);
    }

    return builder.build();
  }
예제 #4
0
  /**
   * Convert the provided {@code representation} into a {@code Vector}.
   *
   * @param representation The {@code StructuredType} to convert.
   * @return The converted vector object.
   */
  private static Vector toVector(List<Type> representation) {
    Vector.Builder vector = Vector.newBuilder();

    for (Type type : representation) {
      vector.add((Numeric) type);
    }

    return vector.build();
  }
예제 #5
0
 public static Vector normalise_z(Vector z, Vector z_max) {
   Vector.Builder result = Vector.newBuilder();
   for (int i = 0; i < z.size(); i++) {
     Preconditions.checkArgument(z.doubleValueOf(i) >= 0.0);
     Preconditions.checkArgument(z.doubleValueOf(i) <= z_max.doubleValueOf(i));
     Preconditions.checkArgument(z_max.doubleValueOf(i) > 0.0);
     result.add(z.doubleValueOf(i) / z_max.doubleValueOf(i));
   }
   return result.build();
 }
  @Override
  public void performIteration(PSO algorithm) {
    delegate.performIteration(algorithm);
    Topology<Particle> topology = algorithm.getTopology();

    // calculate vAvg
    Vector avgV =
        Vectors.mean(
            Lists.transform(
                topology,
                new Function<Particle, Vector>() {
                  @Override
                  public Vector apply(Particle f) {
                    return (Vector) f.getVelocity();
                  }
                }));

    Vector.Builder builder = Vector.newBuilder();
    for (Numeric n : avgV) {
      if (Math.abs(n.doubleValue()) > vMax.getParameter()) {
        builder.add(vMax.getParameter());
      } else {
        builder.add(n);
      }
    }

    avgV = builder.build();

    // mutation
    Particle gBest = Topologies.getBestEntity(topology, new SocialBestFitnessComparator());
    Particle mutated = gBest.getClone();
    Vector pos = (Vector) gBest.getBestPosition();
    final Bounds bounds = pos.boundsOf(0);

    pos =
        pos.plus(
            avgV.multiply(
                new Supplier<Number>() {
                  @Override
                  public Number get() {
                    return distribution.getRandomNumber() * bounds.getRange()
                        + bounds.getLowerBound();
                  }
                }));

    mutated.setCandidateSolution(pos);
    mutated.calculateFitness();

    if (gBest.getBestFitness().compareTo(mutated.getFitness()) < 0) {
      gBest.getProperties().put(EntityType.Particle.BEST_FITNESS, mutated.getBestFitness());
      gBest.getProperties().put(EntityType.Particle.BEST_POSITION, mutated.getBestPosition());
    }
  }
예제 #7
0
  /**
   * @param bits
   * @param dimensionBits
   * @return
   */
  public Vector decodeBitString(String bits, int dimensionBits) {
    Vector.Builder vector = Vector.newBuilder();

    for (int i = 0; i < bits.length(); ) {
      double tmp = valueOf(bits, i, i + dimensionBits);
      tmp = transform(tmp);

      vector.add(tmp);
      i += dimensionBits;
    }

    return vector.build();
  }
 /** Before each test, make a new StandardPatternDataTable object and add in the test data. */
 @Before
 public void setRawData() {
   stringTargetPatterns = new StandardPatternDataTable();
   vectorTargetPatterns = new StandardPatternDataTable();
   Vector.Builder feature;
   Type classification;
   for (int i = 0; i < typedData.size() / 2; i++) {
     feature = Vector.newBuilder();
     List<Type> row = typedData.getRow(i);
     for (int j = 0; j < row.size() - 1; j++) {
       feature.add((Numeric) row.get(j));
     }
     classification = row.get(row.size() - 1).getClone();
     stringTargetPatterns.addRow(new StandardPattern(feature.build(), classification));
   }
   for (int i = typedData.size() / 2; i < typedData.size(); i++) {
     feature = Vector.newBuilder();
     Vector.Builder classificationB = Vector.newBuilder();
     List<Type> row = typedData.getRow(i);
     for (int j = 0; j < row.size() - 3; j++) {
       feature.add((Numeric) row.get(j));
     }
     for (int j = row.size() - 3; j < row.size(); j++) {
       classificationB.add((Numeric) row.get(j));
     }
     vectorTargetPatterns.addRow(new StandardPattern(feature.build(), classificationB.build()));
   }
 }
예제 #9
0
  public static Vector calculate_f(double D, Vector x, Vector h, Vector S) {
    Preconditions.checkArgument(D > 0.0);
    Preconditions.checkArgument(Misc.vector_in_01(x));
    Preconditions.checkArgument(Misc.vector_in_01(h));
    Preconditions.checkArgument(x.size() == h.size());
    Preconditions.checkArgument(h.size() == S.size());

    Vector.Builder result = Vector.newBuilder();

    for (int i = 0; i < h.size(); i++) {
      Preconditions.checkArgument(S.doubleValueOf(i) > 0.0);
      result.add(D * x.doubleValueOf(x.size() - 1) + S.doubleValueOf(i) * h.doubleValueOf(i));
    }

    return result.build();
  }
예제 #10
0
  public static Vector calculate_x(Vector t_p, Vector A) {
    Preconditions.checkArgument(Misc.vector_in_01(t_p));
    Preconditions.checkArgument(!t_p.isEmpty());
    Preconditions.checkArgument(A.size() == t_p.size() - 1);

    Vector.Builder result = Vector.newBuilder();

    for (int i = 0; i < t_p.size() - 1; i++) {
      Preconditions.checkArgument(A.doubleValueOf(i) == 0 || A.doubleValueOf(i) == 1);
      double tmp1 = Math.max(t_p.doubleValueOf(t_p.size() - 1), A.doubleValueOf(i));
      result.add(tmp1 * (t_p.doubleValueOf(i) - 0.5) + 0.5);
    }

    result.add(t_p.doubleValueOf(t_p.size() - 1));

    return result.build();
  }
예제 #11
0
  @BeforeClass
  public static void setUpBeforeClass() throws Exception {
    Vector.Builder tmp = Vector.newBuilder();
    set = new ArrayList<Pattern>();

    for (int i = 1; i <= SIZE; i++) {
      tmp.add(Real.valueOf(i));
    }
    set.add(new Pattern("class0", tmp.build()));

    tmp = Vector.newBuilder();
    for (int i = SIZE; i > 0; i--) {
      tmp.add(Real.valueOf(i));
    }
    set.add(new Pattern("class1", tmp.build()));
    set.add(new Pattern("class2", Vector.of(1.0, 1.0, 1.0)));
    set.add(new Pattern("class1", Vector.of(2.0, 2.0, 2.0)));
    set.add(new Pattern("class0", Vector.of(3.0, 3.0, 3.0)));
  }
  @Override
  public Vector get(Particle particle) {
    Vector localGuide = (Vector) particle.getLocalGuide();
    Vector globalGuide = (Vector) particle.getGlobalGuide();

    Vector.Builder builder = Vector.newBuilder();
    for (int i = 0; i < particle.getDimension(); ++i) {
      if (this.uniform.getRandomNumber(0, 1) < 0.5) {
        builder.add(localGuide.doubleValueOf(i));
      } else {
        // double tmp1 = cognitive.getParameter();
        // double tmp2 = social.getParameter();

        double sigma = Math.abs(localGuide.doubleValueOf(i) - globalGuide.doubleValueOf(i));
        // according to Kennedy
        double mean = (localGuide.doubleValueOf(i) + globalGuide.doubleValueOf(i)) / 2;
        // andries proposal: double mean = (tmp1*personalBestPosition.getReal(i) +
        // tmp2*nBestPosition.getReal(i)) / (tmp1+tmp2);

        builder.add(this.randomDistribution.getRandomNumber(mean, sigma));
      }
    }
    return builder.build();
  }
예제 #13
0
  @Override
  public <E extends Entity> List<E> crossover(List<E> parentCollection) {
    Preconditions.checkArgument(
        parentCollection.size() == 2, "BlendCrossoverStrategy requires 2 parents.");

    // How do we handle variable sizes? Resizing the entities?
    E offspring1 = (E) parentCollection.get(0).getClone();
    E offspring2 = (E) parentCollection.get(1).getClone();

    Vector parentChromosome1 = (Vector) parentCollection.get(0).getCandidateSolution();
    Vector parentChromosome2 = (Vector) parentCollection.get(1).getCandidateSolution();
    Vector.Builder offspringChromosome1 = Vector.newBuilder();
    Vector.Builder offspringChromosome2 = Vector.newBuilder();

    int sizeParent1 = parentChromosome1.size();
    int sizeParent2 = parentChromosome2.size();

    int minDimension = Math.min(sizeParent1, sizeParent2);

    for (int i = 0; i < minDimension; i++) {
      double gamma =
          (1 + 2 * alpha.getParameter()) * random.getRandomNumber() - alpha.getParameter();
      double value1 =
          (1 - gamma) * parentChromosome1.doubleValueOf(i)
              + gamma * parentChromosome2.doubleValueOf(i);
      double value2 =
          (1 - gamma) * parentChromosome2.doubleValueOf(i)
              + gamma * parentChromosome1.doubleValueOf(i);

      offspringChromosome1.add(Real.valueOf(value1, parentChromosome1.boundsOf(i)));
      offspringChromosome2.add(Real.valueOf(value2, parentChromosome1.boundsOf(i)));
    }

    offspring1.setCandidateSolution(offspringChromosome1.build());
    offspring2.setCandidateSolution(offspringChromosome2.build());

    return Arrays.asList(offspring1, offspring2);
  }
  private void updateInertia(PSO pso) {

    int dimension = pso.getTopology().last().getDimension();

    if (inertiaWeight.size() < dimension) {
      Vector.Builder builder = Vector.newBuilder();
      builder.repeat(dimension, Real.valueOf(initialInertiaWeight.getParameter()));
      inertiaWeight = builder.build();
    }
    Vector.Builder builder = Vector.newBuilder();
    for (int i = 0; i < dimension; i++) {
      builder.add(
          Math.sqrt(
              Math.pow(absoluteAverageVelocityVector.doubleValueOf(i), 2)
                  + Math.pow(averageSpeedVector.doubleValueOf(i), 2)));
    }
    Vector d = builder.build(); // get the degree of convergence vector
    double max_d = 0;
    for (Numeric component : d) {
      if (component.doubleValue() > max_d) {
        max_d = component.doubleValue();
      }
    }
    if (max_d != 0) {
      Vector.Builder builder2 = Vector.newBuilder();
      for (Numeric component : d) {
        builder2.add(max_d / (max_d + component.doubleValue()));
      }
      Vector w = builder2.build();

      /*double sum_w = 0;
      for(Numeric component : w) {
          sum_w += component.doubleValue();
      }

      /*
      Vector.Builder builder3 = Vector.newBuilder();
      for(Numeric component : w) {
          builder3.add(Math.pow(dimension * component.doubleValue() / sum_w, pwr.getParameter()));
      } */

      /*
      for(Numeric component : w) {
          //builder3.add(component.doubleValue() - w_mean / w_stdDiv);
          builder3.add(component.doubleValue() * initialInertiaWeight.getParameter());
      }
      for(int i = 0; i < inertiaWeight.size(); i++) {
          builder3.add(w.doubleValueOf(i) * inertiaWeight.doubleValueOf(i));
      }
      */
      /*
      Vector m = builder3.build();
      double sum_m = 0;
      for (Numeric num : m) {
          sum_m += num.doubleValue();
      }

      double m_mean = sum_m / (double) dimension;
      double sum_diff_squared = 0;
      for(Numeric component : m) {
          sum_diff_squared += Math.pow(component.doubleValue() - m_mean, 2);
      }
      double m_stdDiv = Math.sqrt(sum_diff_squared / (double) dimension);
      */
      // System.out.println("VEL: StdDiv of M: " + m_stdDiv + ", mean of M: " + m_mean);

      for (int i = 0; i < inertiaWeight.size(); i++) {
        inertiaWeight.setReal(
            i,
            (1 - filter.getParameter()) * w.doubleValueOf(i)
                + filter.getParameter()
                    * inertiaWeight.doubleValueOf(i)); // w.doubleValueOf(i));//;
      }
    }
  }
  /** {@inheritDoc} */
  @Override
  public Vector get(Particle particle) {
    double averageParticleVelocity = 0.0;

    Vector averageVelocity = null; // velocity.getClone();
    //        averageVelocity.reset();
    PSO pso = (PSO) AbstractAlgorithm.get();
    for (Particle p : pso.getTopology()) {
      if (averageVelocity == null) {
        averageVelocity = (Vector) p.getVelocity();
        continue;
      }
      Vector particleVelocity = (Vector) p.getVelocity();
      averageVelocity = averageVelocity.plus(particleVelocity);
      averageParticleVelocity += particleVelocity.norm();
    }
    averageVelocity = averageVelocity.divide(particle.getDimension());
    averageParticleVelocity /= particle.getDimension();

    double swarmCenterVelocity = averageVelocity.norm();
    double swarmCoherence = calculateSwarmCoherence(swarmCenterVelocity, averageParticleVelocity);

    double sigmoidValue = this.sigmoid.apply(swarmCoherence);

    Vector standardVelocity = this.delegate.get(particle);

    Vector.Builder builder = Vector.newBuilder();
    for (int i = 0; i < particle.getDimension(); ++i) {
      double coherenceVelocity =
          this.scalingFactor.getParameter()
              * sigmoidValue
              * averageVelocity.doubleValueOf(i)
              * this.randomNumber.getRandomNumber();
      builder.add(coherenceVelocity);
    }
    Vector coherence = builder.build();

    return Vectors.sumOf(standardVelocity, coherence);

    //        float social = socialRandomGenerator.nextFloat();
    //        float cognitive = cognitiveRandomGenerator.nextFloat();
    //
    //        //DistanceMeasure adm = new AbsoluteDistanceMeasure();
    //        //DistanceMeasure dm = new MetricDistanceMeasure();
    //
    //        double avgv = 0.0;
    //        double swv = 0.0;
    //        Topology<Particle> topology = ((PSO)Algorithm.get()).getTopology();
    //          Iterator<? extends Particle> it = topology.neighbourhood(null);
    //          double[] al = new double[particle.getDimension()];
    //           while (it.hasNext()) {
    //               Particle pl = it.next();
    //               double tmpv = 0.0;
    //               //double tmpsv = 0.0;
    //               for(int dim = 0; dim < particle.getDimension(); dim++) {
    //                al[dim] = al[dim]+((Vector)pl.getVelocity()).getReal(dim);
    //                   tmpv += Math.pow(((Vector)pl.getVelocity()).getReal(dim), 2);
    //               }
    //               tmpv = Math.sqrt(tmpv);
    //               avgv += tmpv;
    //           }
    //           for(int i = 0; i < particle.getDimension(); i++) {
    //            //al.set(i, ;
    //            swv += (al[i]/topology.size()) * (al[i]/topology.size());
    //        }
    //        swv = Math.sqrt(swv);
    //
    //        for (int i = 0; i < particle.getDimension(); ++i) {
    //            double tmp = 0.0;
    //            tmp = inertiaWeight.getParameter()*velocity.getReal(i)
    //                + cognitive * (bestPosition.getReal(i) - position.getReal(i)) *
    // cognitiveAcceleration.getParameter()
    //                + social * (nBestPosition.getReal(i) - position.getReal(i)) *
    // socialAcceleration.getParameter();
    //
    //            double avgdim = 0.0;
    //              it = topology.neighbourhood(null);
    //               while (it.hasNext()) {
    //                   avgdim += ((Vector)(it.next().getVelocity())).getReal(i);
    //               }
    //            avgdim /= particle.getDimension();
    //
    //            double cvelocity = MathUtil.sigmoid(swv/avgv)*avgdim*randomNumber.getCauchy();
    //
    //            System.out.println(cvelocity);
    //            tmp += cvelocity;
    //
    //            velocity.setReal(i, tmp);
    //
    //            clamp(velocity, i);
    //        }
  }