7강
퍼지이론 (Fuzzy Logic)
1. 퍼지이론이란?
- 전통적인 논리(True/False)의 한계를 극복하기 위한 이론
- 명확하게 참/거짓을 구분할 수 없는 상황을 수치적으로 표현
- 예: 체온 37.9℃ → '정상'인가? '고열'인가?
2. 퍼지집합 (Fuzzy Set)
● 정의
- 원소가 집합에 속할 가능성(소속 정도)을 [0, 1] 범위의 값으로 표현
● 고전집합 vs 퍼지집합
- 고전집합: 0 또는 1
- 퍼지집합: 예) {(2, 1.0), (3, 0.5)}
● 소속함수 (Membership Function)
- 퍼지집합 A의 소속함수:
μA(x): X → [0, 1]
3. 퍼지집합의 연산
● 여집합
● 합집합
μA∪B(x) = max(μA(x), μB(x))
● 교집합
μA∩B(x) = min(μA(x), μB(x))
● 퍼지 연산자의 특성
- 교환법칙, 결합법칙, 분배법칙, 드모르간 법칙 대부분 만족
- 예외:
4. 퍼지논리 (Fuzzy Logic)
● 고전논리와 비교
- 고전논리: True (1), False (0)
- 퍼지논리: 연속적인 값 (0 ≤ x ≤ 1)
● Łukasiewicz 퍼지논리 연산자
- 부정:
~a = 1 - a
- 논리곱(AND):
a ∧ b = min(a, b)
- 논리합(OR):
a ∨ b = max(a, b)
- 조건명제(IF a THEN b):
a → b = min(1, 1 - a + b)
5. 퍼지추론 (Fuzzy Inference)
● 퍼지 규칙
- 형태:
IF <조건> THEN <결론>
- 예: IF 수위가 높다 THEN 밸브를 연다
● 추론 방식
- 퍼지관계 R:
a → b = min(a, b) (Mamdani 방식)
- 합성 연산:
μA∘R(y) = max_x (min(μA(x), μR(x, y)))
6. 퍼지제어 (Fuzzy Control)
● 퍼지 제어기 구조
- 퍼지화(Fuzzification)
- 퍼지추론부
- 지식베이스
- 비퍼지화(Defuzzification)
● 예: 물탱크 수위 제어
- 규칙 1: IF 수위가 높다 → 밸브를 연다
- 규칙 2: IF 수위가 낮다 → 밸브를 닫는다
- 추론 결과를 통해 적절한 밸브 각도 계산 (예: 58°)
✅ 요약
- 퍼지이론은 참/거짓의 중간 값을 수치적으로 표현할 수 있어 현실 세계의 모호함을 처리하기에 적합
- 퍼지집합은 소속함수를 통해 연속적인 멤버십 값을 가짐
- 퍼지논리는 연산을 통해 다양한 논리 계산을 가능하게 함
- 퍼지추론은 퍼지 규칙과 소속함수를 활용해 모호한 정보를 추론 가능
- 퍼지제어는 실제 시스템 제어(예: 온도, 수위 등)에 활용됨
퍼지이론 코드
✅ 예제 1: 소속함수 시각화
import numpy as np
import matplotlib.pyplot as plt
def high_water_level(x):
if x <= 50:
return 0
elif 50 < x < 100:
return (x - 50) / 50
else:
return 1
x_vals = np.linspace(0, 150, 300)
y_vals = [high_water_level(x) for x in x_vals]
plt.plot(x_vals, y_vals)
plt.title("소속함수: 높은 수위")
plt.xlabel("수위(cm)")
plt.ylabel("소속도")
plt.grid(True)
plt.show()
✅ 예제 2: 퍼지 규칙 기반 추론 (수위 제어)
def fuzzy_rule(water_level):
high = high_water_level(water_level)
low = 1 - high
open_valve = high * 100
close_valve = low * 100
return open_valve, close_valve
wl = 70
open_valve, close_valve = fuzzy_rule(wl)
print(f"수위: {wl}cm → 밸브 개방: {open_valve:.2f}%, 밸브 닫힘: {close_valve:.2f}%")
✅ 예제 3: 퍼지 추론 + 비퍼지화 (Defuzzification)
def defuzzify(open_valve, close_valve):
return (open_valve * 1 + close_valve * 0) / (open_valve + close_valve)
valve_position = defuzzify(open_valve, close_valve)
print(f"최종 밸브 제어값 (0~1 범위): {valve_position:.2f}")
✅ 실제 활용 예: 퍼지 제어기 전체 흐름
def fuzzy_controller(water_level):
open_valve, close_valve = fuzzy_rule(water_level)
valve_position = defuzzify(open_valve, close_valve)
return valve_position
for level in [30, 50, 70, 90, 110]:
print(f"수위 {level}cm → 밸브 위치: {fuzzy_controller(level):.2f}")
✅ 요약
- 소속함수는 퍼지집합의 핵심으로, 멤버십을 수치화함
- 퍼지 규칙(
IF 수위 높다 THEN 밸브 연다)는 실제 제어 로직에 적용됨
- 퍼지추론 후 비퍼지화를 통해 실제 수치로 조정값을 계산함
- 이 전체 흐름은 온도조절기, 습도제어기, 차량 제어 시스템 등에 사용됨