Fuzzy Logic Dot Net Fuzzy Decisions






3.14/5 (11投票s)
2003年12月11日
4分钟阅读

75548

1426
帮助做出决策的类。
引言
本文探讨了模糊决策(Fuzzy Decisions)的思想,即我们在代码中需要做出某个决策,并且有一些因素会影响这个决策。我假设无论这个决策是什么,它都不是一个简单的决策,不依赖于真或假变量或函数的返回值,而是一个需要考虑代码中许多特定因素的决策。严格来说,这些影响决策的因素不必相关,事实上,要正确使用模糊决策类,它们最好不要相关。
模糊决策类被设计为一种帮助做出决策的方法,而无需对决策过程或代码细节有特定了解。原因在于,我们所有人都在不断地在代码中做出决策,但我们总是基于函数的结果或真假变量来做。模糊决策类使我们能够做出有多种不同影响因素的决策,并为决策提供了一个灵活可重用的框架。
例如,假设我们要决定在一个游戏中将角色向左还是向右移动。我们假设两条路都畅通,没有任何东西阻止角色向任一方向移动,但代码或游戏中的某些东西会影响我们希望移动的方向。一个因素可能是,如果我们之前找到了某个物品,那么我们应该更倾向于向左移动。
理论上,这方面的代码大致是这样的:
if( Itemfound == true )
{
MoveLeft();
}
else
MoveRight();
然而事情并非总是如此直接。如果我们找不到物品就不想自动向右移动,因为我们也知道左边有食物,而我们的生命值有点低。代码 then becomes:
if( ItemFound == true )
{
MoveLeft();
}
else
{
if( HealthLow == true )
MoveLeft();
else
MoveRight();
}
然后我们突然想起右边有一把大枪,左边还有一个坏人,如果我们要获取生命值,就需要用枪射击他。这时,任何有几周以上编码经验的人都能看出这是怎么回事。代码变得越来越复杂,嵌套条件越来越长,我们正走向一个维护噩梦。这就是模糊决策概念的由来。有了模糊决策类,我们可以先创建几个模糊决策对象,一个用于向左移动,一个用于向右移动,然后比较它们,看看哪个是赢家。代码看起来会是这样的:
FuzzyDecision left = new FuzzyDecision( "Left" );
FuzzyDecision right = new FuzzyDecision( "Right" );
if( ItemFound == true )
left.IncrementDecision();
if( HealthLow == true )
left.IncrementDecision();
else
right.IncrementDecision();
if( GunToRight == true )
right.IncrementDecision();
if( BadGuyToLeft == true )
right.IncrementDecision();
FuzzyDecision decision = left.Compare( right );
if( decision.Name == "Left" )
MoveLeft();
else
MoveRight();
FuzzyDecision
类基本上就是一个计数器类,可以对其进行加法或减法操作,以获得一个最终值,然后该值与其他用于不同决策选项的决策对象进行比较。
FuzzyDecisionSet 类
FuzzyDecisionSet
类是一个简单的机制,用于在集合中对可用的决策进行分组。因此,如果决策是决定移动方向,并且选项是左、右、上、下,那么设置集合将是这样的:
FuzzyDecisionSet set = new FuzzyDecisionSet( "WayToMove" );
set.Add( "Left", true );
set.Add( "Right", true );
set.Add( "Up", true );
set.Add( "Down", true );
首先创建 Fuzzy Decision Set,并命名为 WayToMove
,然后添加决策的组成部分。这些通过 Add
函数创建为 Fuzzy Decisions,并指定名称和“是否有效”参数,以便在最终决策由 compare
函数决定时将它们标记为有效决策。
FuzzyDecisionSet
类具有函数,可以根据名称或存储在类中的数组中的位置来访问单个决策。因此,为了更新决策,您将使用类似的代码:
set.IncrementByName( "Left" );
set.DecrementByName( "Left" );
或
set.IncrementAt( 0 );
set.DecrementAt( 0 );
两者都会增加和减少集合中的 Left 决策。
最后
提供的示例包含更全面地演示此处提到的类功能的代码,并包括了代码中所有正在发生的事情的打印输出。
历史
- 2003 年 12 月 11 日:初始发布。
参考文献
- Tom Archer ( 2001 ) C# 内幕,Microsoft Press
- Jeffery Richter (2002) Applied Microsoft .NET Framework Programming, Microsoft Press
- Charles Peltzold ( 2002 ) 使用 C# 编程 Microsoft Windows,Microsoft Press
- Robinson 等 ( 2001 ) 专业 C#,Wrox
- Bart Kosko ( 1994 ) 模糊思维,Flamingo
- Buckley & Eslami ( 2002 ) 模糊逻辑与模糊集导论,Physica-Verlag
- Earl Cox ( 1999 ) 模糊系统手册,AP Professional