📄 fuzzylogic.cs
字号:
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 + -