基本上你所描述的是模糊逻辑。
我给你写了一个模糊逻辑规则类,它应该处理你想做的事情。
特征:
- 您可以使用我提供的方法轻松添加自己的自定义规则。
- 您可以使用单个检查值
method
并获得字符串结果(或者nil
如果它不匹配任何规则)。
- 由于它使用规则,您可以定义您希望的任何间隔时间。
添加新规则:
[logic addRule:@"2.0" forLowerCondition:14.5 forUpperCondition:17.0];
示例输出(来自下面的代码):
Result for 15.20 is: 2.0
这是代码实现......
在你的主要:
FuzzyLogic *logic = [[FuzzyLogic alloc] initWithRule:@"1.0" forLowerCondition:10.0 forUpperCondition:14.5];
[logic addRule:@"2.0" forLowerCondition:14.5 forUpperCondition:17.0];
[logic addRule:@"2.5" forLowerCondition:17.0 forUpperCondition:23.0];
double input1 = 15.2f;
NSLog(@"Result for %.2lf is: %@", input1, [logic fuzzyResultForValue:input1]);
[logic release];
模糊逻辑.h:
#import <Foundation/Foundation.h>
@interface FuzzyLogic : NSObject {
NSMutableArray *conditions;
}
- (id) initWithRule:(NSString*)result forLowerCondition:(double)lower forUpperCondition:(double)upper;
- (void) addRule:(NSString*)result forLowerCondition:(double)lower forUpperCondition:(double)upper;
- (NSString*) fuzzyResultForValue:(double)input;
@end
模糊逻辑.m:
#import "FuzzyLogic.h"
@implementation FuzzyLogic
enum {
lowerIndex = 0,
upperIndex,
resultIndex
};
- (id) initWithRule:(NSString*)result forLowerCondition:(double)lower forUpperCondition:(double)upper {
self = [super init];
if (self != nil) {
[self addRule:result forLowerCondition:lower forUpperCondition:upper];
}
return self;
}
- (void) addRule:(NSString*)result forLowerCondition:(double)lower forUpperCondition:(double)upper {
NSArray *rule = [[NSArray alloc] initWithObjects:[NSString stringWithFormat:@"%lf",lower],[NSString stringWithFormat:@"%lf",upper],result,nil];
if (conditions == nil) {
conditions = [[NSMutableArray alloc] initWithObjects:rule,nil];
} else {
[conditions addObject:rule];
}
}
- (NSString*) fuzzyResultForValue:(double)input
{
NSString *returnable = nil;
// Find the result
for (NSArray *cond in conditions) {
double lower = [[cond objectAtIndex:lowerIndex] doubleValue];
double upper = [[cond objectAtIndex:upperIndex] doubleValue];
if ( (input >= lower && input < upper) ) {
returnable = [cond objectAtIndex:resultIndex];
break;
}
}
if (returnable == nil)
{ NSLog(@"Error: Input met no conditions!");}
return returnable;
}
@end