Click here to Skip to main content
15,885,877 members
Articles / Programming Languages / C#

Fuzzy Logic Dot Net Fuzzy Collections

Rate me:
Please Sign up or sign in to vote.
4.20/5 (4 votes)
12 Oct 20045 min read 50.3K   2K   27  
Upgrading the collections in the Fuzzy Dot Net Library.
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;

		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
United Kingdom United Kingdom
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions