⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 this algorithm this is a good
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include "hmm.h"

/* 颇老狼 沥焊甫 佬绰 窃荐  */
void read_data(int[], char*);
/* 角力利栏肺 厚磐厚 舅绊府硫阑 角青矫虐绰 窃荐  */
void viterbi();

Fair fair_die = 
{.95l, .05l, {.0l, 1.0l/6.0l, 1.0l/6.0l, 1.0l/6.0l, 1.0l/6.0l, 1.0l/6.0l, 1.0l/6.0l}};

Loaded loaded_die = 
{.9l, .1l, {.0l, 1.0l/10.0l, 1.0l/10.0l, 1.0l/10.0l, 1.0l/10.0l, 1.0l/10.0l, 1.0l/2.0l}};

/* 皋牢窃荐 矫累 */
int main(int argc, char *argv[])
{
    read_data(result, which_dice);
    viterbi();
    system("PAUSE");	
    return 0;
}

void read_data(int result[], char* which_idce){
    FILE* fp = NULL;
    char ch;
    unsigned int line_num = 0;
    unsigned int result_count = 0;
    unsigned int which_dice_count = 0;
    
    /* 林绢柳 单捞磐 颇老阑 绊摹绰 巴 绝捞 佬绢甸捞扁 困秦辑 */
    fp = fopen("1802_TEST.txt", "r");
    while((ch = getc(fp)) != EOF){
        if(ch == '\n'){ 
            line_num++;
            continue;
        }
        if(line_num == 0 || line_num == 6) continue;
        if(line_num >= 1 && line_num <= 5){/* 林荤困 传狼 荐甫 佬绢甸牢促. */
            result[result_count++] = atoi(&ch);
        }
        if(line_num >= 7 && line_num <= 11){/* 林绢柳 搬苞 单捞磐甫 佬绢甸牢促. */
            *(which_dice+(which_dice_count++)) = ch;
        }
    } 
    fclose(fp);
}


void viterbi(){
    long double delta_prev[2]; /* (load , fair)街 */
    long double delta_now[2];
    long double max_value;
    int t; /* 矫埃阑 唱鸥晨 */
    int back_track_t, count;
    long double best_score;
    int index_of_end_back = -1;
    char induct_result[NUM_OF_RESULT+1];
    induct_result[NUM_OF_RESULT] = '\0';
    
    /* initialization 矫累 */
    delta_now[0] = pi_load * loaded_die.face[result[0]];
    delta_now[1] = pi_fair * fair_die.face[result[0]];
    back_track[0][0] = 'S'; /* 飘发欧且锭 付瘤阜阑 唱鸥晨 */
    back_track[0][1] = 'S';
    /* initialization 场 */
    
    /* Induction 矫累 */
    for(t=1;t < NUM_OF_RESULT;t++){
        delta_prev[0] = delta_now[0];
        delta_prev[1] = delta_now[1];

        /* Load state俊 措茄 拌魂 */
        max_value = delta_prev[0] * loaded_die.transition_to_self;
        back_track[t][0] = 'L';
        if( max_value < (delta_prev[1] * fair_die.transition_to_loaded)){
            max_value = delta_prev[1] * fair_die.transition_to_loaded;
            back_track[t][0] = 'F';
        }
        delta_now[0] = max_value * loaded_die.face[result[t]];
        
        /* Fair State俊 措茄 拌魂 */
        max_value = delta_prev[0] * loaded_die.transition_to_fair;
        back_track[t][1] = 'L';
        if( max_value < (delta_prev[1] * fair_die.transition_to_self)){
            max_value = delta_prev[1] * fair_die.transition_to_self;
            back_track[t][1] = 'F';
        }
        delta_now[1] = max_value * fair_die.face[result[t]];
    }
    /* Induction 场 */
    
    /* Termination 矫累 */
    if(delta_now[0] < delta_now[1]){
        best_score = delta_now[1];
        index_of_end_back = 1;
        induct_result[299] = 'F';
    }else if(delta_now[0] > delta_now[1]){
        best_score = delta_now[0];
        index_of_end_back = 0;
        induct_result[299] = 'L';
    }
    /* Termination 场 */
    
    /* Back Tracking 矫累 */
    for(back_track_t = NUM_OF_RESULT-2 ; back_track_t >= 0 ; back_track_t--){
        
        induct_result[back_track_t] = back_track[back_track_t+1][index_of_end_back];
        
        if(induct_result[back_track_t] == 'L'){
            index_of_end_back = 0;
        }else if(induct_result[back_track_t] == 'F'){
            index_of_end_back = 1;
        }
        
    }
    /* Back Tracking 场 */
    
    /* 搬苞 免仿 */
    printf("Given Result!\n%s\n\n", which_dice);
    printf("Viterbi Result!\n%s\n\n", induct_result);
    count = 0;
    for(t = 0; t < NUM_OF_RESULT;t++){
        if(induct_result[t] != which_dice[t]){
            count++;
        }
    }
    printf("Error rate %f %%\n", (((float)count/(float)NUM_OF_RESULT)*100));
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -