package infosapient.resolution;
/*
* Copyright (c) 2001, Workplace Performance Tools, All Rights Reserved.
*
* LICENSE TO USE THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THE COMMON PUBLIC LICENSE 0.5
* ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES
* RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
* The license may be viewed at:
* http://www.opensource.org/licenses/cpl.html
*/
import infosapient.system.FSEvent;
import infosapient.system.FzySystemException;
import infosapient.system.FzySet;
import java.rmi.server.ObjID;
/**
* Use the CENTROID method for defuzzification.
* centerOfMass = SUM(d(i)*m(i))/SUM(m(i))
* return the membership of (int) centerOfMass.
* @author: Michael McConnell
* @version $Revision: 1.1.1.1 $
*/
public class FzyResCENTROID extends FzyResolutionMethod {
static final long serialVersionUID = -3673394684947280463L;
/**
*
*/
public FzyResCENTROID() {super();}
public String getName() { return "centroid"; }
/**
* @param FzySet the FzySet to be defuzzified.
* @return double the 'crisp' value of the FzySet.
* Defuzzify the set using the Centroid method
*/
protected synchronized double resolveUsing(FzySet fset) {
int i;
double resultant = Double.NaN;
if (fset.isNormal()) {
VECMAX = fset.getVECMAX();
double lDomain[] = new double[VECMAX];
double lMember[] = new double[VECMAX];
lDomain = fset.getDomainArray();
lMember = fset.getMemberArray();
double x = 0.0;
double y = fset.integrateMbr();
for (i = 0; i < VECMAX; i++){
x = (lDomain[i] * lMember[i]) + x;
}
try {
resultant = x / y;
} catch (ArithmeticException ae) {
notifyObservers(new FSEvent(this, "Error", ae));
}
try {
fset.setSolution(resultant);
if (DEBUG_[2]) trace[2].println(" Resolved value for set: "
+ fset.getQualifiedName()
+" is: " + fset.getSolution()
+", with degree of membership " + fset.getSolutionDOM());
} catch (Exception iae) {
notifyObservers(new FSEvent(this, "Error", iae));
}
} else {
if (DEBUG_[2]) trace[2].println(
" ***WARNING**** Centroid method not performed as fset membership not normalized.");
}
return fset.getSolution();
}
}