//--------------------------------------------------------------------------------// // COPYRIGHT NOTICE // //--------------------------------------------------------------------------------// // Copyright (c) 2012, Instituto de Microelectronica de Sevilla (IMSE-CNM) // // // // All rights reserved. // // // // Redistribution and use in source and binary forms, with or without // // modification, are permitted provided that the following conditions are met: // // // // * Redistributions of source code must retain the above copyright notice, // // this list of conditions and the following disclaimer. // // // // * Redistributions in binary form must reproduce the above copyright // // notice, this list of conditions and the following disclaimer in the // // documentation and/or other materials provided with the distribution. // // // // * Neither the name of the IMSE-CNM nor the names of its contributors may // // be used to endorse or promote products derived from this software // // without specific prior written permission. // // // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE // // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER // // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, // // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // //--------------------------------------------------------------------------------// package xfuzzy.xfsp.model.types; import xfuzzy.lang.Parameter; import xfuzzy.lang.ParamMemFunc; import xfuzzy.lang.Universe; import xfuzzy.lang.XflException; /** * <p> <b>Descripci�n:</b> une dos funciones de pertenencia de tipo campana * obteniendo otra nueva tambi�n de tipo campana. * <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS> * @author Jorge Agudo Praena * @version 2.2 * */ public class XfspBellMFMerger implements IXfspMFMerger { public XfspBellMFMerger() { } /** * <p> <b>Descripci�n:</b> une dos funciones de pertenencia de tipo campana * y obtiene una nueva funci�n de tipo campana. * @param mf1 Una funci�n de pertenencia de tipo campana (<i>bell</i>). * @param mf2 Otra funci�n de pertenencia de tipo campana. * @return Nueva funci�n de pertenencia de tipo campana cuyo centro es * equidistante a los centros de las dos funciones originales y cuya anchura * es igual a la suma de la sexta parte de la diferencia en valor absoluto de * los centros de ambas funciones de pertenencia m�s la anchura m�xima de las * dos funciones de pertenencia originales. * */ public ParamMemFunc merge(ParamMemFunc mf1, ParamMemFunc mf2, Universe universe) { //almacena la media (centro) de la primera funci�n de pertenencia que se le //pasa como par�metro double mf1Mean = 0.0; //almacena la media (centro) de la segunda funci�n de pertenencia que se le //pasa como par�metro double mf2Mean = 0.0; //vector de double que almacenar� los par�metros para la nueva funci�n de //pertenencia double[] mergedparam = new double[mf1.get().length]; //.length]; //inicializa la nueva funci�n de pertenencia como el clon de la primera que //pasa como par�metro ParamMemFunc mergedmf = (ParamMemFunc) mf1.clone(universe); Parameter[] pm1 = mf1.getParameters(); Parameter[] pm2 = mf2.getParameters(); try { //recorre todos los par�metros de las dos funciones de pertenencia //orginales for (int i = 0; i < mergedparam.length; i++) { //nuevo par�metro que ser� a�adido a la nueva funci�n de pertenencia double param = 0; //si se est� tratando los centros de las campanas originales... if (pm1[i].getName().equals("a")) { //...el nuevo par�metro ser� igual a la media de los centros de las //funciones de pertenencia orginales param = (pm1[i].value + pm2[i].value) / 2; //se almacena la media de la primera de las funciones de //pertenencia... mf1Mean = pm1[i].value; //...y tambi�n de la segunda mf2Mean = pm2[i].value; } //...si se est� tratando la desviaci�n t�pica de las campanas //originales... else if (pm1[i].getName().equals("b")) { //...el nuevo par�metro es igual a la suma de las medias de las //campanas originales entre seis y el m�ximo de las desviaciones //t�picas param = Math.abs( (mf1Mean - mf2Mean) / 6) + Math.max(pm1[i].value, pm2[i].value); } //a�ade el nuevo par�metro al vector de par�metros para la nueva //funci�n de pertenencia mergedparam[i] = param; } //establece los par�metros de la nueva funci�n de pertenencia mergedmf.set(mergedparam); } catch (XflException e) { } //devuelve la nueva funci�n de pertenencia creada return mergedmf; } }