コード例 #1
0
static bool
_initialize_sml(Context *ctx)
{
    sml_set_stabilization_hits(ctx->sml, 0);
    sml_set_read_state_callback(ctx->sml, _read_state_cb, ctx);
    if (ctx->sml_engine == ANN_ENGINE)
        sml_ann_set_initial_required_observations(ctx->sml, REQUIRED_OBS);

    ctx->offense1 = _create_input(ctx, "red_striker");
    ctx->defense1 = _create_input(ctx, "red_goalkeeper");
    ctx->offense2 = _create_input(ctx, "yellow_striker");
    ctx->defense2 = _create_input(ctx, "yellow_goalkeeper");

    //number of the winner team
    ctx->winner = sml_new_output(ctx->sml, "winner");
    sml_variable_set_range(ctx->sml, ctx->winner, 0, 2);
    if (ctx->sml_engine == FUZZY_ENGINE) {
        sml_fuzzy_variable_add_term_ramp(ctx->sml, ctx->winner, "none",
            0 + DISCRETE_THRESHOLD, 0, 1);
        sml_fuzzy_variable_add_term_triangle(ctx->sml, ctx->winner,
            "red_winner", WINNER1 - DISCRETE_THRESHOLD, WINNER1,
            WINNER1 + DISCRETE_THRESHOLD, 1);
        sml_fuzzy_variable_add_term_ramp(ctx->sml, ctx->winner, "yellow_winner",
            WINNER2 - DISCRETE_THRESHOLD, WINNER2,
            1);
    }

    return true;
}
コード例 #2
0
static struct sml_variable *
_create_input(Context *ctx, const char *name)
{
    char term_name[TERM_NAME_SIZE];
    struct sml_variable *v;
    uint16_t i;

    v = sml_new_input(ctx->sml, name);
    sml_variable_set_range(ctx->sml, v, 0, ctx->num_players - 1);

    if (ctx->sml_engine == FUZZY_ENGINE) {
        snprintf(term_name, LINE_SIZE, "%s_%s", name, ctx->players[0]);
        sml_fuzzy_variable_add_term_ramp(ctx->sml, v, term_name,
            0 + DISCRETE_THRESHOLD, 0, 1);
        for (i = 1; i < ctx->num_players - 1; i++) {
            snprintf(term_name, LINE_SIZE, "%s_%s", name, ctx->players[i]);
            sml_fuzzy_variable_add_term_triangle(ctx->sml, v, term_name,
                i - DISCRETE_THRESHOLD, i,
                i + DISCRETE_THRESHOLD, 1);
        }
        snprintf(term_name, LINE_SIZE, "%s_%s", name, ctx->players[i]);
        sml_fuzzy_variable_add_term_ramp(ctx->sml, v, term_name,
            ctx->num_players - 1 - DISCRETE_THRESHOLD,
            ctx->num_players - 1, 1);
    }

    return v;
}
コード例 #3
0
static void
add_time_day(Context *ctx)
{
    int i;
    char term_name[8];

    if (ctx->enable_time_input && ctx->time_blocks) {
        ctx->time = sml_new_input(ctx->sml, TIME_STR);
        sml_variable_set_range(ctx->sml, ctx->time, 0, ctx->time_blocks);
    }

    if (ctx->enable_weekday_input) {
        /* Mon == 0; Sun == 6 */
        ctx->weekday = sml_new_input(ctx->sml, WEEKDAY_STR);
        sml_variable_set_range(ctx->sml, ctx->weekday, 0, 7);
    }

    if (ctx->engine_type != FUZZY_ENGINE &&
        ctx->engine_type != FUZZY_ENGINE_NO_SIMPLIFICATION)
        return;

    //create fuzzy terms
    if (ctx->time) {
        snprintf(term_name, sizeof(term_name), "%d",  0);
        sml_fuzzy_variable_add_term_ramp(ctx->sml, ctx->time, term_name, 1, 0);
        for (i = 1; i < ctx->time_blocks - 1; i++) {
            snprintf(term_name, sizeof(term_name), "%d",  i);
            sml_fuzzy_variable_add_term_triangle(ctx->sml, ctx->time,
                term_name, i - 1, i, i + 1);
        }
        snprintf(term_name, sizeof(term_name), "%d",  i);
        sml_fuzzy_variable_add_term_ramp(ctx->sml, ctx->time, term_name, i - 1,
            i);
    }

    if (ctx->weekday) {
        sml_fuzzy_variable_add_term_triangle(ctx->sml, ctx->weekday,
            "Monday", 0, 0.5, 1);
        sml_fuzzy_variable_add_term_triangle(ctx->sml, ctx->weekday,
            "Tuesday", 1, 1.5, 2);
        sml_fuzzy_variable_add_term_triangle(ctx->sml, ctx->weekday,
            "Wednesday", 2, 2.5, 3);
        sml_fuzzy_variable_add_term_triangle(ctx->sml, ctx->weekday,
            "Thursday", 3, 3.5, 4);
        sml_fuzzy_variable_add_term_triangle(ctx->sml, ctx->weekday,
            "Friday", 4, 4.5, 5);
        sml_fuzzy_variable_add_term_triangle(ctx->sml, ctx->weekday,
            "Saturday", 5, 5.5, 6);
        sml_fuzzy_variable_add_term_triangle(ctx->sml, ctx->weekday,
            "Sunday", 6, 6.5, 7);
    }
}
コード例 #4
0
static void
_add_terms(struct sml_object *sml, struct sml_variable *var, char *strbuf,
    int id, unsigned int num_terms)
{
    unsigned int i, step;

    step = RAND_MAX / num_terms;
    for (i = 0; i < num_terms; i++) {
        snprintf(strbuf, STRLEN, "term%d.%d", id, i);
        sml_fuzzy_variable_add_term_triangle(sml, var, strbuf, step * i,
            step * (i + 0.5), step * (i + 1));
    }
}
コード例 #5
0
static void
add_term(Context *ctx, Variable *var, const char *name, float min, float max)
{
    Term *term = calloc(1, sizeof(Term));

    strncpy(term->name, name, NAME_SIZE);
    term->name[NAME_SIZE - 1] = '\0';
    term->min = min;
    term->max = max;
    var->terms = g_list_append(var->terms, term);

    if (ctx->engine_type != FUZZY_ENGINE &&
        ctx->engine_type != FUZZY_ENGINE_NO_SIMPLIFICATION)
        return;

    if (term_is_discrete(term)) {
        if (fabs(var->min - min) < FLOAT_THRESHOLD)
            sml_fuzzy_variable_add_term_ramp(ctx->sml, var->sml_var, name,
                min + DISCRETE_THRESHOLD, min);
        else if (fabs(var->max - min) < FLOAT_THRESHOLD)
            sml_fuzzy_variable_add_term_ramp(ctx->sml, var->sml_var, name,
                min - DISCRETE_THRESHOLD, min);
        else
            sml_fuzzy_variable_add_term_triangle(ctx->sml, var->sml_var, name,
                min - DISCRETE_THRESHOLD, min,
                min + DISCRETE_THRESHOLD);
    } else {
        if (fabs(var->min - min) < FLOAT_THRESHOLD)
            sml_fuzzy_variable_add_term_ramp(ctx->sml, var->sml_var, name, max,
                min);
        else if (fabs(var->max - max) < FLOAT_THRESHOLD)
            sml_fuzzy_variable_add_term_ramp(ctx->sml, var->sml_var, name, min,
                max);
        else
            sml_fuzzy_variable_add_term_triangle(ctx->sml, var->sml_var, name,
                min, min + (max - min) / 2, max);
    }
}
コード例 #6
0
int
main(int argc, char **argv)
{
    Air_Conditioner_Controller acc;
    struct sml_variable *temp, *presence, *power;
    struct sml_object *sml;

    _initialize_acc(&acc);

    if (argc != 2) {
        fprintf(stderr, "Usage: %s <engine_type (0 fuzzy, 1 ann)>\n", argv[0]);
        fprintf(stderr, "Fuzzy Test: %s 0\n", argv[0]);
        fprintf(stderr, "Ann Test: %s 1\n", argv[0]);
        return -1;
    }

    sml = _sml_new(atoi(argv[1]));
    if (!sml) {
        sml_critical("Failed to create sml");
        return -1;
    }

    sml_main_loop_init();

    //Set stabilization hits and initial required obs to a low value because
    //this is a simulation and we don't want to wait for a long time before
    //getting interesting results
    sml_set_stabilization_hits(sml, STABILIZATION_HITS);
    sml_ann_set_initial_required_observations(sml, INITIAL_REQUIRED_OBS);

    //Create temperature input
    temp = sml_new_input(sml, "Temperature");
    sml_variable_set_range(sml, temp, 0, 50);
    sml_fuzzy_variable_add_term_ramp(sml, temp, "COLD", 16, 0, 1);
    sml_fuzzy_variable_add_term_triangle(sml, temp, "WARM", 15, 19, 23, 1);
    sml_fuzzy_variable_add_term_ramp(sml, temp, "HOT", 22, 50, 1);

    //Create presence input
    presence = sml_new_input(sml, "Presence");
    sml_variable_set_range(sml, presence, 0, 1);
    sml_fuzzy_variable_add_term_ramp(sml, presence, "ABSENT", 0.6, 0, 1);
    sml_fuzzy_variable_add_term_ramp(sml, presence, "PRESET", 0.4, 1, 1);

    //Create power output
    power = sml_new_output(sml, "Power");
    sml_variable_set_range(sml, power, 0, 3);
    sml_fuzzy_variable_add_term_ramp(sml, power, "OFF", 0.6, 0, 1);
    sml_fuzzy_variable_add_term_triangle(sml, power, "LOW", 0.4, 1, 1.6, 1);
    sml_fuzzy_variable_add_term_triangle(sml, power, "MEDIUM", 1.4, 2, 2.6, 1);
    sml_fuzzy_variable_add_term_ramp(sml, power, "HIGH", 2.4, 3, 1);

    //set SML callbacks
    sml_set_read_state_callback(sml, _read_state_cb, &acc);
    sml_main_loop_schedule_sml_process(sml, READ_TIMEOUT);
    sml_set_output_state_changed_callback(sml, _output_state_changed_cb, &acc);

    sml_main_loop_run();

    sml_free(sml);
    sml_main_loop_shutdown();
    return 0;
}