teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

9

プログラムの訂正、エラー内容を訂正しました。

2021/11/24 13:31

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -20,201 +20,7 @@
20
20
  ### 該当のソースコード
21
21
 
22
22
  ```C++
23
- #include <iostream>
24
- #include <vector>
25
- #include <algorithm>
26
- #include <list>
27
- #include <random>
28
- #include <queue>
29
23
 
30
- using namespace std;
31
-
32
- bool graph[1010][1010];
33
-
34
- class con_matrix
35
- {
36
- private:
37
- vector < vector<int>> matrix;
38
- public:
39
- con_matrix(int vn, int en) { set_vertex_num(vn, en); }
40
- void set_vertex_num(int vn, int en)
41
- {
42
- matrix.resize(vn); //行列行数を設定
43
- for (auto& line : matrix)
44
- line.resize(en); //行列列数を設定
45
- }
46
- int get_vertex_num() const { return matrix.size(); }
47
- int get_edge_num() const { return matrix.at(0).size(); }
48
-
49
- void set_random(unsigned int seed = 0) // seed:乱数シード(値を変えると乱数列が変化)
50
- {
51
- for (auto& row : matrix)
52
- {
53
- for (auto& v : row)
54
- v = 0; //要素をクリア
55
- }
56
-
57
- int vn = matrix.size(); //頂点数
58
- int en = matrix.at(0).size(); //辺数
59
- srand(seed);
60
- vector<pair<int, int>> es;
61
- for (int i = 0; i < vn - 1; ++i)
62
- for (int j = i + 1; j < vn; ++j)
63
- es.emplace_back(i, j);
64
- for (int i = 0; i < en; ++i)
65
- {
66
- swap(es[i], es[i + rand() % (es.size() - i)]);
67
- matrix[es[i].first][i] = 1;
68
- matrix[es[i].second][i] = 1;
69
- }
70
- }
71
-
72
- void disp_connection() const
73
- {
74
- for (auto& row : matrix) {
75
- for (auto v : row)
76
- cout << v << " "; //要素を表示
77
- cout << endl; //行列列数を設定
78
- }
79
- }
80
-
81
- void Coalescence(vector<int>& ev, int r1, vector<int>& r2) // 取り出した複数の行を一つの行になるよう組合す
82
- {
83
- int Vertex = get_vertex_num();
84
- int Edge = get_edge_num();
85
- random_shuffle(r2.begin(), r2.end());
86
- // 行を初期化
87
- for (int iE = 0; iE < Edge; iE++) {
88
- ev[iE] = 0;
89
- }
90
- for (int iV = 0; iV < r1; iV++) {
91
- for (int iE = 0; iE < Edge; iE++) {
92
- if (ev[iE] == 0 && matrix[r2[iV]][iE] == 1) {
93
- ev[iE] = 1;
94
- }
95
- }
96
- }
97
- }
98
- };
99
-
100
- // 頂点集合を取り出し、被覆かどうかをチェックする
101
- int Is_cover(con_matrix a, vector<int>& matrix, vector<int>& r, int r1, vector<int>& r2) {
102
- int iV = a.get_vertex_num(); // 頂点数
103
- int iE = a.get_edge_num(); // 辺数
104
- int num = 0;
105
- a.Coalescence(matrix,r1,r2);
106
- for (int i = 0; i < iE; i++) {
107
- num += matrix[i];
108
- }
109
- if (num == iE) {
110
- return true;
111
- }
112
- else return false;
113
- }
114
-
115
- void tabu_add(int num, vector<int>& tabu_list, int tabu_size, int& tabu_last)
116
- {
117
- tabu_list[tabu_last] = num;
118
- tabu_last++;
119
- if (tabu_last >= tabu_size)
120
- tabu_last = 0;
121
- }
122
-
123
- int tabu_cheak(int num,vector<int> tabu_list,int tabu_size)
124
- {
125
- for (int i = 0; i < tabu_size; i++) {
126
- if (tabu_list[i] == num)
127
- return true;
128
- }
129
- return false;
130
- }
131
-
132
- // 局所探索法
133
- void Cover_search(con_matrix a, vector<int>& matrix, vector<int>& tem, int& r1, vector<int>& r2)
134
- {
135
- int gm = rand() % (r1 - 1); // 取り出す要素
136
- sort(tem.begin(), tem.end());
137
- int x = tem[gm];
138
- tem.erase(tem.begin() + gm);
139
- if (Is_cover(a, matrix,tem,r1, r2) == true) {
140
- cout << "取り出した行:" << x << ",頂点数:" << r1 << ":" << "true" << endl;
141
- r1--;
142
- }
143
- else if (Is_cover(a, matrix,tem, r1, r2) == false) {
144
- cout << "取り出した行:" << x << ",頂点数:" << r1 << ":" << "false" << endl;
145
- tem.push_back(x);
146
- }
147
- }
148
-
149
- // タブー探索法
150
- void Tabu_Cover_search(con_matrix a, vector<int>& matrix, vector<int>& r, int& r1, vector<int>& r2, vector<int>& tabu_list, int& tabu_size,int& tabu_last)
151
- {
152
- int gm = rand() % (r1 - 1); // 取り出す要素
153
- sort(r.begin(), r.end());
154
- int x = r[gm];
155
- r.erase(r.begin() + gm);
156
- if (tabu_cheak(x, tabu_list, tabu_size) == false) {
157
- if (Is_cover(a, matrix, r, r1, r2) == true) {
158
- cout << "取り出した行:" << x << ",頂点数:" << r1 << ":" << "true" << endl;
159
- r1--;
160
- }
161
- else if (Is_cover(a, matrix, r, r1, r2) == false) {
162
- cout << "取り出した行:" << x << ",頂点数:" << r1 << ":" << "false" << endl;
163
- r.push_back(x);
164
- tabu_add(x, tabu_list, tabu_size, tabu_last);
165
- }
166
- }
167
- else {
168
- r.push_back(x);
169
- }
170
- }
171
-
172
- int main(void)
173
- {
174
- const int n = 10; //頂点数
175
- double r = 0.5; //辺数の比率
176
- const int e = ((n * (n - 1) / 2) * r); //辺数
177
- int ram1; // 取り出す行の数
178
- vector <int> tem; // 取り出した行の配列
179
- vector <int> ram2(n,0); // 取り出される行
180
- for (int i = 0; i < n; i++) {
181
- ram2[i] = i;
182
- }
183
-
184
- int search = 100; // 探索回数
185
- int tabu_size = 10; // タブーサイズ
186
- vector <int> tabu(tabu_size, -1); // タブーリスト
187
- int tabu_last = 0; // 今現在のタブーリストの位置
188
-
189
- con_matrix M(n, e);
190
- vector<int> matrix(e, 0); // 組合す行
191
- M.set_random(1);
192
- cout << "頂点数 = " << n << endl;
193
- cout << "グラフの辺数 = " << e << endl;
194
- //M.disp_connection(); // 接続行列表示
195
- cout << endl;
196
-
197
- for (int i = 0; i < 10; i++) {
198
- ram1 = rand() % n + 1;
199
- Is_cover(M, matrix,tem, ram1, ram2);
200
- if (Is_cover(M, matrix,tem, ram1, ram2) == true) {
201
- for (int i = 0; i < ram1; i++) {
202
- tem.push_back(ram2[i]);
203
- }
204
- cout << "初期解:" << ram1 << endl;
205
- cout << endl;
206
- break;
207
- }
208
- }
209
-
210
- for (int s = 0; s < search; s++) {
211
- Cover_search(M, matrix, tem, ram1, ram2);
212
- // Tabu_Cover_search(M, matrix, tem, ram1, ram2, tabu, tabu_size, tabu_last);
213
- }
214
- return 0;
215
- }
216
-
217
-
218
24
  ```
219
25
 
220
26
  ### 試したこと

8

プログラムとエラー、質問内容の訂正しました。

2021/11/24 13:31

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- どこが原因で実行できなのかわからない
1
+ ハンドルされていない例外への対処方法
body CHANGED
@@ -1,8 +1,4 @@
1
1
  ### 前提・実現したいこと
2
- 入力中の内容をテンプレートとして保存
3
- プレビュー
4
- 閉じる
5
- 他のユーザ
6
2
  生成した接続行列から行をランダムに取り出し、一つの行に組み合わせる。その後組み合わせた行は被覆しているかをチェックし、結果を「ture」「false」で出力する。
7
3
  出力した後、取り出した行を一つずつ減らしていき最小頂点被覆数を求める。
8
4
  ```
@@ -17,11 +13,9 @@
17
13
 
18
14
 
19
15
  ### 発生している問題・エラーメッセージ
16
+ 「ハンドルされない例外が 0x7A28FC66 (ucrtbased.dll) で発生しました: 無効なパラメーターを致命的と見なす関数に無効なパラメーターが渡されました」といった内容が出ます。
20
17
 
21
- ```
22
- エラ内容が表示されないため、何が原因でエラーとなっているのかわからない状態です。
18
+ ![イメジ説明](73ee4f31c01cc58d27e4c715031bf89a.png)
23
- 警告文も特に何も出ていない状態です。
24
- ```
25
19
 
26
20
  ### 該当のソースコード
27
21
 
@@ -84,7 +78,7 @@
84
78
  }
85
79
  }
86
80
 
87
- void Coalescence(vector<int>& ev, vector<int>& r, int r1, vector<int>& r2) // 取り出した複数の行を一つの行になるよう組合す
81
+ void Coalescence(vector<int>& ev, int r1, vector<int>& r2) // 取り出した複数の行を一つの行になるよう組合す
88
82
  {
89
83
  int Vertex = get_vertex_num();
90
84
  int Edge = get_edge_num();
@@ -94,7 +88,6 @@
94
88
  ev[iE] = 0;
95
89
  }
96
90
  for (int iV = 0; iV < r1; iV++) {
97
- r.push_back(r2[iV]);
98
91
  for (int iE = 0; iE < Edge; iE++) {
99
92
  if (ev[iE] == 0 && matrix[r2[iV]][iE] == 1) {
100
93
  ev[iE] = 1;
@@ -105,11 +98,11 @@
105
98
  };
106
99
 
107
100
  // 頂点集合を取り出し、被覆かどうかをチェックする
108
- int Is_cover(con_matrix a, vector<int> matrix, vector<int> r, int r1, vector<int> r2) {
101
+ int Is_cover(con_matrix a, vector<int>& matrix, vector<int>& r, int r1, vector<int>& r2) {
109
102
  int iV = a.get_vertex_num(); // 頂点数
110
103
  int iE = a.get_edge_num(); // 辺数
111
104
  int num = 0;
112
- a.Coalescence(matrix,r,r1,r2);
105
+ a.Coalescence(matrix,r1,r2);
113
106
  for (int i = 0; i < iE; i++) {
114
107
  num += matrix[i];
115
108
  }
@@ -119,19 +112,60 @@
119
112
  else return false;
120
113
  }
121
114
 
122
- void Cover_search(con_matrix a, vector<int>& matrix, vector<int>& r, int ram1, vector<int>& ram2)
115
+ void tabu_add(int num, vector<int>& tabu_list, int tabu_size, int& tabu_last)
123
116
  {
117
+ tabu_list[tabu_last] = num;
118
+ tabu_last++;
119
+ if (tabu_last >= tabu_size)
120
+ tabu_last = 0;
121
+ }
122
+
123
+ int tabu_cheak(int num,vector<int> tabu_list,int tabu_size)
124
+ {
125
+ for (int i = 0; i < tabu_size; i++) {
126
+ if (tabu_list[i] == num)
127
+ return true;
128
+ }
129
+ return false;
130
+ }
131
+
132
+ // 局所探索法
133
+ void Cover_search(con_matrix a, vector<int>& matrix, vector<int>& tem, int& r1, vector<int>& r2)
134
+ {
135
+ int gm = rand() % (r1 - 1); // 取り出す要素
124
- int gm = rand() % (ram1-1);
136
+ sort(tem.begin(), tem.end());
125
- int am = r[gm];
137
+ int x = tem[gm];
138
+ tem.erase(tem.begin() + gm);
139
+ if (Is_cover(a, matrix,tem,r1, r2) == true) {
140
+ cout << "取り出した行:" << x << ",頂点数:" << r1 << ":" << "true" << endl;
141
+ r1--;
142
+ }
143
+ else if (Is_cover(a, matrix,tem, r1, r2) == false) {
144
+ cout << "取り出した行:" << x << ",頂点数:" << r1 << ":" << "false" << endl;
145
+ tem.push_back(x);
146
+ }
147
+ }
148
+
149
+ // タブー探索法
150
+ void Tabu_Cover_search(con_matrix a, vector<int>& matrix, vector<int>& r, int& r1, vector<int>& r2, vector<int>& tabu_list, int& tabu_size,int& tabu_last)
151
+ {
152
+ int gm = rand() % (r1 - 1); // 取り出す要素
126
153
  sort(r.begin(), r.end());
154
+ int x = r[gm];
127
155
  r.erase(r.begin() + gm);
156
+ if (tabu_cheak(x, tabu_list, tabu_size) == false) {
128
- if (Is_cover(a, matrix, r, ram1, ram2) == true) {
157
+ if (Is_cover(a, matrix, r, r1, r2) == true) {
129
- cout << "取り出した行:" << am << ",頂点数:" << r.size() << ":" << "true" << endl;
158
+ cout << "取り出した行:" << x << ",頂点数:" << r1 << ":" << "true" << endl;
130
- ram1--;
159
+ r1--;
160
+ }
161
+ else if (Is_cover(a, matrix, r, r1, r2) == false) {
162
+ cout << "取り出した行:" << x << ",頂点数:" << r1 << ":" << "false" << endl;
163
+ r.push_back(x);
164
+ tabu_add(x, tabu_list, tabu_size, tabu_last);
165
+ }
131
166
  }
132
- else if (Is_cover(a, matrix, r, ram1, ram2) == false) {
167
+ else {
133
- cout << "取り出した行:" << am << ",頂点数:" << r.size() << ":" << "false" << endl;
134
- ram2.push_back(am);
168
+ r.push_back(x);
135
169
  }
136
170
  }
137
171
 
@@ -140,15 +174,20 @@
140
174
  const int n = 10; //頂点数
141
175
  double r = 0.5; //辺数の比率
142
176
  const int e = ((n * (n - 1) / 2) * r); //辺数
143
- int ram1; // 取り出す行の数
177
+ int ram1; // 取り出す行の数
178
+ vector <int> tem; // 取り出した行の配列
144
179
  vector <int> ram2(n,0); // 取り出される行
145
180
  for (int i = 0; i < n; i++) {
146
181
  ram2[i] = i;
147
182
  }
183
+
148
- int search = 10; // 探索回数
184
+ int search = 100; // 探索回数
185
+ int tabu_size = 10; // タブーサイズ
186
+ vector <int> tabu(tabu_size, -1); // タブーリスト
187
+ int tabu_last = 0; // 今現在のタブーリストの位置
188
+
149
189
  con_matrix M(n, e);
150
190
  vector<int> matrix(e, 0); // 組合す行
151
- vector <int> tem;
152
191
  M.set_random(1);
153
192
  cout << "頂点数 = " << n << endl;
154
193
  cout << "グラフの辺数 = " << e << endl;
@@ -157,32 +196,34 @@
157
196
 
158
197
  for (int i = 0; i < 10; i++) {
159
198
  ram1 = rand() % n + 1;
160
- tem.reserve(ram1);
161
- Is_cover(M, matrix, tem, ram1, ram2);
199
+ Is_cover(M, matrix,tem, ram1, ram2);
162
- if (Is_cover(M, matrix, tem, ram1, ram2) == true) {
200
+ if (Is_cover(M, matrix,tem, ram1, ram2) == true) {
201
+ for (int i = 0; i < ram1; i++) {
202
+ tem.push_back(ram2[i]);
203
+ }
163
204
  cout << "初期解:" << ram1 << endl;
164
205
  cout << endl;
165
206
  break;
166
207
  }
167
- else tem.clear();
168
208
  }
209
+
169
210
  for (int s = 0; s < search; s++) {
170
211
  Cover_search(M, matrix, tem, ram1, ram2);
212
+ // Tabu_Cover_search(M, matrix, tem, ram1, ram2, tabu, tabu_size, tabu_last);
171
213
  }
172
214
  return 0;
173
215
  }
174
216
 
217
+
175
218
  ```
176
219
 
177
- ### エラー内容と試したこと
220
+ ### 試したこと
178
- ram2から取り出した行(要素)を入れる配列temを追加し、出力しようと思ったです、97行目の int am = r[gm];でエラーが起きます。どのように改善すれば良いか分からない状態です。
221
+ 以下内容115行目のint x = tem[gm];にて出ます。頂点数を10にしてみたり、100にしてみたりすると最後ま探索し実行できるのですが、頂点数を50とかにすると以下の出力をしてエラーがます。
179
222
  ```
180
- 頂点数 = 10
223
+ 頂点数 = 50
181
- グラフの辺数 = 22
224
+ グラフの辺数 = 612
182
225
 
183
- 初期解:9
184
226
  ```
185
- ![イメージ説明](73ee4f31c01cc58d27e4c715031bf89a.png)
186
227
 
187
228
 
188
229
  ### 補足情報(FW/ツールのバージョンなど)

7

プログラムの訂正をしました

2021/11/24 08:17

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -84,7 +84,7 @@
84
84
  }
85
85
  }
86
86
 
87
- void Coalescence (vector<int>& ev, int r1, vector<int>& r2) // 取り出した複数の行を一つの行になるよう組合す
87
+ void Coalescence(vector<int>& ev, vector<int>& r, int r1, vector<int>& r2) // 取り出した複数の行を一つの行になるよう組合す
88
88
  {
89
89
  int Vertex = get_vertex_num();
90
90
  int Edge = get_edge_num();
@@ -94,9 +94,9 @@
94
94
  ev[iE] = 0;
95
95
  }
96
96
  for (int iV = 0; iV < r1; iV++) {
97
- int e = r2[iV];
97
+ r.push_back(r2[iV]);
98
98
  for (int iE = 0; iE < Edge; iE++) {
99
- if (ev[iE] == 0 && matrix[e][iE] == 1) {
99
+ if (ev[iE] == 0 && matrix[r2[iV]][iE] == 1) {
100
100
  ev[iE] = 1;
101
101
  }
102
102
  }
@@ -105,12 +105,11 @@
105
105
  };
106
106
 
107
107
  // 頂点集合を取り出し、被覆かどうかをチェックする
108
- bool Is_cover(con_matrix a, vector<int> matrix, int r1, vector<int>& r2) {
108
+ int Is_cover(con_matrix a, vector<int> matrix, vector<int> r, int r1, vector<int> r2) {
109
109
  int iV = a.get_vertex_num(); // 頂点数
110
110
  int iE = a.get_edge_num(); // 辺数
111
111
  int num = 0;
112
- a.Coalescence(matrix,r1,r2);
112
+ a.Coalescence(matrix,r,r1,r2);
113
- sort(r2.begin(), r2.end());
114
113
  for (int i = 0; i < iE; i++) {
115
114
  num += matrix[i];
116
115
  }
@@ -120,35 +119,36 @@
120
119
  else return false;
121
120
  }
122
121
 
123
- void Cover_search(con_matrix a, vector<int>& matrix, int& ram1, vector<int>& ram2)
122
+ void Cover_search(con_matrix a, vector<int>& matrix, vector<int>& r, int ram1, vector<int>& ram2)
124
123
  {
125
124
  int gm = rand() % (ram1-1);
126
- int am = ram2[gm];
125
+ int am = r[gm];
126
+ sort(r.begin(), r.end());
127
- ram2.erase(ram2.begin() + gm);
127
+ r.erase(r.begin() + gm);
128
- if (Is_cover(a, matrix, ram1, ram2) == 1) {
128
+ if (Is_cover(a, matrix, r, ram1, ram2) == true) {
129
- cout << "true" << endl;
129
+ cout << "取り出した行:" << am << ",頂点数:" << r.size() << ":" << "true" << endl;
130
130
  ram1--;
131
131
  }
132
- else if (Is_cover(a, matrix, ram1, ram2) == 0) {
132
+ else if (Is_cover(a, matrix, r, ram1, ram2) == false) {
133
- cout << "false" << endl;
133
+ cout << "取り出した行:" << am << ",頂点数:" << r.size() << ":" << "false" << endl;
134
134
  ram2.push_back(am);
135
135
  }
136
136
  }
137
137
 
138
138
  int main(void)
139
139
  {
140
- const int n = 100; //頂点数
140
+ const int n = 10; //頂点数
141
141
  double r = 0.5; //辺数の比率
142
142
  const int e = ((n * (n - 1) / 2) * r); //辺数
143
- int ram1 = 0; // 取り出す行の数
143
+ int ram1; // 取り出す行の数
144
- vector <int> ram2(n,0);
144
+ vector <int> ram2(n,0); // 取り出される行
145
145
  for (int i = 0; i < n; i++) {
146
146
  ram2[i] = i;
147
147
  }
148
148
  int search = 10; // 探索回数
149
149
  con_matrix M(n, e);
150
150
  vector<int> matrix(e, 0); // 組合す行
151
-
151
+ vector <int> tem;
152
152
  M.set_random(1);
153
153
  cout << "頂点数 = " << n << endl;
154
154
  cout << "グラフの辺数 = " << e << endl;
@@ -157,38 +157,30 @@
157
157
 
158
158
  for (int i = 0; i < 10; i++) {
159
159
  ram1 = rand() % n + 1;
160
+ tem.reserve(ram1);
160
- Is_cover(M, matrix, ram1, ram2);
161
+ Is_cover(M, matrix, tem, ram1, ram2);
161
- if (Is_cover(M, matrix, ram1, ram2) == true) {
162
+ if (Is_cover(M, matrix, tem, ram1, ram2) == true) {
162
163
  cout << "初期解:" << ram1 << endl;
163
164
  cout << endl;
164
165
  break;
165
166
  }
167
+ else tem.clear();
166
168
  }
167
169
  for (int s = 0; s < search; s++) {
168
- cout << ram2.size() << ":";
169
- Cover_search(M, matrix, ram1, ram2);
170
+ Cover_search(M, matrix, tem, ram1, ram2);
170
- /*
171
- for (int j = 0; j < ram1; j++) {
172
- cout << ram2[j] << ",";
173
- }
174
- */
175
- cout << endl;
176
171
  }
177
172
  return 0;
178
173
  }
179
174
 
180
-
181
175
  ```
182
176
 
183
177
  ### エラー内容と試したこと
184
- 頂点数10や20に探索回数を10回に変更てみるエラーなく実行できたのですが、頂点数を100にすると以下の実途中でdebug assertion failedとって状態です。
178
+ ram2から取り出した行(要素)入れる配列temを追加し、出力よう思ったのですが、97目の int am = r[gm];でエラーが起きます。どのように改善すれば良いか分からない状態です。
185
179
  ```
186
- 頂点数 = 100
180
+ 頂点数 = 10
187
- グラフの辺数 = 2475
181
+ グラフの辺数 = 22
188
182
 
189
- 初期解:100
183
+ 初期解:9
190
-
191
- 100:
192
184
  ```
193
185
  ![イメージ説明](73ee4f31c01cc58d27e4c715031bf89a.png)
194
186
 

6

プログラムとエラーの訂正をしました。

2021/11/23 17:43

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -105,7 +105,7 @@
105
105
  };
106
106
 
107
107
  // 頂点集合を取り出し、被覆かどうかをチェックする
108
- int Is_cover(con_matrix a, vector<int> matrix, int r1, vector<int>& r2) {
108
+ bool Is_cover(con_matrix a, vector<int> matrix, int r1, vector<int>& r2) {
109
109
  int iV = a.get_vertex_num(); // 頂点数
110
110
  int iE = a.get_edge_num(); // 辺数
111
111
  int num = 0;
@@ -122,29 +122,22 @@
122
122
 
123
123
  void Cover_search(con_matrix a, vector<int>& matrix, int& ram1, vector<int>& ram2)
124
124
  {
125
- int r = ram1 - 1;
126
125
  int gm = rand() % (ram1-1);
127
126
  int am = ram2[gm];
128
127
  ram2.erase(ram2.begin() + gm);
129
- ram1--;
130
- /*
131
- if (Is_cover(a, matrix, ram1, ram2) == true) {
128
+ if (Is_cover(a, matrix, ram1, ram2) == 1) {
132
- for (int j = 0; j < ram1; j++) {
133
- cout << ram2[j] << ",";
134
- }
135
129
  cout << "true" << endl;
136
130
  ram1--;
137
131
  }
138
- else if (Is_cover(a, matrix, ram1, ram2) == false) {
132
+ else if (Is_cover(a, matrix, ram1, ram2) == 0) {
139
133
  cout << "false" << endl;
140
134
  ram2.push_back(am);
141
135
  }
142
- */
143
136
  }
144
137
 
145
138
  int main(void)
146
139
  {
147
- const int n = 10; //頂点数
140
+ const int n = 100; //頂点数
148
141
  double r = 0.5; //辺数の比率
149
142
  const int e = ((n * (n - 1) / 2) * r); //辺数
150
143
  int ram1 = 0; // 取り出す行の数
@@ -152,7 +145,7 @@
152
145
  for (int i = 0; i < n; i++) {
153
146
  ram2[i] = i;
154
147
  }
155
- int search = 5; // 探索回数
148
+ int search = 10; // 探索回数
156
149
  con_matrix M(n, e);
157
150
  vector<int> matrix(e, 0); // 組合す行
158
151
 
@@ -167,18 +160,18 @@
167
160
  Is_cover(M, matrix, ram1, ram2);
168
161
  if (Is_cover(M, matrix, ram1, ram2) == true) {
169
162
  cout << "初期解:" << ram1 << endl;
170
- for (int j = 0; j < ram1; j++) {
171
- cout << ram2[j] << ",";
172
- }
173
163
  cout << endl;
174
164
  break;
175
165
  }
176
166
  }
177
- for (int s = 0; s < 5; s++) {
167
+ for (int s = 0; s < search; s++) {
168
+ cout << ram2.size() << ":";
178
169
  Cover_search(M, matrix, ram1, ram2);
170
+ /*
179
171
  for (int j = 0; j < ram1; j++) {
180
172
  cout << ram2[j] << ",";
181
173
  }
174
+ */
182
175
  cout << endl;
183
176
  }
184
177
  return 0;
@@ -188,14 +181,14 @@
188
181
  ```
189
182
 
190
183
  ### エラー内容と試したこと
191
- どの部分でエラーとなっているのか調べるために、プログラムの部分部分して実行してているのですが、以下の実行途中でdebug assertion failedとなっている状態です。
184
+ 頂点数10や20して探索回数10回に変更してみるとエラーなく実行できたのですが、頂点数を100にすると以下の実行途中でdebug assertion failedとなっている状態です。
192
- またmain文内のCover_search()を配列の要素を減らすのみにすると問題なく実行はできています。
193
185
  ```
194
- 頂点数 = 7
186
+ 頂点数 = 100
195
- グラフの辺数 = 10
187
+ グラフの辺数 = 2475
196
188
 
197
- 初期解:7
189
+ 初期解:100
190
+
198
- 0,1,2,3,4,5,6,
191
+ 100:
199
192
  ```
200
193
  ![イメージ説明](73ee4f31c01cc58d27e4c715031bf89a.png)
201
194
 

5

プログラムを訂正しました。

2021/11/22 08:09

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -88,6 +88,7 @@
88
88
  {
89
89
  int Vertex = get_vertex_num();
90
90
  int Edge = get_edge_num();
91
+ random_shuffle(r2.begin(), r2.end());
91
92
  // 行を初期化
92
93
  for (int iE = 0; iE < Edge; iE++) {
93
94
  ev[iE] = 0;
@@ -104,11 +105,12 @@
104
105
  };
105
106
 
106
107
  // 頂点集合を取り出し、被覆かどうかをチェックする
107
- int Is_cover(con_matrix a, vector<int>& matrix, int ram1, vector<int>& ram2) {
108
+ int Is_cover(con_matrix a, vector<int> matrix, int r1, vector<int>& r2) {
108
109
  int iV = a.get_vertex_num(); // 頂点数
109
110
  int iE = a.get_edge_num(); // 辺数
110
111
  int num = 0;
111
- a.Coalescence(matrix,ram1,ram2);
112
+ a.Coalescence(matrix,r1,r2);
113
+ sort(r2.begin(), r2.end());
112
114
  for (int i = 0; i < iE; i++) {
113
115
  num += matrix[i];
114
116
  }
@@ -118,58 +120,67 @@
118
120
  else return false;
119
121
  }
120
122
 
121
- void Cover_search(con_matrix a, vector<int> matrix, int ram1, vector<int> ram2)
123
+ void Cover_search(con_matrix a, vector<int>& matrix, int& ram1, vector<int>& ram2)
122
124
  {
123
- vector<int> x(ram2);
124
- for (int i = 0; i < 10; i++) {
125
+ int r = ram1 - 1;
125
- int gm = rand() % ram1 + 1;
126
+ int gm = rand() % (ram1-1);
126
- int am = ram2[gm];
127
+ int am = ram2[gm];
127
- ram2.erase(ram2.begin() + gm);
128
+ ram2.erase(ram2.begin() + gm);
129
+ ram1--;
130
+ /*
131
+ if (Is_cover(a, matrix, ram1, ram2) == true) {
128
132
  for (int j = 0; j < ram1; j++) {
129
133
  cout << ram2[j] << ",";
130
134
  }
131
- cout << endl;
132
- if (Is_cover(a, matrix, ram1, ram2) == true) {
133
- cout << "true" << endl;
135
+ cout << "true" << endl;
134
- ram1--;
136
+ ram1--;
135
- }
136
- else if (Is_cover(a, matrix, ram1, ram2) == false) {
137
- std::cout << "false" << endl;
138
- ram2.push_back(am);
139
- }
140
137
  }
138
+ else if (Is_cover(a, matrix, ram1, ram2) == false) {
139
+ cout << "false" << endl;
140
+ ram2.push_back(am);
141
+ }
142
+ */
141
143
  }
142
144
 
143
145
  int main(void)
144
146
  {
145
- const int n = 7; //頂点数
147
+ const int n = 10; //頂点数
146
148
  double r = 0.5; //辺数の比率
147
149
  const int e = ((n * (n - 1) / 2) * r); //辺数
148
- int ram1 = rand() % n + 1; // 取り出す行の数
150
+ int ram1 = 0; // 取り出す行の数
149
151
  vector <int> ram2(n,0);
150
152
  for (int i = 0; i < n; i++) {
151
153
  ram2[i] = i;
152
154
  }
153
- int search = 10; // 探索回数
155
+ int search = 5; // 探索回数
154
156
  con_matrix M(n, e);
155
157
  vector<int> matrix(e, 0); // 組合す行
156
158
 
157
159
  M.set_random(1);
158
- random_shuffle(ram2.begin(), ram2.end());
159
- cout << endl;
160
160
  cout << "頂点数 = " << n << endl;
161
161
  cout << "グラフの辺数 = " << e << endl;
162
162
  //M.disp_connection(); // 接続行列表示
163
163
  cout << endl;
164
164
 
165
- for (int i = 0; i < n; i++) {
165
+ for (int i = 0; i < 10; i++) {
166
+ ram1 = rand() % n + 1;
166
167
  Is_cover(M, matrix, ram1, ram2);
167
168
  if (Is_cover(M, matrix, ram1, ram2) == true) {
168
169
  cout << "初期解:" << ram1 << endl;
170
+ for (int j = 0; j < ram1; j++) {
171
+ cout << ram2[j] << ",";
172
+ }
173
+ cout << endl;
169
174
  break;
170
175
  }
171
176
  }
177
+ for (int s = 0; s < 5; s++) {
172
- Cover_search(M, matrix, ram1, ram2);
178
+ Cover_search(M, matrix, ram1, ram2);
179
+ for (int j = 0; j < ram1; j++) {
180
+ cout << ram2[j] << ",";
181
+ }
182
+ cout << endl;
183
+ }
173
184
  return 0;
174
185
  }
175
186
 
@@ -178,7 +189,7 @@
178
189
 
179
190
  ### エラー内容と試したこと
180
191
  どの部分でエラーとなっているのかを調べるために、プログラムの部分部分を消して実行してみているのですが、以下の実行途中でdebug assertion failedとなっている状態です。
181
- またmain文内のCover_search()をすと問題なく実行はできています。
192
+ またmain文内のCover_search()を配列の要素を減らのみにすると問題なく実行はできています。
182
193
  ```
183
194
  頂点数 = 7
184
195
  グラフの辺数 = 10

4

debug assertion failedの内容を足しました

2021/11/22 07:26

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,8 @@
1
1
  ### 前提・実現したいこと
2
-
2
+ 入力中の内容をテンプレートとして保存
3
+ プレビュー
4
+ 閉じる
5
+ 他のユーザ
3
6
  生成した接続行列から行をランダムに取り出し、一つの行に組み合わせる。その後組み合わせた行は被覆しているかをチェックし、結果を「ture」「false」で出力する。
4
7
  出力した後、取り出した行を一つずつ減らしていき最小頂点被覆数を求める。
5
8
  ```
@@ -183,6 +186,7 @@
183
186
  初期解:7
184
187
  0,1,2,3,4,5,6,
185
188
  ```
189
+ ![イメージ説明](73ee4f31c01cc58d27e4c715031bf89a.png)
186
190
 
187
191
 
188
192
  ### 補足情報(FW/ツールのバージョンなど)

3

エラー内容の詳細を加えました。

2021/11/22 03:48

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -173,8 +173,18 @@
173
173
 
174
174
  ```
175
175
 
176
- ### 試したこと
176
+ ### エラー内容と試したこと
177
- エラーどの部分でエラーとなっているのかを調べるために、プログラムの部分部分を消して実行してみているのですが、同じ結果となって分からない状態です。
177
+ どの部分でエラーとなっているのかを調べるために、プログラムの部分部分を消して実行してみているのですが、以下の実行途中でdebug assertion failedとなってい状態です。
178
+ またmain文内のCover_search()を消すと問題なく実行はできています。
179
+ ```
180
+ 頂点数 = 7
181
+ グラフの辺数 = 10
182
+
183
+ 初期解:7
184
+ 0,1,2,3,4,5,6,
185
+ ```
186
+
187
+
178
188
  ### 補足情報(FW/ツールのバージョンなど)
179
189
 
180
190
  Visual Studio 2019で入力しています。

2

質問内容、プログラム内容を訂正しました。

2021/11/22 02:33

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- 頂点被覆あるチェックし、結果を出力した
1
+ どこが原因実行できないのわからな
body CHANGED
@@ -1,6 +1,7 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
3
  生成した接続行列から行をランダムに取り出し、一つの行に組み合わせる。その後組み合わせた行は被覆しているかをチェックし、結果を「ture」「false」で出力する。
4
+ 出力した後、取り出した行を一つずつ減らしていき最小頂点被覆数を求める。
4
5
  ```
5
6
  0 0 0 0 0 0 1 1 1 1
6
7
  0 1 1 1 0 0 0 0 0 0
@@ -80,86 +81,100 @@
80
81
  }
81
82
  }
82
83
 
83
- void Coalescence (int* ev, int* r) // 取り出した複数の行を一つの行になるよう組合す
84
+ void Coalescence (vector<int>& ev, int r1, vector<int>& r2) // 取り出した複数の行を一つの行になるよう組合す
84
85
  {
86
+ int Vertex = get_vertex_num();
85
87
  int Edge = get_edge_num();
86
- int Vertex = get_vertex_num();
88
+ // 行を初期化
87
- for (int i = 0; i < Vertex; i++) {
89
+ for (int iE = 0; iE < Edge; iE++) {
90
+ ev[iE] = 0;
91
+ }
92
+ for (int iV = 0; iV < r1; iV++) {
88
- int e = r[i];
93
+ int e = r2[iV];
89
- for (int v = 0; v < Edge; v++) {
94
+ for (int iE = 0; iE < Edge; iE++) {
90
- if (ev[v] == 0 && matrix[v][e] == 1) {
95
+ if (ev[iE] == 0 && matrix[e][iE] == 1) {
91
- ev[v] = 1;
96
+ ev[iE] = 1;
92
97
  }
93
98
  }
94
99
  }
95
100
  }
96
101
  };
97
102
 
98
- void random_shuffle(int* ary, int size)
99
- {
100
- for (int i = 0; i < size; i++)
101
- {
102
- int j = rand() % size;
103
- int t = ary[i];
104
- ary[i] = ary[j];
105
- ary[j] = t;
106
- }
107
- }
108
-
109
103
  // 頂点集合を取り出し、被覆かどうかをチェックする
110
- void Is_cover(con_matrix a,int* matrix) {
104
+ int Is_cover(con_matrix a, vector<int>& matrix, int ram1, vector<int>& ram2) {
111
- int e = a.get_vertex_num(); // 頂点数
105
+ int iV = a.get_vertex_num(); // 頂点数
112
- int n = a.get_edge_num(); // 辺数
106
+ int iE = a.get_edge_num(); // 辺数
113
-
114
- int ram1 = rand() % e + 1; // 取り出す行の数
115
- cout << "頂点数:" << ram1 << endl;
116
- int* ram2 = new int[n];
117
107
  int num = 0;
108
+ a.Coalescence(matrix,ram1,ram2);
118
- for (int i = 0; i < n; i++) {
109
+ for (int i = 0; i < iE; i++) {
110
+ num += matrix[i];
111
+ }
112
+ if (num == iE) {
119
- ram2[i] = i;
113
+ return true;
120
114
  }
121
- random_shuffle(ram2,e);
115
+ else return false;
116
+ }
122
117
 
118
+ void Cover_search(con_matrix a, vector<int> matrix, int ram1, vector<int> ram2)
119
+ {
123
- a.Coalescence(matrix,ram2);
120
+ vector<int> x(ram2);
121
+ for (int i = 0; i < 10; i++) {
122
+ int gm = rand() % ram1 + 1;
123
+ int am = ram2[gm];
124
+ ram2.erase(ram2.begin() + gm);
124
- for (int i = 0; i < ram1; i++) {
125
+ for (int j = 0; j < ram1; j++) {
125
- num += matrix[i];
126
+ cout << ram2[j] << ",";
126
127
  }
127
- if (num < n) {
128
+ cout << endl;
129
+ if (Is_cover(a, matrix, ram1, ram2) == true) {
128
- cout << "false" << endl;
130
+ cout << "true" << endl;
131
+ ram1--;
132
+ }
133
+ else if (Is_cover(a, matrix, ram1, ram2) == false) {
134
+ std::cout << "false" << endl;
135
+ ram2.push_back(am);
136
+ }
129
137
  }
130
- else { cout << "true" << endl; }
131
138
  }
132
139
 
133
140
  int main(void)
134
141
  {
135
- const int n = 5; //頂点数
142
+ const int n = 7; //頂点数
136
143
  double r = 0.5; //辺数の比率
137
144
  const int e = ((n * (n - 1) / 2) * r); //辺数
145
+ int ram1 = rand() % n + 1; // 取り出す行の数
138
- con_matrix M(n, e);
146
+ vector <int> ram2(n,0);
139
- int* matrix = new int [n];
140
147
  for (int i = 0; i < n; i++) {
141
- matrix[i] = 0;
148
+ ram2[i] = i;
142
149
  }
150
+ int search = 10; // 探索回数
151
+ con_matrix M(n, e);
152
+ vector<int> matrix(e, 0); // 組合す行
143
153
 
144
154
  M.set_random(1);
155
+ random_shuffle(ram2.begin(), ram2.end());
145
156
  cout << endl;
146
157
  cout << "頂点数 = " << n << endl;
147
158
  cout << "グラフの辺数 = " << e << endl;
148
- M.disp_connection();
159
+ //M.disp_connection(); // 接続行列表示
149
160
  cout << endl;
161
+
150
- for (int i = 0; i < 10; i++) {
162
+ for (int i = 0; i < n; i++) {
151
- Is_cover(M, matrix);
163
+ Is_cover(M, matrix, ram1, ram2);
164
+ if (Is_cover(M, matrix, ram1, ram2) == true) {
165
+ cout << "初期解:" << ram1 << endl;
152
- i++;
166
+ break;
167
+ }
153
168
  }
169
+ Cover_search(M, matrix, ram1, ram2);
154
170
  return 0;
155
171
  }
156
172
 
173
+
157
174
  ```
158
175
 
159
176
  ### 試したこと
160
-
161
- 頂点数5個にしてみると最後まで出力されたのですが、頂点数を10個や7個にする最後まで出力されず、謎のエラーで止まってします。
177
+ エラーどの部分でエラーとなっているのか調べるため、プログラムの部分部分を消して実行してているのですが、同じ結果って分からな状態です。
162
-
163
178
  ### 補足情報(FW/ツールのバージョンなど)
164
179
 
165
180
  Visual Studio 2019で入力しています。

1

エラー内容を訂正しました。

2021/11/21 03:18

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  ```
18
18
  エラー内容が表示されないため、何が原因でエラーとなっているのかわからない状態です。
19
- 警告文とし
19
+ 警告文も特に何も出いない状態です。
20
20
  ```
21
21
 
22
22
  ### 該当のソースコード