私はここのプールの奥深くに迷い込んだ。私はいくつかの良い進歩を遂げましたが、今はただぶらぶらしています。iOSでこのファジーロジックライブラリを使用しようとしています:http ://code.google.com/p/fuzzy-lite/
コンパイルする必要があります。プロジェクトに.cppファイルと.hファイルの両方を追加し、メインのviewControllerのサフィックスを「.mm」に変更しました。viewDidload内からfuzzyLitetest.hファイルを実行できます(以下を参照)。実行され、テストデータが表示されます。
私がする必要があるのは、fuzzyLiteの永続インスタンスを作成して、アプリで使用できるようにすることです(たとえば、それに対処して、アプリがアンロードされたときにクリーンアップできるようにします)。
私は周りを検索しましたが、ObjCプロジェクトにC++コードを含めることの議論/例を理解していません。誰かが私がこれを進める方法を教えてもらえますか?関数を呼び出して結果を取り戻すことができるようにfuzzyLiteコードをラップしますか?ありがとう!
編集:私はここに詳述された方法を使用してこれを進歩させました:http: //robnapier.net/blog/wrapping-c-take-2-1-486
私がはっきりしていないことの1つは、メモリのクリーンアップです。Dealloc関数は、ラップされたCPPインスタンスのインスタンスをクリーンアップしますが、CCPインスタンス内に割り当てられたメモリについてはどうでしょうか。インスタンスを削除する前に、メソッドを呼び出してそれを解放する必要があるようです。
例:ラップされたクラスにはサブクラスのインスタンス変数がいくつかあります-私のクリーンアップ関数はメモリを適切に管理するのに十分ですか?
void Bingo::cleanup(){
delete engine;
engine = NULL;
delete health;
health = NULL;
delete energy;
energy = NULL;
}
-ラップされたCPPクラスのヘッダー
#include "fuzzylite/FuzzyLite.h"
namespace fl {
class Bingo {
public:
FuzzyEngine* engine;
OutputLVar* health;
InputLVar* energy;
Bingo();
void Fuzz();
void setInput(float input);
};
}
ObjCラッパーから:
- (void)dealloc
{
delete _cpp;
_cpp = NULL;
[super dealloc];
}
FuzzyLiteIOSViewController.mm
#include "FuzzyLiteIOSViewController.h"
#include "FuzzyLite.h"
#include "test.h"
#include <limits>
#include "fuzzylite/FunctionTerm.h"
//stuff not shown
- (void)viewDidLoad
{
[super viewDidLoad];
fl::Test* test = new fl::Test();
test->SimpleMamdani();
}
test.h
#ifndef FL_TEST_H
#define FL_TEST_H
namespace fl {
class Test {
public:
static void SimpleMamdani();
};
}
#endif /* FL_TEST_H */
test.cpp
#include "fuzzylite/test.h"
#include "fuzzylite/FuzzyLite.h"
#include <limits>
#include "fuzzylite/FunctionTerm.h"
namespace fl {
void Test::SimpleMamdani() {
FuzzyOperator& op = FuzzyOperator::DefaultFuzzyOperator();
FuzzyEngine engine("simple-mamdani", op);
engine.hedgeSet().add(new fl::HedgeNot);
engine.hedgeSet().add(new fl::HedgeSomewhat);
engine.hedgeSet().add(new fl::HedgeVery);
fl::InputLVar* energy = new fl::InputLVar("Energy");
energy->addTerm(new fl::ShoulderTerm("LOW", 0.25, 0.5, true));
energy->addTerm(new fl::TriangularTerm("MEDIUM", 0.25, 0.75));
energy->addTerm(new fl::ShoulderTerm("HIGH", 0.50, 0.75, false));
engine.addInputLVar(energy);
fl::OutputLVar* health = new fl::OutputLVar("Health");
health->addTerm(new fl::TriangularTerm("BAD", 0.0, 0.50));
health->addTerm(new fl::TriangularTerm("REGULAR", 0.25, 0.75));
health->addTerm(new fl::TriangularTerm("GOOD", 0.50, 1.00));
engine.addOutputLVar(health);
fl::RuleBlock* block = new fl::RuleBlock();
block->addRule(new fl::MamdaniRule("if Energy is LOW then Health is BAD", engine));
block->addRule(new fl::MamdaniRule("if Energy is MEDIUM then Health is REGULAR", engine));
block->addRule(new fl::MamdaniRule("if Energy is HIGH then Health is GOOD", engine));
engine.addRuleBlock(block);
for (fl::flScalar in = 0.0; in < 1.1; in += 0.1) {
energy->setInput(in);
engine.process();
fl::flScalar out = health->output().defuzzify();
(void)out; //Just to avoid warning when building
FL_LOG("Energy=" << in);
FL_LOG("Energy is " << energy->fuzzify(in));
FL_LOG("Health=" << out);
FL_LOG("Health is " << health->fuzzify(out));
FL_LOG("--");
}
}