Remove unneeded protocol and add TFN alpha cut
This commit is contained in:
parent
b42f827cc8
commit
8b65d4ca82
|
@ -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
|
||||
}
|
|
@ -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
|
||||
// }
|
|
@ -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() {
|
||||
|
|
Loading…
Reference in New Issue