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

📄 fuzzylogic.cs

📁 包括Pheromones Algorythm、Memory Algorythm和Hill Climbing Algorythm I
💻 CS
📖 第 1 页 / 共 2 页
字号:
using System;
using System.Xml.Serialization;
using System.Xml;
using System.Xml.Schema;
using System.Collections;
using System.Text;


namespace Fuzzy_Logic_Library
{

	/// <summary>
	/// removed the basic stuff to a seperate class to avoid code duplication
	/// </summary>
	abstract public class FuzzyBasic
	{
		/// <summary>
		///  Does Fuzzy Number need an absoluteMaximum and an AbsoluteMinimum value
		///  that it cannot pass?
		/// </summary>
		private double dNumber;
		private double dMaximum;
		private double dMinimum;

		/// <summary>
		/// membership value goes between 0 and 2
		/// a value less than 1 is in the lower half of the membership and a value
		/// greater than 1 is in the higher part of the membership
		/// </summary>
		private double dMembership;

		/// <summary>
		/// arbritrary members
		/// </summary>
		private double dID;
		private string strName;

		public double Number
		{
			get
			{
				return dNumber;
			}
			set
			{
				dNumber = value;
				SetMembership();
			}
		}

		public double Maximum
		{
			get
			{
				return dMaximum;
			}
			set
			{
				dMaximum = value;
			}
		}

		/// <summary>
		/// is the value a full member of this set note it can be set by the outside
		/// this is because the code may not always treat the central point between the 
		/// maximum and minimum numbers as the location for full membership
		/// </summary>
		public double Membership
		{
			get
			{
				return dMembership;
			}
			set
			{
				dMembership = value;
			}
		}


		public double Minimum
		{
			get
			{
				return dMinimum;
			}
			set
			{
				dMinimum = value;
			}
		}

		public double ID
		{
			get
			{
				return dID;
			}
			set
			{
				dID = value;
			}
		}

		public string Name
		{
			get
			{
				return strName;
			}
			set
			{
				strName = value;
			}
		}

		public FuzzyBasic()
		{
			Minimum = 0;
			Maximum = 0;
			Number = 0;
			dMembership = 0.0;
			ID = 0;
			Name = "";
		}

		public FuzzyBasic( FuzzyBasic fuzzy ) 
		{
			this.ID = fuzzy.ID;
			this.Maximum = fuzzy.Maximum;
			this.Membership = fuzzy.Membership;
			this.Minimum = fuzzy.Minimum;
			this.Name = fuzzy.Name;
			this.Number = fuzzy.Number;
		}

		/// <summary>
		/// Set the membership value for the number
		/// Now virtual for overriding with the membership method of choice 
		/// </summary>
		public virtual void SetMembership()
		{
			if( Maximum == 0 || Maximum < Minimum )
				return;

			if( Number > Maximum || Number <= Minimum )
			{
				Membership = 0.0;
				return;
			}

			double dMiddle = Minimum + ( ( Maximum - Minimum ) / 2 );
			
			if( Number == dMiddle )
			{
				Membership = 1.0;
			} 
			else if( Number < dMiddle )
			{
				double dHalfMiddle = dMiddle - ( dMiddle / 2 );
				if( Number == dHalfMiddle )
				{
					Membership = 0.50;
				}
				else if( Number > dHalfMiddle )
				{
					double dHalfAgain = dHalfMiddle + ( dHalfMiddle / 2 );
					if( Number == dHalfAgain )
					{
						Membership = 0.75;
					}
					else if( Number > dHalfAgain )
					{
						Membership = 0.87;
					}
					else
						Membership = 0.63;

				}
				else
				{
					double dHalfAgain = dHalfMiddle - ( dHalfMiddle / 2 );
					if( Number == dHalfAgain )
					{
						Membership = 0.25;
					}
					else if( Number > dHalfAgain )
					{
						Membership = 0.37;
					}
					else
						Membership = 0.12;
				}

			}
			else
			{
				double dHalfMiddle = dMiddle + ( dMiddle / 2 );
				if( Number == dHalfMiddle )
				{
					Membership = 1.50;
				}
				else if( Number > dHalfMiddle )
				{
					double dHalfAgain = dHalfMiddle + ( ( Maximum - dHalfMiddle ) / 2 );
					if( Number == dHalfAgain )
					{
						Membership = 1.75;
					}
					else if( Number > dHalfAgain )
					{
						Membership = 1.87;
					}
					else
						Membership = 1.63;

				}
				else
				{
					double dHalfAgain = dHalfMiddle - ( ( dHalfMiddle - dMiddle ) / 2 );
					if( Number == dHalfAgain )
					{
						Membership = 1.25;
					}
					else if( Number > dHalfAgain )
					{
						Membership = 1.37;
					}
					else
						Membership = 1.12;
				}
			}

		}

		/// <summary>
		/// Check if the set values are equal name and id not checked as 
		/// these are arbitrary
		/// </summary>
		/// <param name="number"></param>
		/// <returns></returns>
		public bool IsEqual( FuzzyBasic fuzzy )
		{
			if( fuzzy.Maximum == this.Maximum &&
				fuzzy.Membership == this.Membership &&
				fuzzy.Minimum == this.Minimum && 
				fuzzy.Number == this.Number )
			{
				return true;
			}

			return false;
		}

		/// Saving and Loading
		
		public virtual void Save( XmlWriter xmlWriter )
		{
			xmlWriter.WriteStartElement( "FuzzyBasic" );
			xmlWriter.WriteElementString( "FuzzyID", ID.ToString() );
			xmlWriter.WriteElementString( "Maximum", Maximum.ToString() );
			xmlWriter.WriteElementString( "Membership", Membership.ToString() );
			xmlWriter.WriteElementString( "Minimum", Minimum.ToString() );
			xmlWriter.WriteElementString( "Name", Name );
			xmlWriter.WriteElementString( "Number", Number.ToString() );
			xmlWriter.WriteEndElement();
		}

		public virtual void Load( XmlReader xmlReader )
		{
			while( xmlReader.Name != "FuzzyID" )
			{
				xmlReader.Read();
				if( xmlReader.EOF == true )
					return;
			}
			
			xmlReader.Read();
			dID = double.Parse( xmlReader.Value );

			while( xmlReader.Name != "Maximum" )
			{
				xmlReader.Read();
			}

			xmlReader.Read();
			dMaximum = double.Parse( xmlReader.Value );

			while( xmlReader.Name != "Membership" )
			{
				xmlReader.Read();
			}

			xmlReader.Read();
			dMembership = double.Parse( xmlReader.Value );

			while( xmlReader.Name != "Minimum" )
			{
				xmlReader.Read();
			}

			xmlReader.Read();
			dMinimum = double.Parse( xmlReader.Value );

			while( xmlReader.Name != "Name" )
			{
				xmlReader.Read();
			}

			xmlReader.Read();
			strName = xmlReader.Value;

			while( xmlReader.Name != "Number" )
			{
				xmlReader.Read();
			}

			xmlReader.Read();
			dNumber = double.Parse( xmlReader.Value );
		}

		/// Comparison stuff
		/// When used with FuzzyDecision class the FD class will check this but should implement it
		/// here just in case I need it later
		/// 

		public static bool operator ==( FuzzyBasic fuzzyBasicOne, FuzzyBasic fuzzyBasicTwo )
		{
			bool bOneIsNull = false;
			bool bBothAreNull = false;

			try
			{
				double dTest = fuzzyBasicOne.Number;
			}
			catch( NullReferenceException nullRefExp )
			{
				string strTemp = nullRefExp.Message;

				bOneIsNull = true;
			}

			try
			{
				double dTest = fuzzyBasicTwo.Number;
			}
			catch( NullReferenceException nullRefExp )
			{
				string strTemp = nullRefExp.Message;

				if( bOneIsNull == true )
					bBothAreNull = true;
				else
					bOneIsNull = true;
			}

			if( bOneIsNull == true && bBothAreNull == false )
				return false;

			if( bBothAreNull == true )
				return true;

			if( fuzzyBasicOne.ID == fuzzyBasicTwo.ID
				&& fuzzyBasicOne.Maximum == fuzzyBasicTwo.Maximum
				&& fuzzyBasicOne.Membership == fuzzyBasicTwo.Membership
				&& fuzzyBasicOne.Minimum == fuzzyBasicTwo.Minimum
				&& fuzzyBasicOne.Name == fuzzyBasicTwo.Name
				&& fuzzyBasicOne.Number == fuzzyBasicTwo.Number )
				return true;
			else
				return false;
		}

		public static bool operator !=( FuzzyBasic fuzzyBasicOne, FuzzyBasic fuzzyBasicTwo )
		{
			bool bOneIsNull = false;
			bool bBothAreNull = false;

			try
			{
				double dTest = fuzzyBasicOne.Number;
			}
			catch( NullReferenceException nullRefExp )
			{
				string strTemp = nullRefExp.Message;

				bOneIsNull = true;
			}

			try
			{
				double dTest = fuzzyBasicTwo.Number;
			}
			catch( NullReferenceException nullRefExp )
			{
				string strTemp = nullRefExp.Message;

				if( bOneIsNull == true )
					bBothAreNull = true;
				else
					bOneIsNull = true;
			}

			if( bOneIsNull == true && bBothAreNull == false )
				return true;

			if( bBothAreNull == true )
				return false;

			if( fuzzyBasicOne.ID != fuzzyBasicTwo.ID
				|| fuzzyBasicOne.Maximum != fuzzyBasicTwo.Maximum
				|| fuzzyBasicOne.Membership != fuzzyBasicTwo.Membership
				|| fuzzyBasicOne.Minimum != fuzzyBasicTwo.Minimum
				|| fuzzyBasicOne.Name != fuzzyBasicTwo.Name
				|| fuzzyBasicOne.Number != fuzzyBasicTwo.Number )
				return true;
			else
				return false;
		}

		/// required overrides
		/// 

		public override bool Equals(object obj)
		{
			if( obj == null || GetType() != obj.GetType() )
				return false;

			if( ID == ( ( FuzzyBasic )obj ).ID
				&& Maximum == ( ( FuzzyBasic )obj ).Maximum
				&& Membership == ( ( FuzzyBasic )obj ).Membership
				&& Minimum == ( ( FuzzyBasic )obj ).Minimum
				&& Name == ( ( FuzzyBasic )obj ).Name
				&& Number == ( ( FuzzyBasic )obj ).Number )
				return true;
			else
				return false;
		}

		public override int GetHashCode()
		{
			return ID.GetHashCode() ^ Maximum.GetHashCode() ^ Membership.GetHashCode() ^ Minimum.GetHashCode() ^ Name.GetHashCode() ^ Number.GetHashCode();
		}

	}


	/// <summary>
	/// Fuzzy SetParameters class is an aid class to help in setting up variables 
	/// for set operations between different types of sets
	/// </summary>
	public class FuzzySetParameters
	{
		private double dSetOneMinMinimum;
		private double dSetOneMaxMinimum;
		private double dSetOneMinMembership; 
		private double dSetOneMaxMembership;
		private double dSetOneMinMaximum;
		private double dSetOneMaxMaximum;
		private double dSetOneMinNumber;
		private double dSetOneMaxNumber;
		private double dSetTwoMinMinimum;
		private double dSetTwoMaxMinimum;
		private double dSetTwoMinMembership;
		private double dSetTwoMaxMembership;
		private double dSetTwoMinMaximum;
		private double dSetTwoMaxMaximum;

⌨️ 快捷键说明

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