提问人:Martin Bocanegra 提问时间:11/22/2021 最后编辑:Martin Bocanegra 更新时间:12/5/2021 访问量:183
如何将这些模糊逻辑运算应用于我的自定义布尔类?
How do I apply these fuzzy logic operations to my custom boolean class?
问:
上下文
我有一个自定义的模糊布尔类,称为 F_Bool,它由介于 0 和 1 之间的值(包括 0
和 1)表示。
(请参阅下面的代码示例)
我所知道的
在大多数模糊逻辑应用中,逻辑运算符 、 和 非常简单。对于 、 和 。|
&
!
a|b => Max(a.val, b.val)
a&b => Min(a.val, b.val)
!a => 1 - a.val
对于 和 等运算符,任务变得有点棘手。对于(经过一些试验和错误)我发现我可以取平均值.对于(经过更多的试验和错误)我发现.+
-
a+b
a+b => (a.val + b.val) / 2
a-b
a-b => a+!b => (1 + a.val - b.val) / 2
我被卡住的地方
我知道我的加法和减法“解决方案”并不理想,因为它不允许(这应该是三个值的平均值),但我稍后可以弄清楚。a+b+c
我主要想知道如何以类似的方式为我的类实现 and 运算符,以及这样的操作在模糊布尔逻辑方面可能意味着什么。*
/
问题
如果将两个模糊布尔值“相加”等同于平均它们的值,那么将两个模糊布尔值相乘/相除是什么意思?甚至有逻辑等价物吗?
下面是我所说的代码示例。
代码示例
// Represents a boolean using a decimal
public class F_Bool
{
// The fuzzified value
public decimal val;
// The defuzzified value
public bool boolVal {
get => val >= 0.5M;
set => val = value ? 1M : 0M;
}
// Constructors
public F_Bool (decimal value) =>
val = value;
public F_Bool (bool value) =>
boolVal = value;
// AND: takes the Min value of {a, b}
public static F_Bool operator &(F_Bool a, F_Bool b) =>
new F_Bool( Math.Min(a.val, b.val) );
// OR: takes the Max value of {a, b}
public static F_Bool operator |(F_Bool a, F_Bool b) =>
new F_Bool( Math.Max(a.val, b.val) );
// NOT: Inverts the value of f
public static F_Bool operator !(F_Bool f) =>
new F_Bool (1 - f.val);
// SUM: Returns the average of {a, b}
public static F_Bool operator +(F_Bool a, F_Bool b) =>
new F_Bool ( (a.val+ b.val) / 2 );
// DIF: Returns the average of {a, NOT b}
public static F_Bool operator -(F_Bool a, F_Bool b) =>
a + !b;
/* Trivially Implemented */
// PRODUCT: ??? of {?a?, ?b?}
/* I presume I will return a*b; */
public static F_Bool operator *(F_Bool a, F_Bool b) {
if(a.val== 0 | b.val== 0) return new F_Bool(0);
else if(b.val== 1) return a;
else if(a.val== 1) return b;
else // return a * b; // correct?
throw new NotImplementedException();
}
// QUOTIENT: ??? of {?a?, ?b?}
/* I have no idea, but a/b is wrong. *
* - Would Min(a,b)/Max(a,b) work? *
* - What about (a-b)/(a+b)? */
public static F_Bool operator /(F_Bool a, F_Bool b) {
if(b.val == 0) throw new DivideByZeroException();
else if(a.val == 0) return 0;
else if(b.val == 1) return a;
else // return a/b; // incorrect! (produces values > 1)
throw new NotImplementedException();
}
}
非常感谢任何帮助
谢谢!
答: 暂无答案
评论
F_Bool