2

私は最近、iPhone 開発と Objective-C の世界に飛び込んだばかりなので、このようなものをどのように実装するかについて、まだ少し迷っています。

フロートがあり、フロートが収まる範囲のリストと、返すべき対応する値があります。たとえば、次のようになります。

10.0 - 14.5 : 1.0
14.5 - 17.0 : 2.0
17.0 - 23.0 : 2.5
23.0 - 32.4 : 4.0

したがって、float がたとえば 15.12 の場合、2.0 を返したいとします。

これを難しくしている部分は、範囲リストが非常に長いことです。選択する必要があるそのような範囲リストがいくつかあり、後で変更する必要がある可能性があります。単純に数百または数千ifのステートメントを記述することは、控えめに言っても醜い解決策のように思えます。

4

2 に答える 2

3

範囲がすべて隣接している場合は、このためのカスタム コレクション クラスを作成し、それを 2 つの並列の数値配列で実装できます。

最初の配列の各数値は、1 つまたは 2 つの範囲の一方の端です。

  • 10.0
  • 14.5
  • 17.0
  • 23.0
  • 32.4

2 番目の配列には、1 つ少ない数値が保持されます。これらの数値は、マップする値です。

  • 1.0
  • 2.0
  • 2.5
  • 4.0

このコレクションを検索する実装は、要求されたキー番号をキー配列内の各番号とその後の番号と比較することで構成されます。少なくとも最初は、線形検索を実装するのが最も簡単です (Instruments または Shark のガイダンスで後で最適化できます)。たとえば、このオブジェクトが 20 について尋ねられたとします。

  • 10.0≦20<14.5? いいえ。
  • 14.5≦20<17.0? いいえ。
  • 17.0≦20<23.0? はい。

要求されたキー値が 3 番目の範囲内にあることがわかったので、3 番目の値 (2.5) を返します。

于 2010-08-24T07:54:57.420 に答える
2

基本的に、あなたが説明しているのはFuzzy Logicです。

あなたがやりたいことを処理するファジー論理規則クラスを書きました。

特徴:

  • 私が提供した方法を使用して、独自のカスタム ルールを簡単に追加できます。
  • 単一の値をチェックして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];

FuzzyLogic.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

FuzzyLogic.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
于 2010-08-24T14:36:53.160 に答える