質問編集履歴
9
プログラムの訂正、エラー内容を訂正しました。
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
プログラムとエラー、質問内容の訂正しました。
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
|
+

|
23
|
-
警告文も特に何も出ていない状態です。
|
24
|
-
```
|
25
19
|
|
26
20
|
### 該当のソースコード
|
27
21
|
|
@@ -84,7 +78,7 @@
|
|
84
78
|
}
|
85
79
|
}
|
86
80
|
|
87
|
-
void Coalescence(vector<int>& ev,
|
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,
|
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
|
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
|
-
|
136
|
+
sort(tem.begin(), tem.end());
|
125
|
-
int
|
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
|
-
|
157
|
+
if (Is_cover(a, matrix, r, r1, r2) == true) {
|
129
|
-
|
158
|
+
cout << "取り出した行:" << x << ",頂点数:" << r1 << ":" << "true" << endl;
|
130
|
-
|
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
|
167
|
+
else {
|
133
|
-
cout << "取り出した行:" << am << ",頂点数:" << r.size() << ":" << "false" << endl;
|
134
|
-
|
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 =
|
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,
|
199
|
+
Is_cover(M, matrix,tem, ram1, ram2);
|
162
|
-
if (Is_cover(M, matrix,
|
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
|
-
|
221
|
+
以下の内容が115行目のint x = tem[gm];にて出ます。頂点数を10にしてみたり、100にしてみたりすると最後まで探索し実行できるのですが、頂点数を50とかにすると以下の出力をしてエラーが出ます。
|
179
222
|
```
|
180
|
-
頂点数 =
|
223
|
+
頂点数 = 50
|
181
|
-
グラフの辺数 =
|
224
|
+
グラフの辺数 = 612
|
182
225
|
|
183
|
-
初期解:9
|
184
226
|
```
|
185
|
-

|
186
227
|
|
187
228
|
|
188
229
|
### 補足情報(FW/ツールのバージョンなど)
|
7
プログラムの訂正をしました
title
CHANGED
File without changes
|
body
CHANGED
@@ -84,7 +84,7 @@
|
|
84
84
|
}
|
85
85
|
}
|
86
86
|
|
87
|
-
void Coalescence
|
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
|
-
|
97
|
+
r.push_back(r2[iV]);
|
98
98
|
for (int iE = 0; iE < Edge; iE++) {
|
99
|
-
if (ev[iE] == 0 && matrix[
|
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
|
-
|
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 =
|
125
|
+
int am = r[gm];
|
126
|
+
sort(r.begin(), r.end());
|
127
|
-
|
127
|
+
r.erase(r.begin() + gm);
|
128
|
-
if (Is_cover(a, matrix, ram1, ram2) ==
|
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) ==
|
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 =
|
140
|
+
const int n = 10; //頂点数
|
141
141
|
double r = 0.5; //辺数の比率
|
142
142
|
const int e = ((n * (n - 1) / 2) * r); //辺数
|
143
|
-
int ram1
|
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
|
-
|
178
|
+
ram2から取り出した行(要素)を入れる配列temを追加し、出力しようと思ったのですが、97行目の int am = r[gm];でエラーが起きます。どのように改善すれば良いか分からない状態です。
|
185
179
|
```
|
186
|
-
頂点数 =
|
180
|
+
頂点数 = 10
|
187
|
-
グラフの辺数 =
|
181
|
+
グラフの辺数 = 22
|
188
182
|
|
189
|
-
初期解:
|
183
|
+
初期解:9
|
190
|
-
|
191
|
-
100:
|
192
184
|
```
|
193
185
|

|
194
186
|
|
6
プログラムとエラーの訂正をしました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -105,7 +105,7 @@
|
|
105
105
|
};
|
106
106
|
|
107
107
|
// 頂点集合を取り出し、被覆かどうかをチェックする
|
108
|
-
|
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) ==
|
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) ==
|
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 =
|
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 =
|
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 <
|
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
|
-
|
184
|
+
頂点数を10や20にして、探索回数を10回に変更してみるとエラーなく実行できたのですが、頂点数を100にすると以下の実行途中でdebug assertion failedとなっている状態です。
|
192
|
-
またmain文内のCover_search()を配列の要素を減らすのみにすると問題なく実行はできています。
|
193
185
|
```
|
194
|
-
頂点数 =
|
186
|
+
頂点数 = 100
|
195
|
-
グラフの辺数 =
|
187
|
+
グラフの辺数 = 2475
|
196
188
|
|
197
|
-
初期解:
|
189
|
+
初期解:100
|
190
|
+
|
198
|
-
|
191
|
+
100:
|
199
192
|
```
|
200
193
|

|
201
194
|
|
5
プログラムを訂正しました。
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>
|
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,
|
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
|
-
|
125
|
+
int r = ram1 - 1;
|
125
|
-
|
126
|
+
int gm = rand() % (ram1-1);
|
126
|
-
|
127
|
+
int am = ram2[gm];
|
127
|
-
|
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
|
-
|
135
|
+
cout << "true" << endl;
|
134
|
-
|
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 =
|
147
|
+
const int n = 10; //頂点数
|
146
148
|
double r = 0.5; //辺数の比率
|
147
149
|
const int e = ((n * (n - 1) / 2) * r); //辺数
|
148
|
-
int ram1 =
|
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 =
|
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 <
|
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
|
-
|
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の内容を足しました
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
|
+

|
186
190
|
|
187
191
|
|
188
192
|
### 補足情報(FW/ツールのバージョンなど)
|
3
エラー内容の詳細を加えました。
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
質問内容、プログラム内容を訂正しました。
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
|
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
|
-
|
88
|
+
// 行を初期化
|
87
|
-
for (int
|
89
|
+
for (int iE = 0; iE < Edge; iE++) {
|
90
|
+
ev[iE] = 0;
|
91
|
+
}
|
92
|
+
for (int iV = 0; iV < r1; iV++) {
|
88
|
-
int e =
|
93
|
+
int e = r2[iV];
|
89
|
-
for (int
|
94
|
+
for (int iE = 0; iE < Edge; iE++) {
|
90
|
-
if (ev[
|
95
|
+
if (ev[iE] == 0 && matrix[e][iE] == 1) {
|
91
|
-
ev[
|
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
|
-
|
104
|
+
int Is_cover(con_matrix a, vector<int>& matrix, int ram1, vector<int>& ram2) {
|
111
|
-
int
|
105
|
+
int iV = a.get_vertex_num(); // 頂点数
|
112
|
-
int
|
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 <
|
109
|
+
for (int i = 0; i < iE; i++) {
|
110
|
+
num += matrix[i];
|
111
|
+
}
|
112
|
+
if (num == iE) {
|
119
|
-
|
113
|
+
return true;
|
120
114
|
}
|
121
|
-
|
115
|
+
else return false;
|
116
|
+
}
|
122
117
|
|
118
|
+
void Cover_search(con_matrix a, vector<int> matrix, int ram1, vector<int> ram2)
|
119
|
+
{
|
123
|
-
|
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
|
-
|
125
|
+
for (int j = 0; j < ram1; j++) {
|
125
|
-
|
126
|
+
cout << ram2[j] << ",";
|
126
127
|
}
|
127
|
-
|
128
|
+
cout << endl;
|
129
|
+
if (Is_cover(a, matrix, ram1, ram2) == true) {
|
128
|
-
|
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 =
|
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
|
-
|
146
|
+
vector <int> ram2(n,0);
|
139
|
-
int* matrix = new int [n];
|
140
147
|
for (int i = 0; i < n; i++) {
|
141
|
-
|
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 <
|
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
|
-
|
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
|
-
|
177
|
+
エラーどの部分でエラーとなっているのかを調べるために、プログラムの部分部分を消して実行してみているのですが、同じ結果となって分からない状態です。
|
162
|
-
|
163
178
|
### 補足情報(FW/ツールのバージョンなど)
|
164
179
|
|
165
180
|
Visual Studio 2019で入力しています。
|
1
エラー内容を訂正しました。
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
|
### 該当のソースコード
|