using System;
namespace Fuzzy_Logic_Library
{
/// <summary>
/// Fuzzy number class deals with fuzzy numbers
/// </summary>
public class FuzzyNumber : FuzzyBasic
{
public FuzzyNumber() : base()
{
//
// TODO: Add constructor logic here
//
}
public FuzzyNumber( double number ) : base()
{
Number = number;
}
public FuzzyNumber( FuzzyNumber fuzzy ) : base()
{
this.ID = fuzzy.ID;
this.Maximum = fuzzy.Maximum;
this.Membership = fuzzy.Membership;
this.Minimum = fuzzy.Minimum;
this.Name = fuzzy.Name;
this.Number = fuzzy.Number;
}
public FuzzyNumber( double rangeLow, double rangeHigh ) : base()
{
Minimum = rangeLow;
Maximum = rangeHigh;
Number = rangeLow + ( ( rangeHigh - rangeLow ) /2 );
Membership = 1.0;
}
public FuzzyNumber( double number, double rangeLow, double rangeHigh ) : base()
{
Minimum = rangeLow;
Maximum = rangeHigh;
Number = number;
Membership = 0.0;
SetMembership();
}
public FuzzyNumber( string name, double number )
{
Minimum = number - 10;
Maximum = number + 10;
Number = number;
SetMembership();
Name = name;
}
public FuzzyNumber( string name, double number, double rangeLow, double rangeHigh ) : base()
{
Minimum = rangeLow;
Maximum = rangeHigh;
Number = number;
SetMembership();
Name = name;
}
public FuzzyNumber( string name, double rangeLow, double rangeHigh ) : base()
{
Minimum = rangeLow;
Maximum = rangeHigh;
Number = rangeLow + ( ( rangeHigh - rangeLow ) / 2 );
Membership = 1.0;
Name = name;
}
public FuzzyNumber( string name, double number, double rangeLow, double rangeHigh, bool bUseMaxAsComplete ) : base()
{
Minimum = rangeLow;
if( bUseMaxAsComplete == true )
Maximum = rangeHigh + rangeHigh;
else
Maximum = rangeHigh;
Number = number;
Membership = 0.0;
Name = name;
SetMembership();
}
public override string ToString()
{
return base.ToString() + ", Number = " + Number.ToString() + ", Minimum = " + Minimum.ToString() + ", Maximum = " + Maximum.ToString() + ", Membership = " + Membership.ToString();
}
/// <summary>
/// Overloaded operators Note no attempt is made to check for minimum and maximum
/// values this is up to the code using the class
/// </summary>
public static FuzzyNumber operator +( FuzzyNumber num, double number )
{
FuzzyNumber fuzzTemp = new FuzzyNumber( num.Number + number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
public static FuzzyNumber operator +( FuzzyNumber num, FuzzyNumber number )
{
FuzzyNumber fuzzTemp = new FuzzyNumber( num.Number + number.Number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
public static FuzzyNumber operator -( FuzzyNumber num, double number )
{
FuzzyNumber fuzzTemp = new FuzzyNumber( num.Number - number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
public static FuzzyNumber operator -( FuzzyNumber num, FuzzyNumber number )
{
FuzzyNumber fuzzTemp = new FuzzyNumber( num.Number - number.Number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
public static FuzzyNumber operator *( FuzzyNumber num, double number )
{
FuzzyNumber fuzzTemp;
if( num.Number == 0.0 || number == 0.0 )
{
fuzzTemp = new FuzzyNumber( num.Number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
fuzzTemp = new FuzzyNumber( num.Number * number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
public static FuzzyNumber operator *( FuzzyNumber num, FuzzyNumber number )
{
FuzzyNumber fuzzTemp;
if( num.Number == 0.0 || number.Number == 0.0 )
{
fuzzTemp = new FuzzyNumber( num.Number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
fuzzTemp = new FuzzyNumber( num.Number * number.Number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
public static FuzzyNumber operator /( FuzzyNumber num, double number )
{
FuzzyNumber fuzzTemp;
if( num.Number == 0.0 || number == 0.0 )
{
fuzzTemp = new FuzzyNumber( num.Number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
fuzzTemp = new FuzzyNumber( num.Number / number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
public static FuzzyNumber operator /( FuzzyNumber num, FuzzyNumber number )
{
FuzzyNumber fuzzTemp;
if( num.Number == 0.0 || number.Number == 0.0 )
{
fuzzTemp = new FuzzyNumber( num.Number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
fuzzTemp = new FuzzyNumber( num.Number / number.Number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
public static FuzzyNumber operator %( FuzzyNumber num, double number )
{
FuzzyNumber fuzzTemp;
if( num.Number == 0.0 || number == 0.0 )
{
fuzzTemp = new FuzzyNumber( num.Number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
fuzzTemp = new FuzzyNumber( num.Number % number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
public static FuzzyNumber operator %( FuzzyNumber num, FuzzyNumber number )
{
FuzzyNumber fuzzTemp;
if( num.Number == 0.0 || number.Number == 0.0 )
{
fuzzTemp = new FuzzyNumber( num.Number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
fuzzTemp = new FuzzyNumber( num.Number % number.Number, num.Minimum, num.Maximum );
fuzzTemp.SetMembership();
return fuzzTemp;
}
}
/// <summary>
/// The fuzzy set class for holding and manipulating fuzzy numbers
/// </summary>
public class FuzzyNumberSet : FuzzySet
{
private double setValue;
public double FuzzySetValue
{
get
{
return setValue;
}
set
{
setValue = value;
UpdateSetValue();
}
}
/// <summary>
/// basic constructor
/// </summary>
public FuzzyNumberSet() : base()
{
}
public FuzzyNumberSet( string name ) : base()
{
Name = name;
}
/// <summary>
/// conbstructor that creates a number of empty fuzzy numbers
/// </summary>
/// <param name="nNumberCount"></param>
public FuzzyNumberSet( int nNumberCount ) : base()
{
for( int i=0; i<nNumberCount; i++ )
{
FuzzyNumber temp = new FuzzyNumber();
Add( temp );
}
}
/// <summary>
/// constructor that takes the first fuzzy number
/// </summary>
/// <param name="fuzzyNum"></param>
public FuzzyNumberSet( FuzzyNumber fuzzyNum ) : base()
{
Add( fuzzyNum );
}
/// <summary>
/// constructor that takes the values for the first fuzzy number
/// </summary>
/// <param name="number"></param>
/// <param name="minimum"></param>
/// <param name="maximum"></param>
public FuzzyNumberSet( double number, double minimum, double maximum ) : base()
{
FuzzyNumber temp = new FuzzyNumber( number, minimum, maximum );
Add( temp );
}
/// <summary>
/// Add a Fuzzy Number to the set
/// </summary>
/// <param name="fuzzyNumber"></param>
public void AddFuzzyNumber( FuzzyNumber fuzzyNumber )
{
Add( fuzzyNumber );
}
/// <summary>
/// Add a fuzzy number to the set
/// </summary>
/// <param name="number"></param>
/// <param name="minimum"></param>
/// <param name="maximum"></param>
public void AddFuzzyNumber( double number, double minimum, double maximum )
{
Add( new FuzzyNumber( number, minimum, maximum ) );
}
/// <summary>
/// get the name of the current value of the set
/// </summary>
/// <returns></returns>
public override string GetTerm()
{
for( int i=0; i<this.Count; i++ )
{
FuzzyNumber temp = ( FuzzyNumber )this[ i ];
if( temp.Number == this.FuzzySetValue )
{
return temp.Name;
}
}
return null;
}
/// <summary>
/// Is the current value within the specified term ( name of the fuzzy number )
///
/// </summary>
/// <param name="strTerm">name of the fuzzy number that the value is supposed to be within</param>
/// <returns>true or false</returns>
public override bool IsTerm( string strTerm )
{
for( int i=0; i<this.Count; i++ )
{
if( ( ( FuzzyBasic )this[ i ] ).Name == strTerm )
{
FuzzyBasic temp = ( FuzzyBasic )this[ i ];
if( temp.Maximum >= this.setValue && temp.Minimum <= this.setValue )
{
return true;
}
else
return false;
}
}
return false;
}
/// <summary>
/// gets the default membership value for the term ie when membership == 1
/// therefore gets the middle value
/// </summary>
/// <param name="strTerm"></param>
/// <returns></returns>
public override double ValueFromTerm( string strTerm )
{
for( int i=0; i<this.Count; i++ )
{
FuzzyNumber temp = ( FuzzyNumber )this[ i ];
if( temp.Name == strTerm )
{
return ( temp.Maximum - ( ( temp.Maximum - temp.Minimum ) / 2 ) );
}
}
return 0.0;
}
/// <summary>
/// Set the value for the Set to the Name of a passed in fuzzy number
/// </summary>
/// <param name="strTerm"></param>
public override void SetToTerm( string strTerm )
{
this.FuzzySetValue = ValueFromTerm( strTerm );
}
/// <summary>
/// update the individual fuzzy numbers when the set value changes
/// </summary>
private void UpdateSetValue()
{
for( int i=0; i<this.Count; i++ )
{
if( this.FuzzySetValue <= ( ( FuzzyNumber )this[ i ] ).Maximum
&& this.FuzzySetValue >= ( ( FuzzyNumber )this[ i ] ).Minimum )
{
( ( FuzzyNumber )this[ i ] ).Number = this.FuzzySetValue;
}
else
( ( FuzzyNumber )this[ i ] ).Number = 0.0;
}
}
/// Set operations
/// Set Operations need to go here as you can't create a base class set ( FuzzySet ) and
/// then down cast it in CSharp
/// ( Still thinking in C++ )
/// <summary>
/// return a union of the two passed sets
/// </summary>
/// <param name="setOne"></param>
/// <param name="setTwo"></param>
/// <returns></returns>
public FuzzyNumberSet Union( FuzzyNumberSet fuzzySet )
{
FuzzyNumberSet returnSet = new FuzzyNumberSet();
bool bFound = false;
for( int i=0; i<Count; i++ )
{
returnSet[ returnSet.Count + 1 ] = new FuzzyNumber( ( FuzzyNumber )this[ i ] );
}
/// Get the ones in set one but not in set two
for( int i=0; i<fuzzySet.Count; i++ )
{
bFound = false;
for( int n=0; n<this.Count; n++ )
{
if( ( ( FuzzyNumber )fuzzySet[ i ] ).Maximum == ( ( FuzzyNumber )this[ n ] ).Maximum &&
( ( FuzzyNumber )fuzzySet[ i ] ).Membership == ( ( FuzzyNumber )this[ n ] ).Membership &&
( ( FuzzyNumber )fuzzySet[ i ] ).Minimum == ( ( FuzzyNumber )this[ n ] ).Minimum &&
( ( FuzzyNumber )fuzzySet[ i ] ).Number == ( ( FuzzyNumber )this[ n ] ).Number )
{
bFound = true;
n=fuzzySet.Count;
}
}
if( bFound == false )
{
returnSet[ returnSet.Count + 1 ] = new FuzzyNumber( ( FuzzyNumber )fuzzySet[ i ] );
}
}
return returnSet;
}
/// <summary>
/// Union override that allows the setting of the membership parameters
/// </summary>
/// <param name="setOne"></param>
/// <param name="setTwo"></param>
/// <param name="setParams"></param>
/// <returns></returns>
public FuzzyNumberSet Union( FuzzyNumberSet fuzzySet, FuzzySetParameters setParams )
{
FuzzyNumberSet returnSet = new FuzzyNumberSet();
double dSetOneMinMinimum;
double dSetOneMaxMinimum;
double dSetOneMinMembership;
double dSetOneMaxMembership;
double dSetOneMinMaximum;
double dSetOneMaxMaximum;
double dSetOneMinNumber;
double dSetOneMaxNumber;
double dSetTwoMinMinimum;
double dSetTwoMaxMinimum;
double dSetTwoMinMembership;
double dSetTwoMaxMembership;
double dSetTwoMinMaximum;
double dSetTwoMaxMaximum;
double dSetTwoMinNumber;
double dSetTwoMaxNumber;
/// get all the items from set one that fit the required ( passed in ) parameters.
for( int i=0; i<this.Count; i++ )
{
if( setParams.SetOneMaxMembership == 0 )
dSetOneMaxMembership = ( ( FuzzyNumber )this[ i ] ).Membership;
else
dSetOneMaxMembership = setParams.SetOneMaxMembership;
if( setParams.SetOneMaxMinimum == 0 )
dSetOneMaxMinimum = ( ( FuzzyNumber )this[ i ] ).Minimum;
else
dSetOneMaxMinimum = setParams.SetOneMaxMinimum;
if( setParams.SetOneMaxNumber == 0 )
dSetOneMaxNumber = ( ( FuzzyNumber )this[ i ] ).Number;
else
dSetOneMaxNumber = setParams.SetOneMaxNumber;
if( setParams.SetOneMinMaximum == 0 )
dSetOneMinMaximum = ( ( FuzzyNumber )this[ i ] ).Maximum;
else
dSetOneMinMaximum = setParams.SetOneMinMaximum;
if( setParams.SetOneMaxMaximum == 0 )
dSetOneMaxMaximum = ( ( FuzzyNumber )this[ i ] ).Maximum;
else
dSetOneMaxMaximum = setParams.SetOneMaxMaximum;
if( setParams.SetOneMinMembership == 0 )
dSetOneMinMembership = ( ( FuzzyNumber )this[ i ] ).Membership;
else
dSetOneMinMembership = setParams.SetOneMinMembership;
if( setParams.SetOneMinMinimum == 0 )
dSetOneMinMinimum = ( ( FuzzyNumber )this[ i ] ).Minimum;
else
dSetOneMinMinimum = setParams.SetOneMinMinimum;
if( setParams.SetOneMinNumber == 0 )
dSetOneMinNumber = ( ( FuzzyNumber )this[ i ] ).Number;
else
dSetOneMinNumber = setParams.SetOneMinNumber;
if( ( ( FuzzyNumber )this[ i ] ).Membership <= dSetOneMaxMembership &&
( ( FuzzyNumber )this[ i ] ).Maximum <= dSetOneMaxMaximum &&
( ( FuzzyNumber )this[ i ] ).Minimum <= dSetOneMaxMinimum &&
( ( FuzzyNumber )this[ i ] ).Number <= dSetOneMaxNumber &&
( ( FuzzyNumber )this[ i ] ).Membership >= dSetOneMinMembership &&
( ( FuzzyNumber )this[ i ] ).Maximum >= dSetOneMinMaximum &&
( ( FuzzyNumber )this[ i ] ).Minimum >= dSetOneMinMinimum &&
( ( FuzzyNumber )this[ i ] ).Number >= dSetOneMinNumber )
{
returnSet[ returnSet.Count + 1 ] = new FuzzyNumber( ( FuzzyNumber )this[ i ] );
}
}
/// Get the ones in set two, not in set one ( though none should be when comparing different sets )
for( int i=0; i<fuzzySet.Count; i++ )
{
if( setParams.SetTwoMaxMembership == 0 )
dSetTwoMaxMembership = ( ( FuzzyNumber )fuzzySet[ i ] ).Membership;
else
dSetTwoMaxMembership = setParams.SetTwoMaxMembership;
if( setParams.SetTwoMaxMinimum == 0 )
dSetTwoMaxMinimum = ( ( FuzzyNumber )fuzzySet[ i ] ).Minimum;
else
dSetTwoMaxMinimum = setParams.SetTwoMaxMinimum;
if( setParams.SetTwoMaxNumber == 0 )
dSetTwoMaxNumber = ( ( FuzzyNumber )fuzzySet[ i ] ).Number;
else
dSetTwoMaxNumber = setParams.SetTwoMaxNumber;
if( setParams.SetTwoMinMaximum == 0 )
dSetTwoMinMaximum = ( ( FuzzyNumber )fuzzySet[ i ] ).Maximum;
else
dSetTwoMinMaximum = setParams.SetTwoMinMaximum;
if( setParams.SetTwoMaxMaximum == 0 )
dSetTwoMaxMaximum = ( ( FuzzyNumber )fuzzySet[ i ] ).Maximum;
else
dSetTwoMaxMaximum = setParams.SetTwoMaxMaximum;
if( setParams.SetTwoMinMembership == 0 )
dSetTwoMinMembership = ( ( FuzzyNumber )fuzzySet[ i ] ).Membership;
else
dSetTwoMinMembership = setParams.SetTwoMinMembership;
if( setParams.SetTwoMinMinimum == 0 )
dSetTwoMinMinimum = ( ( FuzzyNumber )fuzzySet[ i ] ).Minimum;
else
dSetTwoMinMinimum = setParams.SetTwoMinMinimum;
if( setParams.SetTwoMinNumber == 0 )
dSetTwoMinNumber = ( ( FuzzyNumber )fuzzySet[ i ] ).Number;
else
dSetTwoMinNumber = setParams.SetTwoMinNumber;
for( int n=0; n<fuzzySet.Count; n++ )
{
if( setParams.SetOneMaxMembership == 0 )
dSetOneMaxMembership = ( ( FuzzyNumber )this[ n ] ).Membership;
else
dSetOneMaxMembership = setParams.SetOneMaxMembership;
if( setParams.SetOneMaxMinimum == 0 )
dSetOneMaxMinimum = ( ( FuzzyNumber )this[ n ] ).Minimum;
else
dSetOneMaxMinimum = setParams.SetOneMaxMinimum;
if( setParams.SetOneMaxNumber == 0 )
dSetOneMaxNumber = ( ( FuzzyNumber )this[ n ] ).Number;
else
dSetOneMaxNumber = setParams.SetOneMaxNumber;
if( setParams.SetOneMinMaximum == 0 )
dSetOneMinMaximum = ( ( FuzzyNumber )this[ n ] ).Maximum;
else
dSetOneMinMaximum = setParams.SetOneMinMaximum;
if( setParams.SetOneMaxMaximum == 0 )
dSetOneMaxMaximum = ( ( FuzzyNumber )this[ n ] ).Maximum;
else
dSetOneMaxMaximum = setParams.SetOneMaxMaximum;
if( setParams.SetOneMinMembership == 0 )
dSetOneMinMembership = ( ( FuzzyNumber )this[ n ] ).Membership;
else
dSetOneMinMembership = setParams.SetOneMinMembership;
if( setParams.SetOneMinMinimum == 0 )
dSetOneMinMinimum = ( ( FuzzyNumber )this[ n ] ).Minimum;
else
dSetOneMinMinimum = setParams.SetOneMinMinimum;
if( setParams.SetOneMinNumber == 0 )
dSetOneMinNumber = ( ( FuzzyNumber )this[ n ] ).Number;
else
dSetOneMinNumber = setParams.SetOneMinNumber;
if( ( ( FuzzyNumber )this[ n ] ).Maximum >= dSetOneMinMaximum &&
( ( FuzzyNumber )fuzzySet[ i ] ).Maximum >= dSetTwoMinMaximum &&
( ( FuzzyNumber )this[ n ] ).Maximum <= dSetOneMaxMaximum &&
( ( FuzzyNumber )fuzzySet[ i ] ).Maximum <= dSetTwoMaxMaximum &&
( ( FuzzyNumber )this[ n ] ).Membership >= dSetOneMinMembership &&
( ( FuzzyNumber )fuzzySet[ i ] ).Membership >= dSetTwoMinMembership &&
( ( FuzzyNumber )this[ n ] ).Membership <= dSetOneMaxMembership &&
( ( FuzzyNumber )fuzzySet[ i ] ).Membership <= dSetTwoMaxMembership &&
( ( FuzzyNumber )this[ n ] ).Minimum >= dSetOneMinMinimum &&
( ( FuzzyNumber )fuzzySet[ i ] ).Minimum >= dSetTwoMinMinimum &&
( ( FuzzyNumber )this[ n ] ).Minimum <= dSetOneMaxMinimum &&
( ( FuzzyNumber )fuzzySet[ i ] ).Minimum <= dSetTwoMaxMinimum &&
( ( FuzzyNumber )this[ n ] ).Number >= dSetOneMinNumber &&
( ( FuzzyNumber )fuzzySet[ i ] ).Number >= dSetTwoMinNumber &&
( ( FuzzyNumber )this[ n ] ).Number <= dSetOneMaxNumber &&
( ( FuzzyNumber )fuzzySet[ i ] ).Number <= dSetTwoMaxNumber )
{
if( returnSet.IsInSet( ( FuzzyNumber )fuzzySet[ i ] ) == false )
{
returnSet[ returnSet.Count + 1 ] = new FuzzyNumber( ( FuzzyNumber )fuzzySet[ i ] );
}
}
}
}
return returnSet;
}
/// <summary>
/// return an intersection of the two sets
/// </summary>
/// <param name="setOne"></param>
/// <param name="?"></param>
/// <returns></returns>
public FuzzyNumberSet Intersection( FuzzyNumberSet fuzzySet )
{
FuzzyNumberSet returnSet = new FuzzyNumberSet();
for( int i=0; i<this.Count; i++ )
{
for( int n=0; n<fuzzySet.Count; n++ )
{
/// can't decide if name and id should be in here or not
/// leave them out for now as they are meant to be optional
if( ( ( FuzzyNumber )this[ i ] ).Maximum == ( ( FuzzyNumber )fuzzySet[ n ] ).Maximum &&
( ( FuzzyNumber )this[ i ] ).Membership == ( ( FuzzyNumber )fuzzySet[ n ] ).Membership &&
( ( FuzzyNumber )this[ i ] ).Minimum == ( ( FuzzyNumber )fuzzySet[ n ] ).Minimum &&
( ( FuzzyNumber )this[ i ] ).Number == ( ( FuzzyNumber )fuzzySet[ n ] ).Number )
{
returnSet[ returnSet.Count + 1 ] = new FuzzyNumber( ( FuzzyNumber )this[ i ] );
}
}
}
return returnSet;
}
/// <summary>
/// return an intersection of the two sets and allow the passing in of the required membership values
/// </summary>
/// <param name="setOne"></param>
/// <param name="setTwo"></param>
/// <param name="setOneMinMembership"></param>
/// <param name="setOneMaxMembership"></param>
/// <param name="setTwoMinMembership"></param>
/// <param name="setTwoMaxMembership"></param>
/// <returns></returns>
public FuzzyNumberSet Intersection( FuzzyNumberSet fuzzySet, FuzzySetParameters setParams )
{
FuzzyNumberSet returnSet = new FuzzyNumberSet();
double dSetOneMinMinimum;
double dSetOneMaxMinimum;
double dSetOneMinMembership;
double dSetOneMaxMembership;
double dSetOneMinMaximum;
double dSetOneMaxMaximum;
double dSetOneMinNumber;
double dSetOneMaxNumber;
double dSetTwoMinMinimum;
double dSetTwoMaxMinimum;
double dSetTwoMinMembership;
double dSetTwoMaxMembership;
double dSetTwoMinMaximum;
double dSetTwoMaxMaximum;
double dSetTwoMinNumber;
double dSetTwoMaxNumber;
for( int i=0; i<this.Count; i++ )
{
if( setParams.SetOneMaxMembership == 0 )
dSetOneMaxMembership = ( ( FuzzyNumber )this[ i ] ).Membership;
else
dSetOneMaxMembership = setParams.SetOneMaxMembership;
if( setParams.SetOneMaxMinimum == 0 )
dSetOneMaxMinimum = ( ( FuzzyNumber )this[ i ] ).Minimum;
else
dSetOneMaxMinimum = setParams.SetOneMaxMinimum;
if( setParams.SetOneMaxNumber == 0 )
dSetOneMaxNumber = ( ( FuzzyNumber )this[ i ] ).Number;
else
dSetOneMaxNumber = setParams.SetOneMaxNumber;
if( setParams.SetOneMinMaximum == 0 )
dSetOneMinMaximum = ( ( FuzzyNumber )this[ i ] ).Maximum;
else
dSetOneMinMaximum = setParams.SetOneMinMaximum;
if( setParams.SetOneMaxMaximum == 0 )
dSetOneMaxMaximum = ( ( FuzzyNumber )this[ i ] ).Maximum;
else
dSetOneMaxMaximum = setParams.SetOneMaxMaximum;
if( setParams.SetOneMinMembership == 0 )
dSetOneMinMembership = ( ( FuzzyNumber )this[ i ] ).Membership;
else
dSetOneMinMembership = setParams.SetOneMinMembership;
if( setParams.SetOneMinMinimum == 0 )
dSetOneMinMinimum = ( ( FuzzyNumber )this[ i ] ).Minimum;
else
dSetOneMinMinimum = setParams.SetOneMinMinimum;
if( setParams.SetOneMinNumber == 0 )
dSetOneMinNumber = ( ( FuzzyNumber )this[ i ] ).Number;
else
dSetOneMinNumber = setParams.SetOneMinNumber;
for( int n=0; n<fuzzySet.Count; n++ )
{
if( setParams.SetTwoMaxMembership == 0 )
dSetTwoMaxMembership = ( ( FuzzyNumber )fuzzySet[ n ] ).Membership;
else
dSetTwoMaxMembership = setParams.SetTwoMaxMembership;
if( setParams.SetTwoMaxMinimum == 0 )
dSetTwoMaxMinimum = ( ( FuzzyNumber )fuzzySet[ n ] ).Minimum;
else
dSetTwoMaxMinimum = setParams.SetTwoMaxMinimum;
if( setParams.SetTwoMaxNumber == 0 )
dSetTwoMaxNumber = ( ( FuzzyNumber )fuzzySet[ n ] ).Number;
else
dSetTwoMaxNumber = setParams.SetTwoMaxNumber;
if( setParams.SetTwoMinMaximum == 0 )
dSetTwoMinMaximum = ( ( FuzzyNumber )fuzzySet[ n ] ).Maximum;
else
dSetTwoMinMaximum = setParams.SetTwoMinMaximum;
if( setParams.SetTwoMaxMaximum == 0 )
dSetTwoMaxMaximum = ( ( FuzzyNumber )fuzzySet[ n ] ).Maximum;
else
dSetTwoMaxMaximum = setParams.SetTwoMaxMaximum;
if( setParams.SetTwoMinMembership == 0 )
dSetTwoMinMembership = ( ( FuzzyNumber )fuzzySet[ n ] ).Membership;
else
dSetTwoMinMembership = setParams.SetTwoMinMembership;
if( setParams.SetTwoMinMinimum == 0 )
dSetTwoMinMinimum = ( ( FuzzyNumber )fuzzySet[ n ] ).Minimum;
else
dSetTwoMinMinimum = setParams.SetTwoMinMinimum;
if( setParams.SetTwoMinNumber == 0 )
dSetTwoMinNumber = ( ( FuzzyNumber )fuzzySet[ n ] ).Number;
else
dSetTwoMinNumber = setParams.SetTwoMinNumber;
if( ( ( FuzzyNumber )this[ i ] ).Maximum >= dSetOneMinMaximum &&
( ( FuzzyNumber )fuzzySet[ n ] ).Maximum >= dSetTwoMinMaximum &&
( ( FuzzyNumber )this[ i ] ).Maximum <= dSetOneMaxMaximum &&
( ( FuzzyNumber )fuzzySet[ n ] ).Maximum <= dSetTwoMaxMaximum &&
( ( FuzzyNumber )this[ i ] ).Membership >= dSetOneMinMembership &&
( ( FuzzyNumber )fuzzySet[ n ] ).Membership >= dSetTwoMinMembership &&
( ( FuzzyNumber )this[ i ] ).Membership <= dSetOneMaxMembership &&
( ( FuzzyNumber )fuzzySet[ n ] ).Membership <= dSetTwoMaxMembership &&
( ( FuzzyNumber )this[ i ] ).Minimum >= dSetOneMinMinimum &&
( ( FuzzyNumber )fuzzySet[ n ] ).Minimum >= dSetTwoMinMinimum &&
( ( FuzzyNumber )this[ i ] ).Minimum <= dSetOneMaxMinimum &&
( ( FuzzyNumber )fuzzySet[ n ] ).Minimum <= dSetTwoMaxMinimum &&
( ( FuzzyNumber )this[ i ] ).Number >= dSetOneMinNumber &&
( ( FuzzyNumber )fuzzySet[ n ] ).Number >= dSetTwoMinNumber &&
( ( FuzzyNumber )this[ i ] ).Number <= dSetOneMaxNumber &&
( ( FuzzyNumber )fuzzySet[ n ] ).Number <= dSetTwoMaxNumber )
{
if( dSetOneMinMaximum >= dSetTwoMinMaximum &&
dSetOneMaxMaximum <= dSetTwoMaxMaximum &&
dSetOneMinMembership >= dSetTwoMinMembership &&
dSetOneMaxMembership <= dSetTwoMaxMembership &&
dSetOneMinMinimum >= dSetTwoMinMinimum &&
dSetOneMaxMinimum <= dSetTwoMaxMinimum &&
dSetOneMinNumber >= dSetTwoMinNumber &&
dSetOneMaxNumber <= dSetTwoMaxNumber )
{
returnSet[ returnSet.Count + 1 ] = new FuzzyNumber( ( FuzzyNumber )this[ i ] );
}
}
}
}
return returnSet;
}
/// <summary>
/// return an exclusive or set
/// </summary>
/// <param name="setOne"></param>
/// <param name="setTwo"></param>
/// <returns></returns>
public FuzzyNumberSet ExclusiveOR( FuzzyNumberSet fuzzySet )
{
FuzzyNumberSet returnSet = new FuzzyNumberSet();
bool bFound = false;
/// Get the ones in set one but not in set two
for( int i=0; i<this.Count; i++ )
{
bFound = false;
for( int n=0; n<fuzzySet.Count; n++ )
{
if( ( ( FuzzyNumber )this[ i ] ).Maximum == ( ( FuzzyNumber )fuzzySet[ n ] ).Maximum &&
( ( FuzzyNumber )this[ i ] ).Membership == ( ( FuzzyNumber )fuzzySet[ n ] ).Membership &&
( ( FuzzyNumber )this[ i ] ).Minimum == ( ( FuzzyNumber )fuzzySet[ n ] ).Minimum &&
( ( FuzzyNumber )this[ i ] ).Number == ( ( FuzzyNumber )fuzzySet[ n ] ).Number )
{
bFound = true;
n=fuzzySet.Count;
}
}
if( bFound == false )
{
returnSet[ returnSet.Count + 1 ] = new FuzzyNumber( ( FuzzyNumber )this[ i ] );
}
}
/// get the ones in set two but not in set one
for( int i=0; i<fuzzySet.Count; i++ )
{
bFound = false;
for( int n=0; n<this.Count; n++ )
{
if( ( ( FuzzyNumber )fuzzySet[ i ] ).Maximum == ( ( FuzzyNumber )this[ n ] ).Maximum &&
( ( FuzzyNumber )fuzzySet[ i ] ).Membership == ( ( FuzzyNumber )this[ n ] ).Membership &&
( ( FuzzyNumber )fuzzySet[ i ] ).Minimum == ( ( FuzzyNumber )this[ n ] ).Minimum &&
( ( FuzzyNumber )fuzzySet[ i ] ).Number == ( ( FuzzyNumber )this[ n ] ).Number )
{
bFound = true;
n=this.Count;
}
}
if( bFound == false )
{
returnSet[ returnSet.Count + 1 ] = new FuzzyNumber( ( FuzzyNumber )fuzzySet[ i ] );
}
}
return returnSet;
}
/// <summary>
/// exclusive or taking the fuzzy parameter set.
/// </summary>
/// <param name="setOne"></param>
/// <param name="setTwo"></param>
/// <param name="setParams"></param>
/// <returns></returns>
public FuzzyNumberSet ExclusiveOR( FuzzyNumberSet fuzzySet, FuzzySetParameters setParams )
{
FuzzyNumberSet returnSet = new FuzzyNumberSet();
bool bFound = false;
double dSetOneMinMinimum;
double dSetOneMaxMinimum;
double dSetOneMinMembership;
double dSetOneMaxMembership;
double dSetOneMinMaximum;
double dSetOneMaxMaximum;
double dSetOneMinNumber;
double dSetOneMaxNumber;
double dSetTwoMinMinimum;
double dSetTwoMaxMinimum;
double dSetTwoMinMembership;
double dSetTwoMaxMembership;
double dSetTwoMinMaximum;
double dSetTwoMaxMaximum;
double dSetTwoMinNumber;
double dSetTwoMaxNumber;
/// Get the ones in set one but not in set two
for( int i=0; i<this.Count; i++ )
{
bFound = false;
if( setParams.SetOneMaxMembership == 0 )
dSetOneMaxMembership = ( ( FuzzyNumber )this[ i ] ).Membership;
else
dSetOneMaxMembership = setParams.SetOneMaxMembership;
if( setParams.SetOneMaxMinimum == 0 )
dSetOneMaxMinimum = ( ( FuzzyNumber )this[ i ] ).Minimum;
else
dSetOneMaxMinimum = setParams.SetOneMaxMinimum;
if( setParams.SetOneMaxNumber == 0 )
dSetOneMaxNumber = ( ( FuzzyNumber )this[ i ] ).Number;
else
dSetOneMaxNumber = setParams.SetOneMaxNumber;
if( setParams.SetOneMinMaximum == 0 )
dSetOneMinMaximum = ( ( FuzzyNumber )this[ i ] ).Maximum;
else
dSetOneMinMaximum = setParams.SetOneMinMaximum;
if( setParams.SetOneMaxMaximum == 0 )
dSetOneMaxMaximum = ( ( FuzzyNumber )this[ i ] ).Maximum;
else
dSetOneMaxMaximum = setParams.SetOneMaxMaximum;
if( setParams.SetOneMinMembership == 0 )
dSetOneMinMembership = ( ( FuzzyNumber )this[ i ] ).Membership;
else
dSetOneMinMembership = setParams.SetOneMinMembership;
if( setParams.SetOneMinMinimum == 0 )
dSetOneMinMinimum = ( ( FuzzyNumber )this[ i ] ).Minimum;
else
dSetOneMinMinimum = setParams.SetOneMinMinimum;
if( setParams.SetOneMinNumber == 0 )
dSetOneMinNumber = ( ( FuzzyNumber )this[ i ] ).Number;
else
dSetOneMinNumber = setParams.SetOneMinNumber;
for( int n=0; n<fuzzySet.Count; n++ )
{
if( setParams.SetTwoMaxMembership == 0 )
dSetTwoMaxMembership = ( ( FuzzyNumber )fuzzySet[ n ] ).Membership;
else
dSetTwoMaxMembership = setParams.SetTwoMaxMembership;
if( setParams.SetTwoMaxMinimum == 0 )
dSetTwoMaxMinimum = ( ( FuzzyNumber )fuzzySet[ n ] ).Minimum;
else
dSetTwoMaxMinimum = setParams.SetTwoMaxMinimum;
if( setParams.SetTwoMaxNumber == 0 )
dSetTwoMaxNumber = ( ( FuzzyNumber )fuzzySet[ n ] ).Number;
else
dSetTwoMaxNumber = setParams.SetTwoMaxNumber;
if( setParams.SetTwoMinMaximum == 0 )
dSetTwoMinMaximum = ( ( FuzzyNumber )fuzzySet[ n ] ).Maximum;
else
dSetTwoMinMaximum = setParams.SetTwoMinMaximum;
if( setParams.SetTwoMaxMaximum == 0 )
dSetTwoMaxMaximum = ( ( FuzzyNumber )fuzzySet[ n ] ).Maximum;
else
dSetTwoMaxMaximum = setParams.SetTwoMaxMaximum;
if( setParams.SetTwoMinMembership == 0 )
dSetTwoMinMembership = ( ( FuzzyNumber )fuzzySet[ n ] ).Membership;
else
dSetTwoMinMembership = setParams.SetTwoMinMembership;
if( setParams.SetTwoMinMinimum == 0 )
dSetTwoMinMinimum = ( ( FuzzyNumber )fuzzySet[ n ] ).Minimum;
else
dSetTwoMinMinimum = setParams.SetTwoMinMinimum;
if( setParams.SetTwoMinNumber == 0 )
dSetTwoMinNumber = ( ( FuzzyNumber )fuzzySet[ n ] ).Number;
else
dSetTwoMinNumber = setParams.SetTwoMinNumber;
if( dSetOneMinMaximum >= dSetTwoMinMaximum &&
dSetOneMaxMaximum <= dSetTwoMaxMaximum &&
dSetOneMinMembership >= dSetTwoMinMembership &&
dSetOneMaxMembership <= dSetTwoMaxMembership &&
dSetOneMinMinimum >= dSetTwoMinMinimum &&
dSetOneMaxMinimum <= dSetTwoMaxMinimum &&
dSetOneMinNumber >= dSetTwoMinNumber &&
dSetOneMaxNumber <= dSetTwoMaxNumber )
{
bFound = true;
n=fuzzySet.Count;
}
}
if( bFound == false )
{
returnSet[ returnSet.Count + 1 ] = new FuzzyNumber( ( FuzzyNumber )this[ i ] );
}
}
/// get the ones in set two but not in set one
for( int i=0; i<fuzzySet.Count; i++ )
{
bFound = false;
if( setParams.SetTwoMaxMembership == 0 )
dSetTwoMaxMembership = ( ( FuzzyNumber )fuzzySet[ i ] ).Membership;
else
dSetTwoMaxMembership = setParams.SetTwoMaxMembership;
if( setParams.SetTwoMaxMinimum == 0 )
dSetTwoMaxMinimum = ( ( FuzzyNumber )fuzzySet[ i ] ).Minimum;
else
dSetTwoMaxMinimum = setParams.SetTwoMaxMinimum;
if( setParams.SetTwoMaxNumber == 0 )
dSetTwoMaxNumber = ( ( FuzzyNumber )fuzzySet[ i ] ).Number;
else
dSetTwoMaxNumber = setParams.SetTwoMaxNumber;
if( setParams.SetTwoMinMaximum == 0 )
dSetTwoMinMaximum = ( ( FuzzyNumber )fuzzySet[ i ] ).Maximum;
else
dSetTwoMinMaximum = setParams.SetTwoMinMaximum;
if( setParams.SetTwoMaxMaximum == 0 )
dSetTwoMaxMaximum = ( ( FuzzyNumber )fuzzySet[ i ] ).Maximum;
else
dSetTwoMaxMaximum = setParams.SetTwoMaxMaximum;
if( setParams.SetTwoMinMembership == 0 )
dSetTwoMinMembership = ( ( FuzzyNumber )fuzzySet[ i ] ).Membership;
else
dSetTwoMinMembership = setParams.SetTwoMinMembership;
if( setParams.SetTwoMinMinimum == 0 )
dSetTwoMinMinimum = ( ( FuzzyNumber )fuzzySet[ i ] ).Minimum;
else
dSetTwoMinMinimum = setParams.SetTwoMinMinimum;
if( setParams.SetTwoMinNumber == 0 )
dSetTwoMinNumber = ( ( FuzzyNumber )fuzzySet[ i ] ).Number;
else
dSetTwoMinNumber = setParams.SetTwoMinNumber;
for( int n=0; n<this.Count; n++ )
{
if( setParams.SetOneMaxMembership == 0 )
dSetOneMaxMembership = ( ( FuzzyNumber )this[ n ] ).Membership;
else
dSetOneMaxMembership = setParams.SetOneMaxMembership;
if( setParams.SetOneMaxMinimum == 0 )
dSetOneMaxMinimum = ( ( FuzzyNumber )this[ n ] ).Minimum;
else
dSetOneMaxMinimum = setParams.SetOneMaxMinimum;
if( setParams.SetOneMaxNumber == 0 )
dSetOneMaxNumber = ( ( FuzzyNumber )this[ n ] ).Number;
else
dSetOneMaxNumber = setParams.SetOneMaxNumber;
if( setParams.SetOneMinMaximum == 0 )
dSetOneMinMaximum = ( ( FuzzyNumber )this[ n ] ).Maximum;
else
dSetOneMinMaximum = setParams.SetOneMinMaximum;
if( setParams.SetOneMaxMaximum == 0 )
dSetOneMaxMaximum = ( ( FuzzyNumber )this[ n ] ).Maximum;
else
dSetOneMaxMaximum = setParams.SetOneMaxMaximum;
if( setParams.SetOneMinMembership == 0 )
dSetOneMinMembership = ( ( FuzzyNumber )this[ n ] ).Membership;
else
dSetOneMinMembership = setParams.SetOneMinMembership;
if( setParams.SetOneMinMinimum == 0 )
dSetOneMinMinimum = ( ( FuzzyNumber )this[ n ] ).Minimum;
else
dSetOneMinMinimum = setParams.SetOneMinMinimum;
if( setParams.SetOneMinNumber == 0 )
dSetOneMinNumber = ( ( FuzzyNumber )this[ n ] ).Number;
else
dSetOneMinNumber = setParams.SetOneMinNumber;
if( dSetOneMinMaximum >= dSetTwoMinMaximum &&
dSetOneMaxMaximum <= dSetTwoMaxMaximum &&
dSetOneMinMembership >= dSetTwoMinMembership &&
dSetOneMaxMembership <= dSetTwoMaxMembership &&
dSetOneMinMinimum >= dSetTwoMinMinimum &&
dSetOneMaxMinimum <= dSetTwoMaxMinimum &&
dSetOneMinNumber >= dSetTwoMinNumber &&
dSetOneMaxNumber <= dSetTwoMaxNumber )
{
bFound = true;
n=this.Count;
}
}
if( bFound == false )
{
returnSet[ returnSet.Count + 1 ] = new FuzzyNumber( ( FuzzyNumber )fuzzySet[ i ] );
}
}
return returnSet;
}
}
}