値によって組み分けを作成するプログラムについて
こんにちは。
プログラミングでつまってしまったため質問させて頂きます。
プログラミング言語はC++です(visual c++ではありません)。
■作成したいプログラム
A,B,C,D,Eがある。
AとBの類似度は91%
以下同様に
AとCは89%
AとDは79%
AとEは77%
BとCは93%
BとDは97%
・・・のように続いていく..
(*ABが似ている、BCが似ている。だからと言ってACが似ているとは言えない。)
この中で、類似度が閾値以上である場合は同じ組とする。
ただし、複数のパターンが考えられる場合は組の数が一番すくなくなるように作る。
■プログラムの動作イメージ
例1:
閾値=0.90
//入力データ
01 = 0.91; OK
02 = 0.90; OK
03 = 0.78; NG
04 = 0.83; NG
12 = 0.94; OK
13 = 0.78; NG
14 = 0.77; NG
23 = 0.78; NG
24 = 0.69; NG
34 = 0.94; OK
OKなのは,01,02,12,34
つまり以下のような出力が得られる
>>0,1,2
>>3,4
---------------------------------------
例2:
閾値=0.90
//入力データ
01 = 0.91; OK
02 = 0.90; OK
03 = 0.94; OK
04 = 0.83; NG
12 = 0.95; OK
13 = 0.78; NG
14 = 0.77; NG
23 = 0.78; NG
24 = 0.69; NG
34 = 0.94; OK
OKなのは,01,02,03,12,34
つまり
0,1,2
3,4
or
0,3
1,2
4
となった場合は、組数の少ない上を選択する。
従って以下のような出力が得られる。
>>0,1,2
>>3,4
---------------------------------------
例3:
閾値=0.90
//入力データ
01 = 0.91; OK
02 = 0.90; OK
03 = 0.78; NG
04 = 0.83; NG
12 = 0.77; NG
13 = 0.78; NG
14 = 0.77; NG
23 = 0.78; NG
24 = 0.69; NG
34 = 0.94; OK
OKなのは,01,02,34
この場合は、01と02は閾値を超えているが、12は閾値を超えていないため、
0,1,2を同じ組とはできない。
従って以下の2パターンが考えられる。
0,1
2
3,4
or
0,2
1
3,4
この場合は組の数は同じなのでどちらが出力されてもOK。
番号の若いものから出力されるとすると以下のような出力が得られる。
>>0,1
>>2
>>3,4
------------------------------------------------------
以上のようなプログラムを作成したいです。
自分で考えてみたのプログラムが以下のものです。
01,02,12,34は閾値を超えているということまではできたのですが、その後のグループの作り方のところで詰まってしまいました。
そこで、上記のような動作をするプログラムについて教えていただきたいです。
よろしくお願い致します。
int main(){
//閾値
double THRESHOLD = 0.9;
//dataを格納する配列
double in_data[5][5] = {0};
//group_flagを格納する配列
bool group_flag[5][5] = {0};
in_data[0][1] = 0.91;
in_data[0][2] = 0.90;
in_data[0][3] = 0.78;
in_data[0][4] = 0.83;
in_data[1][2] = 0.94;
in_data[1][3] = 0.78;
in_data[1][4] = 0.77;
in_data[2][3] = 0.78;
in_data[2][4] = 0.69;
in_data[3][4] = 0.94;
//組の番号を格納する配列
//group[3]=2だったら、データ3はグループ2に入る
int group[5];
int i=5; //データ数
int num=0;
for(int n=0; n<=i; n++){
for(int m=n+1; m<i ;m++){
cout << "in_data[" << n << "][" << m << "]=" << in_data[n][m] << endl;
if(in_data[n][m] >= THRESHOLD){
cout << "OK" << endl;
group_flag[n][m] = 1;
}
}
}
for(int n=0; n<=i; n++){
for(int m=n+1; m<i ;m++){
if(group_flag[n][m] == 1){
cout << n << m <<endl;
}
}
}
}