-
-
Notifications
You must be signed in to change notification settings - Fork 46.6k
/
Copy pathfuzzy_operations.py
161 lines (130 loc) · 4.31 KB
/
fuzzy_operations.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import matplotlib.pyplot as plt
import numpy as np
""""
FuzzySet class for triangular fuzzy sets
Author: Shreya123714
Source: https://en.wikipedia.org/wiki/Fuzzy_set
"""
class FuzzySet:
"""
A class for representing and
manipulating triangular fuzzy sets.
Attributes:
name (str): The name or label of the fuzzy set.
a (float): The left boundary of the fuzzy set.
b (float): The peak (central) value of the fuzzy set.
c (float): The right boundary of the fuzzy set.
Methods:
membership(x): Calculate the membership value
of an input 'x' in the fuzzy set.
union(other): Calculate the union of this fuzzy set
with another fuzzy set.
intersection(other): Calculate the intersection of this fuzzy set
with another fuzzy set.
complement(): Calculate the complement (negation)
of this fuzzy set.
plot(): Plot the membership function of the fuzzy set.
"""
def __init__(self, name: str, left_boundary: float, peak: float, right_boundary: float) -> None:
"""
Initializes a triangular fuzzy set
with the given parameters.
Args:
name (str): The name or label of the fuzzy set.
a (float): The left boundary of the fuzzy set.
b (float): The peak (central) value of
the fuzzy set.
c (float): The right boundary of the fuzzy set.
"""
self.name = name # Fuzzy set name
self.left_boundary = left_boundary # Left boundary
self.peak = peak # Peak value
self.right_boundary = right_boundary # Right boundary
def membership(self, x):
"""
Calculate the membership value of
an input 'x' in the fuzzy set.
Args:
x (float): The input value for
which the membership is calculated.
Returns:
float: The membership value of 'x' in
the fuzzy set.
"""
if x <= self.a or x >= self.c:
return 0
elif self.a < x <= self.b:
return (x - self.a) / (self.b - self.a)
elif self.b < x < self.c:
return (self.c - x) / (self.c - self.b)
def union(self, other):
"""
Calculate the union of this fuzzy set
with another fuzzy set.
Args:
other (FuzzySet): Another fuzzy set
to union with.
Returns:
FuzzySet: A new fuzzy
set representing the union.
"""
union_name = f"{self.name} ∪ {other.name}"
return FuzzySet(
union_name,
min(self.a, other.a),
max(self.c, other.c),
(self.b + other.b) / 2,
)
def intersection(self, other):
"""
Calculate the intersection of this
fuzzy set with another fuzzy set.
Args:
other (FuzzySet): Another fuzzy set to intersect with.
Returns:
FuzzySet: A new fuzzy set representing the intersection.
"""
intersection_name = f"{self.name} ∩ {other.name}"
return FuzzySet(
intersection_name,
max(self.a, other.a),
min(self.c, other.c),
(self.b + other.b) / 2,
)
def complement(self):
"""
Calculate the complement (negation) of this fuzzy set.
Returns:
FuzzySet: A new fuzzy set representing the complement.
"""
complement_name = f"¬{self.name}"
return FuzzySet(complement_name, 1 - self.c, 1 - self.a, 1 - self.b)
def plot(self):
"""
Plot the membership function of the fuzzy set.
"""
x = np.linspace(0, 1, 1000)
y = [self.membership(xi) for xi in x]
plt.plot(x, y, label=self.name)
def __str__(self):
return f"{self.name}: [{self.a}, {self.b}, {self.c}]"
# Example usage:
if __name__ == "__main__":
A = FuzzySet("A", 0, 0.5, 1)
B = FuzzySet("B", 0.2, 0.7, 1)
A.plot()
B.plot()
plt.xlabel("x")
plt.ylabel("Membership")
plt.legend()
plt.show()
union_ab = A.union(B)
intersection_ab = A.intersection(B)
complement_a = A.complement()
union_ab.plot()
intersection_ab.plot()
complement_a.plot()
plt.xlabel("x")
plt.ylabel("Membership")
plt.legend()
plt.show()