📄 migrationfc.cpp
字号:
//---------------------------------------------------------------------------
#include "MigrationFC.h"
//---------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
TMigrationFC::TMigrationFC(/*TFragment* fragment*/)
{
// create new controller for assessing migration candidacy
C1 = new TFuzzyController();
// add input and output variables
C1->clear_input_variables();
C1->add_input_variable(new TVariable("RemoteDemand", "", 00.0, 100.0));
C1->add_input_variable(new TVariable("LocalDemand", "", 00.0, 100.0));
C1->output_variable = new TVariable("RemoteAttraction", "", 00.0, 100.0);
// bias variable, <50 means fast becomes high
int centre; // bias variable, 50 means linearly becomes high
// bias variable, >50 means slow becomes high
// add fuzzysets to the input and output variables
centre = 40; // input 1
C1->input_variables[0]->clear_fuzzysets();
C1->input_variables[0]->add_fuzzyset(new TFuzzySet(C1->input_variables[0], "Low", S_CURVE , DOWN , 0.00*centre, -0.0, 0.50*centre, -0.0, 1.00*centre));
C1->input_variables[0]->add_fuzzyset(new TFuzzySet(C1->input_variables[0], "Medium", PI_CURVE , UP , 0.00*centre, 0.50*centre, 1.00*centre, (100.0-0.50*centre), 100.0 ));
C1->input_variables[0]->add_fuzzyset(new TFuzzySet(C1->input_variables[0], "High", S_CURVE , UP , 1.00*centre, -0.0, (100.0-0.50*centre), -0.0, 100.0 ));
centre = 60; // input 2
C1->input_variables[1]->clear_fuzzysets();
C1->input_variables[1]->add_fuzzyset(new TFuzzySet(C1->input_variables[1], "Low", S_CURVE , DOWN , 0.00*centre, -0.0, 0.50*centre, -0.0, 1.00*centre));
C1->input_variables[1]->add_fuzzyset(new TFuzzySet(C1->input_variables[1], "Medium", PI_CURVE , UP , 0.00*centre, 0.50*centre, 1.00*centre, (100.0-0.50*centre), 100.0 ));
C1->input_variables[1]->add_fuzzyset(new TFuzzySet(C1->input_variables[1], "High", S_CURVE , UP , 1.00*centre, -0.0, (100.0-0.50*centre), -0.0, 100.0 ));
centre = 50; // output
C1->output_variable->clear_fuzzysets();
C1->output_variable->add_fuzzyset(new TFuzzySet(C1->output_variable, "Low", S_CURVE , DOWN , 0.00*centre, -0.0, 0.50*centre, -0.0, 1.00*centre));
C1->output_variable->add_fuzzyset(new TFuzzySet(C1->output_variable, "Medium", PI_CURVE , UP , 0.00*centre, 0.50*centre, 1.00*centre, (100.0-0.50*centre), 100.0 ));
C1->output_variable->add_fuzzyset(new TFuzzySet(C1->output_variable, "High", S_CURVE , UP , 1.00*centre, -0.0, (100.0-0.50*centre), -0.0, 100.0 ));
// create empty rules (conditional, alpha, weight)
C1->clear_rules();
C1->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C1->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C1->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C1->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C1->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C1->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C1->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C1->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C1->add_rule(new TFuzzyRule(true, 0.00, 1.0));
// setup rules remote_demand local_demand candidacy
//----------------------------------------------------------------------------------
//
if (C1->rules[0] != NULL)
{
C1->rules[0]->predicate->clear_premises();
C1->rules[0]->predicate->clear_operators();
C1->rules[0]->predicate->add_premise(new TPremise(C1->input_variables[0]->fuzzysets[0]));
C1->rules[0]->predicate->add_operator(0);
C1->rules[0]->predicate->add_premise(new TPremise(C1->input_variables[1]->fuzzysets[0]));
C1->rules[0]->consequent->set_premise(new TPremise(C1->output_variable->fuzzysets[0]));
}
if (C1->rules[1] != NULL)
{
C1->rules[1]->predicate->clear_premises();
C1->rules[1]->predicate->clear_operators();
C1->rules[1]->predicate->add_premise(new TPremise(C1->input_variables[0]->fuzzysets[0]));
C1->rules[1]->predicate->add_operator(0);
C1->rules[1]->predicate->add_premise(new TPremise(C1->input_variables[1]->fuzzysets[1]));
C1->rules[1]->consequent->set_premise(new TPremise(C1->output_variable->fuzzysets[0]));
}
if (C1->rules[2] != NULL)
{
C1->rules[2]->predicate->clear_premises();
C1->rules[2]->predicate->clear_operators();
C1->rules[2]->predicate->add_premise(new TPremise(C1->input_variables[0]->fuzzysets[0]));
C1->rules[2]->predicate->add_operator(0);
C1->rules[2]->predicate->add_premise(new TPremise(C1->input_variables[1]->fuzzysets[2]));
C1->rules[2]->consequent->set_premise(new TPremise(C1->output_variable->fuzzysets[0]));
}
if (C1->rules[3] != NULL)
{
C1->rules[3]->predicate->clear_premises();
C1->rules[3]->predicate->clear_operators();
C1->rules[3]->predicate->add_premise(new TPremise(C1->input_variables[0]->fuzzysets[1]));
C1->rules[3]->predicate->add_operator(0);
C1->rules[3]->predicate->add_premise(new TPremise(C1->input_variables[1]->fuzzysets[0]));
C1->rules[3]->consequent->set_premise(new TPremise(C1->output_variable->fuzzysets[1]));
}
if (C1->rules[4] != NULL)
{
C1->rules[4]->predicate->clear_premises();
C1->rules[4]->predicate->clear_operators();
C1->rules[4]->predicate->add_premise(new TPremise(C1->input_variables[0]->fuzzysets[1]));
C1->rules[4]->predicate->add_operator(0);
C1->rules[4]->predicate->add_premise(new TPremise(C1->input_variables[1]->fuzzysets[1]));
C1->rules[4]->consequent->set_premise(new TPremise(C1->output_variable->fuzzysets[0]));
}
if (C1->rules[5] != NULL)
{
C1->rules[5]->predicate->clear_premises();
C1->rules[5]->predicate->clear_operators();
C1->rules[5]->predicate->add_premise(new TPremise(C1->input_variables[0]->fuzzysets[1]));
C1->rules[5]->predicate->add_operator(0);
C1->rules[5]->predicate->add_premise(new TPremise(C1->input_variables[1]->fuzzysets[2]));
C1->rules[5]->consequent->set_premise(new TPremise(C1->output_variable->fuzzysets[0]));
}
if (C1->rules[6] != NULL)
{
C1->rules[6]->predicate->clear_premises();
C1->rules[6]->predicate->clear_operators();
C1->rules[6]->predicate->add_premise(new TPremise(C1->input_variables[0]->fuzzysets[2]));
C1->rules[6]->predicate->add_operator(0);
C1->rules[6]->predicate->add_premise(new TPremise(C1->input_variables[1]->fuzzysets[0]));
C1->rules[6]->consequent->set_premise(new TPremise(C1->output_variable->fuzzysets[2]));
}
if (C1->rules[7] != NULL)
{
C1->rules[7]->predicate->clear_premises();
C1->rules[7]->predicate->clear_operators();
C1->rules[7]->predicate->add_premise(new TPremise(C1->input_variables[0]->fuzzysets[2]));
C1->rules[7]->predicate->add_operator(0);
C1->rules[7]->predicate->add_premise(new TPremise(C1->input_variables[1]->fuzzysets[1]));
C1->rules[7]->consequent->set_premise(new TPremise(C1->output_variable->fuzzysets[1]));
}
if (C1->rules[8] != NULL)
{
C1->rules[8]->predicate->clear_premises();
C1->rules[8]->predicate->clear_operators();
C1->rules[8]->predicate->add_premise(new TPremise(C1->input_variables[0]->fuzzysets[2]));
C1->rules[8]->predicate->add_operator(0);
C1->rules[8]->predicate->add_premise(new TPremise(C1->input_variables[1]->fuzzysets[2]));
C1->rules[8]->consequent->set_premise(new TPremise(C1->output_variable->fuzzysets[0]));
}
// Choose best 16 from 256 as candidates
// create new controller for assessing migration goodness
C2 = new TFuzzyController();
// add input and output variables
C2->clear_input_variables();
C2->add_input_variable(new TVariable("LocalLoad", "", 00.0, 100.0));
C2->add_input_variable(new TVariable("RemoteLoad", "", 00.0, 100.0));
C2->output_variable = new TVariable("LocalRepulsion", "", 00.0, 100.0);
// add fuzzysets to the input and output variables
centre = 60; // input 1
C2->input_variables[0]->clear_fuzzysets();
C2->input_variables[0]->add_fuzzyset(new TFuzzySet(C2->input_variables[0], "Low", S_CURVE , DOWN , 0.00*centre, -0.0, 0.50*centre, -0.0, 1.00*centre));
C2->input_variables[0]->add_fuzzyset(new TFuzzySet(C2->input_variables[0], "Medium", PI_CURVE , UP , 0.00*centre, 0.50*centre, 1.00*centre, (100.0-0.50*centre), 100.0 ));
C2->input_variables[0]->add_fuzzyset(new TFuzzySet(C2->input_variables[0], "High", S_CURVE , UP , 1.00*centre, -0.0, (100.0-0.50*centre), -0.0, 100.0 ));
centre = 40; // input 2
C2->input_variables[1]->clear_fuzzysets();
C2->input_variables[1]->add_fuzzyset(new TFuzzySet(C2->input_variables[1], "Low", S_CURVE , DOWN , 0.00*centre, -0.0, 0.50*centre, -0.0, 1.00*centre));
C2->input_variables[1]->add_fuzzyset(new TFuzzySet(C2->input_variables[1], "Medium", PI_CURVE , UP , 0.00*centre, 0.50*centre, 1.00*centre, (100.0-0.50*centre), 100.0 ));
C2->input_variables[1]->add_fuzzyset(new TFuzzySet(C2->input_variables[1], "High", S_CURVE , UP , 1.00*centre, -0.0, (100.0-0.50*centre), -0.0, 100.0 ));
centre = 50; // output
C2->output_variable->clear_fuzzysets();
C2->output_variable->add_fuzzyset(new TFuzzySet(C2->output_variable, "Low", S_CURVE , DOWN , 0.00*centre, -0.0, 0.50*centre, -0.0, 1.00*centre));
C2->output_variable->add_fuzzyset(new TFuzzySet(C2->output_variable, "Medium", PI_CURVE , UP , 0.00*centre, 0.50*centre, 1.00*centre, (100.0-0.50*centre), 100.0 ));
C2->output_variable->add_fuzzyset(new TFuzzySet(C2->output_variable, "High", S_CURVE , UP , 1.00*centre, -0.0, (100.0-0.50*centre), -0.0, 100.0 ));
// create empty rules (conditional, alpha, weight)
C2->clear_rules();
C2->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C2->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C2->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C2->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C2->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C2->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C2->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C2->add_rule(new TFuzzyRule(true, 0.00, 1.0));
C2->add_rule(new TFuzzyRule(true, 0.00, 1.0));
// setup rules local_load remote_load local_repulsion
//----------------------------------------------------------------------------------
//
if (C2->rules[0] != NULL)
{
C2->rules[0]->predicate->clear_premises();
C2->rules[0]->predicate->clear_operators();
C2->rules[0]->predicate->add_premise(new TPremise(C2->input_variables[0]->fuzzysets[0]));
C2->rules[0]->predicate->add_operator(0);
C2->rules[0]->predicate->add_premise(new TPremise(C2->input_variables[1]->fuzzysets[0]));
C2->rules[0]->consequent->set_premise(new TPremise(C2->output_variable->fuzzysets[0]));
}
if (C2->rules[1] != NULL)
{
C2->rules[1]->predicate->clear_premises();
C2->rules[1]->predicate->clear_operators();
C2->rules[1]->predicate->add_premise(new TPremise(C2->input_variables[0]->fuzzysets[0]));
C2->rules[1]->predicate->add_operator(0);
C2->rules[1]->predicate->add_premise(new TPremise(C2->input_variables[1]->fuzzysets[1]));
C2->rules[1]->consequent->set_premise(new TPremise(C2->output_variable->fuzzysets[0]));
}
if (C2->rules[2] != NULL)
{
C2->rules[2]->predicate->clear_premises();
C2->rules[2]->predicate->clear_operators();
C2->rules[2]->predicate->add_premise(new TPremise(C2->input_variables[0]->fuzzysets[0]));
C2->rules[2]->predicate->add_operator(0);
C2->rules[2]->predicate->add_premise(new TPremise(C2->input_variables[1]->fuzzysets[2]));
C2->rules[2]->consequent->set_premise(new TPremise(C2->output_variable->fuzzysets[0]));
}
if (C2->rules[3] != NULL)
{
C2->rules[3]->predicate->clear_premises();
C2->rules[3]->predicate->clear_operators();
C2->rules[3]->predicate->add_premise(new TPremise(C2->input_variables[0]->fuzzysets[1]));
C2->rules[3]->predicate->add_operator(0);
C2->rules[3]->predicate->add_premise(new TPremise(C2->input_variables[1]->fuzzysets[0]));
C2->rules[3]->consequent->set_premise(new TPremise(C2->output_variable->fuzzysets[1]));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -