質問編集履歴

2

訂正

2018/10/02 17:45

投稿

rosbergf1
rosbergf1

スコア13

test CHANGED
File without changes
test CHANGED
@@ -110,102 +110,136 @@
110
110
 
111
111
  void covering(vector<Classifier>& CS, const vector<double>& data, vector< vector<double> >& valuepattern, const int t, const string Func) {
112
112
 
113
- int i, j, k;
113
+ int i, j, k, n;
114
+
115
+ int nownumber;
114
116
 
115
117
  vector <vector<double> > notvalue;
116
118
 
119
+ vector<double> action;
120
+
117
121
  int counter = 0;
118
122
 
123
+ //マッチセットの中の行動をカウント
124
+
125
+ for(i = 0; i < valuepattern.size(); i++) {
126
+
127
+ for(j = 0; j < CS.size(); j++) {
128
+
129
+ if(CS[j].MS == 1) {
130
+
131
+ if(CS[j].a == valuepattern[i]) {
132
+
133
+ counter++;
134
+
135
+ break;
136
+
137
+ }
138
+
139
+ else {
140
+
141
+ notvalue.push_back(valuepattern[i]);
142
+
143
+ }
144
+
145
+ }
146
+
147
+ }
148
+
149
+ }
150
+
151
+ //10種類の行動があればカバーリングを行わずに終了
152
+
153
+ if(counter >= 10)
154
+
155
+ return;
156
+
119
157
 
120
158
 
159
+ //行動が10種類なければカバーリングを行う
160
+
161
+ nownumber = CS.size();
162
+
163
+ if(counter > 0) {
164
+
121
- for(i = 0; i < valuepattern.size(); i++) {
165
+ for(i = 0; i < notvalue.size() - counter; i++) {
166
+
122
-
167
+ //rm_cs_of_MAX(CS, n);
168
+
169
+ CSAddset(CS);
170
+
123
- for(j = 0; j < CS.size(); j++) {
171
+ for(j = 0; j < CS.size(); j++) {
124
-
172
+
125
- if(CS[j].MS == 1) {
173
+ if(CS[j].a.size() == 0) {
126
-
174
+
127
- if(CS[j].a == valuepattern[i]) {
175
+ cout << i+1 << "回目" << "Addsetおかしいぞ" << endl;
128
-
129
- counter++;
176
+
130
-
131
- break;
177
+ abort();
132
-
133
- }
134
-
135
- else {
136
-
137
- notvalue.push_back(valuepattern[i]);
138
178
 
139
179
  }
140
180
 
141
181
  }
142
182
 
183
+ k = CS.size() - 1;
184
+
185
+ CS[k].a = notvalue[i];
186
+
187
+ do {
188
+
189
+ CS_propagation(CS, data, t, k, Func);
190
+
191
+ CS_BPTT(CS, data, t, k, Func);
192
+
193
+ } while(CS[k].RNN.o.n[0] <= CS[k].RNN.o.n[1]);
194
+
195
+ CS[k].MS = 1;
196
+
197
+ k++;
198
+
143
199
  }
144
200
 
145
201
  }
146
202
 
147
- //すべての種類の行動があればカバーリングを行わずに終了
148
-
149
- if(counter == valuepattern.size())
150
-
151
- return;
203
+ else {
152
-
153
-
154
-
155
- //すべての種類の行動がなければカバーリングを行う
204
+
156
-
157
- if(counter > 0) {
158
-
159
- for(i = 0; i < notvalue.size(); i++) {
205
+ for(i = 0; i < valuepattern.size(); i++) {
206
+
160
-
207
+ //rm_cs_of_MAX(CS, n);
208
+
161
- CS.push_back(CS[0]);
209
+ CSAddset(CS);
210
+
162
-
211
+ for(j = 0; j < CS.size(); j++) {
212
+
213
+ if(CS[j].a.size() == 0) {
214
+
215
+ cout << i+1 << "回目" << "Addsetおかしいぞ" << endl;
216
+
217
+ abort();
218
+
219
+ }
220
+
221
+ }
222
+
163
- j = CS.size() - 1;
223
+ k = CS.size() - 1;
164
-
165
- CSAddset(CS, j);
224
+
166
-
167
- CS[j].a = notvalue[i];
225
+ CS[k].a = valuepattern[i];
168
226
 
169
227
  do {
170
228
 
171
- CS_propagation(CS, data, t, j, Func);
229
+ CS_propagation(CS, data, t, k, Func);
172
-
230
+
173
- CS_BPTT(CS, data, t, j, Func);
231
+ CS_BPTT(CS, data, t, k, Func);
174
-
232
+
175
- } while(CS[j].RNN.o.n[0] <= CS[j].RNN.o.n[1]);
233
+ } while(CS[k].RNN.o.n[0] <= CS[k].RNN.o.n[1]);
176
-
234
+
177
- CS[j].MS = 1;
235
+ CS[k].MS = 1;
236
+
237
+ k++;
178
238
 
179
239
  }
180
240
 
181
241
  }
182
242
 
183
- else {
184
-
185
- for(i = 0; i < valuepattern.size(); i++) {
186
-
187
- CS.push_back(CS[0]);
188
-
189
- j = CS.size() - 1;
190
-
191
- CSAddset(CS, j);
192
-
193
- CS[j].a = valuepattern[i];
194
-
195
- do {
196
-
197
- CS_propagation(CS, data, t, j, Func);
198
-
199
- CS_BPTT(CS, data, t, j, Func);
200
-
201
- } while(CS[j].RNN.o.n[0] <= CS[j].RNN.o.n[1]);
202
-
203
- CS[j].MS = 1;
204
-
205
- }
206
-
207
- }
208
-
209
243
  rm_cs_of_add(CS);
210
244
 
211
245
  }
@@ -222,6 +256,8 @@
222
256
 
223
257
  合わせて, Addsetも追記しておきます.
224
258
 
259
+ コメント文では, "2回目Addsetおかしいぞ"と出力されるので, 2回目の実行からおかしくなっているものと思われます.
260
+
225
261
  よろしくお願いします.
226
262
 
227
263
  ### 補足情報(FW/ツールのバージョンなど)

1

追記

2018/10/02 17:45

投稿

rosbergf1
rosbergf1

スコア13

test CHANGED
@@ -1 +1 @@
1
- vectorの代入に関して問題が生じている.
1
+ 構造体のvectorをpush_backする過程で問題が生じている
test CHANGED
@@ -74,175 +74,155 @@
74
74
 
75
75
 
76
76
 
77
+ void CSAddset(vector<Classifier>& CS) {
78
+
79
+ int i;
80
+
81
+ CS.push_back(CS[0]);
82
+
83
+ i = CS.size() - 1;
84
+
85
+ //RNN
86
+
87
+ FirstCS_RNN(CS, i);
88
+
89
+ CS[i].p = 0.1;
90
+
91
+ CS[i].e = 0.1;
92
+
93
+ CS[i].F = 0.1;
94
+
95
+ CS[i].exp = 0;
96
+
97
+ CS[i].as = 0;
98
+
99
+ CS[i].ts = 0;
100
+
101
+ CS[i].MS = 0;
102
+
103
+ CS[i].AS = 0;
104
+
105
+ }
106
+
107
+
108
+
77
- //この関数ではうまく代入され
109
+ //この関数内のAddset問題が生じ.
78
-
110
+
79
- void CSFirstset(vector<Classifier>& CS, const vector< vector<double> >& valuepattern) {
111
+ void covering(vector<Classifier>& CS, const vector<double>& data, vector< vector<double> >& valuepattern, const int t, const string Func) {
80
112
 
81
113
  int i, j, k;
82
114
 
83
- double value;
84
-
85
- for(i = 0; i < CS.size(); i++) {
86
-
87
- //RNN
88
-
89
- FirstCS_RNN(CS, i);
90
-
91
- //行動部
92
-
93
- j = intrand(0, valuepattern.size() - 1); //intrand(min, max) min~maxの整数値を乱数で返す
94
-
95
- CS[i].a = valuepattern[j];
96
-
97
- //予測報酬
98
-
99
- CS[i].p = 1;
100
-
101
- //予測誤差
102
-
103
- CS[i].e = doublerand(0,1);
104
-
105
- //適合度
106
-
107
- CS[i].F = doublerand(0,1);
108
-
109
- //経験値
110
-
111
- CS[i].exp = 0;
112
-
113
- //アクションセットサイズ
114
-
115
- CS[i].as = 0;
116
-
117
- //タイムスタンプ
118
-
119
- CS[i].ts = 0;
120
-
121
- //マッチセット
122
-
123
- CS[i].MS = 0;
124
-
125
- //アクションセット
126
-
127
- CS[i].AS = 0;
128
-
129
- }
115
+ vector <vector<double> > notvalue;
116
+
117
+ int counter = 0;
118
+
119
+
120
+
121
+ for(i = 0; i < valuepattern.size(); i++) {
122
+
123
+ for(j = 0; j < CS.size(); j++) {
124
+
125
+ if(CS[j].MS == 1) {
126
+
127
+ if(CS[j].a == valuepattern[i]) {
128
+
129
+ counter++;
130
+
131
+ break;
132
+
133
+ }
134
+
135
+ else {
136
+
137
+ notvalue.push_back(valuepattern[i]);
138
+
139
+ }
140
+
141
+ }
142
+
143
+ }
144
+
145
+ }
146
+
147
+ //すべての種類の行動があればカバーリングを行わずに終了
148
+
149
+ if(counter == valuepattern.size())
150
+
151
+ return;
152
+
153
+
154
+
155
+ //すべての種類の行動がなければカバーリングを行う
156
+
157
+ if(counter > 0) {
158
+
159
+ for(i = 0; i < notvalue.size(); i++) {
160
+
161
+ CS.push_back(CS[0]);
162
+
163
+ j = CS.size() - 1;
164
+
165
+ CSAddset(CS, j);
166
+
167
+ CS[j].a = notvalue[i];
168
+
169
+ do {
170
+
171
+ CS_propagation(CS, data, t, j, Func);
172
+
173
+ CS_BPTT(CS, data, t, j, Func);
174
+
175
+ } while(CS[j].RNN.o.n[0] <= CS[j].RNN.o.n[1]);
176
+
177
+ CS[j].MS = 1;
178
+
179
+ }
180
+
181
+ }
182
+
183
+ else {
184
+
185
+ for(i = 0; i < valuepattern.size(); i++) {
186
+
187
+ CS.push_back(CS[0]);
188
+
189
+ j = CS.size() - 1;
190
+
191
+ CSAddset(CS, j);
192
+
193
+ CS[j].a = valuepattern[i];
194
+
195
+ do {
196
+
197
+ CS_propagation(CS, data, t, j, Func);
198
+
199
+ CS_BPTT(CS, data, t, j, Func);
200
+
201
+ } while(CS[j].RNN.o.n[0] <= CS[j].RNN.o.n[1]);
202
+
203
+ CS[j].MS = 1;
204
+
205
+ }
206
+
207
+ }
208
+
209
+ rm_cs_of_add(CS);
130
210
 
131
211
  }
132
212
 
133
- //この関数で問題が生じる.
134
-
135
- void covering(vector<Classifier>& CS, const vector<double>& data, vector< vector<double> >& valuepattern, const int t, const string Func) {
136
-
137
- int i, j, k;
138
-
139
- vector <vector<double> > notvalue;
140
-
141
- int counter = 0;
142
-
143
- //マッチセットの中の行動をカウント
144
-
145
- for(i = 0; i < valuepattern.size(); i++) {
146
-
147
- for(j = 0; j < CS.size(); j++) {
148
-
149
- if(CS[j].MS == 1) {
150
-
151
- if(CS[j].a == valuepattern[i]) {
152
-
153
- counter++;
154
-
155
- break;
156
-
157
- }
158
-
159
- else {
160
-
161
- notvalue.push_back(valuepattern[i]);
162
-
163
- }
164
-
165
- }
166
-
167
- }
168
-
169
- }
170
-
171
- //すべての種類の行動があればカバーリングを行わずに終了
172
-
173
- if(counter == valuepattern.size())
174
-
175
- return;
176
-
177
-
178
-
179
- //すべての種類の行動がなければカバーリングを行う
180
-
181
- if(counter > 0) {
182
-
183
- for(i = 0; i < notvalue.size(); i++) {
184
-
185
- CS.push_back(CS[0]);
186
-
187
- j = CS.size() - 1;
188
-
189
- CSAddset(CS, j); //ここでは代入していません.
190
-
191
- CS[j].a = notvalue[i]; //この部分でのみ代入.
192
-
193
- do {
194
-
195
- CS_propagation(CS, data, t, j, Func); //ここでは代入していないので気にしないでください.
196
-
197
- CS_BPTT(CS, data, t, j, Func); //同上
198
-
199
- } while(CS[j].RNN.o.n[0] <= CS[j].RNN.o.n[1]);
200
-
201
- CS[j].MS = 1;
202
-
203
- }
204
-
205
- }
206
-
207
- else {
208
-
209
- for(i = 0; i < valuepattern.size(); i++) {
210
-
211
- CS.push_back(CS[0]);
212
-
213
- j = CS.size() - 1;
214
-
215
- CSAddset(CS, j);
216
-
217
- CS[j].a = valuepattern[i]; //この部分でのみ代入
218
-
219
- do {
220
-
221
- CS_propagation(CS, data, t, j, Func);
222
-
223
- CS_BPTT(CS, data, t, j, Func);
224
-
225
- } while(CS[j].RNN.o.n[0] <= CS[j].RNN.o.n[1]);
226
-
227
- CS[j].MS = 1;
228
-
229
- }
230
-
231
- }
232
-
233
- rm_cs_of_add(CS);
234
-
235
- }
236
-
237
213
  ```
238
214
 
239
215
  ### やってみたこと
240
216
 
241
217
  vectorの構造体を追加したあとにいろいろとメンバ変数に代入しているのですが, その過程で問題が生じているみたいです.
242
218
 
243
-
219
+ ******************追記*******************
220
+
244
-
221
+ デバッグで追ったところ, 関数covering内のAddsetを実行後に要素が0になっていることがわかりました.
222
+
245
-
223
+ 合わせて, Addsetも追記しておきます.
224
+
225
+ よろしくお願いします.
246
226
 
247
227
  ### 補足情報(FW/ツールのバージョンなど)
248
228