⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 particle.java

📁 这是导师留给我的用JAVA写的进化算法,比较经典,请审核.
💻 JAVA
字号:
/* PARTICLE */
/* Part of the PSO project */
/* Dr Mark C. Sinclair, NPIC, Cambodia, v1.0, November 2006, mcs@ieee.org */
/* You may make use of this code for any purpose, but if you use it, */
/* you must cite the use: Sinclair, M.C., PSO Java Applet v1.0, */
/* http://uk.geocities.com/markcsinclair/pso.html, November, 2006 */

import java.util.*;

class Particle {
	public Particle(Eval eval, double maxV, double c1, double c2, Random rnd) {
		Contract.require("maxV > 0.0", maxV > 0.0);
		Contract.require("0.0 < c1 <= 2.0", (c1 > 0.0) && (c1 <= 2.0));
		Contract.require("0.0 < c2 <= 2.0", (c2 > 0.0) && (c2 <= 2.0));

		this.eval = eval;
		this.maxV = maxV;
		this.c1   = c1;
		this.c2   = c2;
		this.rnd  = rnd;

		//initial position
		x = new double[eval.getDim()];
		for (int i=0; i<eval.getDim(); i++)
			x[i] = eval.getXMin(i) + 
			      (eval.getXMax(i) - eval.getXMin(i)) * rnd.nextDouble();

		// best position
		p = new double[eval.getDim()];
		for (int i=0; i<eval.getDim(); i++)
			p[i] = x[i];

		// last position
		q = new double[eval.getDim()];
		for (int i=0; i<eval.getDim(); i++)
			q[i] = x[i];

		// initial velocity
		v = new double[eval.getDim()];
		for (int i=0; i<eval.getDim(); i++)
			v[i] = 0.0;

		// initial fitness
		fit = eval.eval(x);

		// best fitness
		bestFit = fit;
	}

	public synchronized double getX(int idx) {
		return(x[idx]);
	}

	public synchronized double getP(int idx) {
		return(p[idx]);
	}

	public synchronized double getQ(int idx) {
		return(q[idx]);
	}

	public synchronized double getV(int idx) {
		return(v[idx]);
	}

	public synchronized double getFit() {
		Contract.ensure("bestFit <= fit", bestFit <= fit);
		return(fit);
	}

	public synchronized void update(double[] g) {
		synchronized(g) {
			Contract.require("g not null", g != null);
			Contract.require("g.length valid", g.length == eval.getDim());
			for (int i=0; i<eval.getDim(); i++) {
				// update last position
				q[i] = x[i];

				// update velocity
				double dv;
				dv    = c1 * rnd.nextDouble() * (p[i] - x[i]) +
				        c2 * rnd.nextDouble() * (g[i] - x[i]);
				v[i] += dv;
				v[i]  = (v[i] < -maxV) ? -maxV : v[i];
				v[i]  = (v[i] >  maxV) ?  maxV : v[i];

				// update current position
				x[i] += v[i];
				x[i]  = (x[i] < eval.getXMin(i)) ? eval.getXMin(i) : x[i];
				x[i]  = (x[i] > eval.getXMax(i)) ? eval.getXMax(i) : x[i];
			}
		}

		//update fitness
		fit = eval.eval(x);

		// update best position/fitness ?
		if (fit < bestFit) {
			for (int i=0; i<eval.getDim(); i++)
				p[i] = x[i];
			bestFit = fit;
		}
	}

	public synchronized String toString() {
		StringBuffer buf = new StringBuffer();
		buf.append("Particle(").append(fit);
		buf.append(",").append(bestFit);
		buf.append(",x[").append(x[0]);
		for (int i=1; i<eval.getDim(); i++)
			buf.append(",").append(x[i]);
		buf.append("],p[").append(p[0]);
		for (int i=1; i<eval.getDim(); i++)
			buf.append(",").append(p[i]);
		buf.append("],v[").append(v[0]);
		for (int i=1; i<eval.getDim(); i++)
			buf.append(",").append(v[i]);
		buf.append("])");
		return(buf.toString());
	}

	private double[] x;       // current position
	private double[] p;       // best position
	private double[] q;       // last position
	private double[] v;       // velocity
	private double   fit;     // fitness
	private double   bestFit; // best fitness
	private Eval     eval;
	private double   maxV;
	private double   c1;
	private double   c2;
	private Random   rnd;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -