Remove unneeded protocol and add TFN alpha cut

This commit is contained in:
Alexander Ignatov 2022-01-06 21:27:36 +02:00
parent b42f827cc8
commit 8b65d4ca82
3 changed files with 44 additions and 20 deletions

View File

@ -1,14 +0,0 @@
import FuzzySets
public protocol FuzzyNumber: FuzzySet where Universe == Double {
static func + (lhs: Self, rhs: Self) -> Self
static func - (lhs: Self, rhs: Self) -> Self
prefix static func - (x: Self) -> Self
// func approximatelyMultiplied(by other: Self) -> Self
//
// func approximatelyDivided(by other: Self) -> Self
}

View File

@ -14,14 +14,18 @@ public struct TriangularFuzzyNumber {
self.minimum = minimum
self.peak = peak
self.maximum = maximum
self.function = .triangular(minimum: minimum, peak: peak, maximum: maximum)
self.function = minimum == peak && peak == maximum
? .fuzzySingleton(peak)
: .triangular(minimum: minimum, peak: peak, maximum: maximum)
}
public init(peak: Universe, leftInterval: Universe, rightInterval: Universe) {
self.minimum = peak - leftInterval
self.peak = peak
self.maximum = peak + rightInterval
self.function = .triangular(minimum: minimum, peak: peak, maximum: maximum)
self.function = minimum == peak && peak == maximum
? .fuzzySingleton(peak)
: .triangular(minimum: minimum, peak: peak, maximum: maximum)
}
}
@ -31,7 +35,7 @@ extension TriangularFuzzyNumber: FuzzySet {
}
}
extension TriangularFuzzyNumber: FuzzyNumber {
extension TriangularFuzzyNumber {
public static func + (lhs: TriangularFuzzyNumber, rhs: TriangularFuzzyNumber) -> TriangularFuzzyNumber {
.init(
minimum: lhs.minimum + rhs.minimum,
@ -52,7 +56,14 @@ extension TriangularFuzzyNumber: FuzzyNumber {
.init(minimum: -x.maximum, peak: -x.peak, maximum: -x.minimum)
}
//
public func alphaCut(_ alpha: Grade) -> TriangularFuzzyNumber {
.init(
minimum: (peak - minimum) * alpha + minimum,
peak: peak,
maximum: -(maximum - peak) * alpha + maximum
)
}
// public func approximatelyMultiplied(by other: TriangularFuzzyNumber) -> TriangularFuzzyNumber {
// // TODO
// }

View File

@ -1,6 +1,14 @@
import XCTest
import FuzzyNumbers
extension TriangularFuzzyNumber {
func approximatelyEqualTo(_ other: Self, tolerance: Double = 0.0001) -> Bool {
abs(minimum - other.minimum) <= tolerance
&& abs(peak - other.peak) <= tolerance
&& abs(maximum - other.maximum) <= tolerance
}
}
final class TriangularFuzzyNumberTests: XCTestCase {
func test_addition() {
let a = TriangularFuzzyNumber(minimum: -3, peak: 2, maximum: 4)
@ -9,7 +17,7 @@ final class TriangularFuzzyNumberTests: XCTestCase {
let result = a + b
XCTAssertEqual(result, expect)
XCTAssert(result.approximatelyEqualTo(expect))
}
func test_subtraction() {
@ -19,7 +27,26 @@ final class TriangularFuzzyNumberTests: XCTestCase {
let result = a - b
XCTAssertEqual(result, expect)
XCTAssert(result.approximatelyEqualTo(expect))
}
func test_alphaCutSumAndSubtraction() {
let a = TriangularFuzzyNumber(minimum: -3, peak: 2, maximum: 4)
let b = TriangularFuzzyNumber(minimum: -1, peak: 0, maximum: 6)
let expect0Sum = TriangularFuzzyNumber(minimum: -4, peak: 2, maximum: 10)
let expect1Sum = TriangularFuzzyNumber(minimum: 2, peak: 2, maximum: 2)
let expect0Sub = TriangularFuzzyNumber(minimum: -9, peak: 2, maximum: 5)
let expect1Sub = TriangularFuzzyNumber(minimum: 2, peak: 2, maximum: 2)
let result0Sum = a.alphaCut(0) + b.alphaCut(0)
let result1Sum = a.alphaCut(1) + b.alphaCut(1)
let result0Sub = a.alphaCut(0) - b.alphaCut(0)
let result1Sub = a.alphaCut(1) - b.alphaCut(1)
XCTAssert(result0Sum.approximatelyEqualTo(expect0Sum))
XCTAssert(result1Sum.approximatelyEqualTo(expect1Sum))
XCTAssert(result0Sub.approximatelyEqualTo(expect0Sub))
XCTAssert(result1Sub.approximatelyEqualTo(expect1Sub))
}
// func test_approximateMultiplication() {