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

回答編集履歴

4

修正

2021/01/17 12:04

投稿

退会済みユーザー
answer CHANGED
@@ -11,13 +11,14 @@
11
11
 
12
12
  ~~このため、ルートを短縮化しにくい構造になっているものと思われます。~~
13
13
 
14
- 勘違いしておりました(コメントで交雑ゼロは意図的だということなので)
14
+ 勘違いしておりました(コメントで交雑ゼロは意図的だということなので)
15
- loop の最後で all_route =next_popとしていますが、
16
15
 
16
+ loop の最後で all_route = next_popとしていますが、
17
17
  selection()で、トーナメント選択のときにall_routeの要素が使われており
18
- その後のエリート選択で、祖rをそのまま使っているのが原因ではないかと。
18
+ その後のエリート選択で、それをそのまま使っているのが原因ではないかと。
19
19
 
20
- 以下のように、トーナメント選択の時にいったんall_routeを別のリストにコピーして、トーナメント選出はそのコピーしたリストを利用した場合、最短ルートは更新されていきます。
20
+ 以下のように、トーナメント選択の時にいったんall_routeを別のリストにコピーして、トーナメント選出はそのコピーしたリストを利用した場合、
21
+ エリートは保存されたままとなり、最短ルートは順当に更新されていきます。
21
22
 
22
23
  ```diff
23
24
  def selection(all_route, evaluate_value, tournament_select_num, tournament_size, elite_select_num, ascending=False):

3

修正

2021/01/17 12:04

投稿

退会済みユーザー
answer CHANGED
@@ -1,12 +1,52 @@
1
- 交雑率(crossover_prob)がゼロとなっているのが問題なのではないでしょうか。
1
+ ~~交雑率(crossover_prob)がゼロとなっているのが問題なのではないでしょうか。~~
2
2
 
3
- かつ、crossover()内で
3
+ ~~かつ、crossover()内で~~
4
- ```
4
+ ~~```~~
5
- check_prob = rnd.randint(1, 100)
5
+ ~~check_prob = rnd.randint(1, 100)~~~~
6
- ```
6
+ ~~```~~
7
- となっているのでcrossover関数内では順序交叉が実行されません。
7
+ となっているのでcrossover関数内では順序交叉が実行されません。~~
8
8
 
9
- 結果、短いルートを通っている個体どうしを交叉し(=ルートを組み替えて)別のルートを生成する、ということができず、
9
+ ~~結果、短いルートを通っている個体どうしを交叉し(=ルートを組み替えて)別のルートを生成する、ということができず、~~
10
- ルートの短縮化を、個体の突然変異(コードでは3%)にのみ頼ることになっていることになります。
10
+ ~~ルートの短縮化を、個体の突然変異(コードでは3%)にのみ頼ることになっていることになります。~~
11
11
 
12
- このため、ルートを短縮化しにくい構造になっているものと思われます。
12
+ ~~このため、ルートを短縮化しにくい構造になっているものと思われます。~~
13
+
14
+ 勘違いしておりました(コメントで交雑ゼロは意図的だということなので)
15
+ loop の最後で all_route =next_popとしていますが、
16
+
17
+ selection()で、トーナメント選択のときにall_routeの要素が使われており
18
+ その後のエリート選択で、祖rをそのまま使っているのが原因ではないかと。
19
+
20
+ 以下のように、トーナメント選択の時にいったんall_routeを別のリストにコピーして、トーナメント選出はそのコピーしたリストを利用した場合、最短ルートは更新されていきます。
21
+
22
+ ```diff
23
+ def selection(all_route, evaluate_value, tournament_select_num, tournament_size, elite_select_num, ascending=False):
24
+ """ トーナメント選択とエリート保存を行う"""
25
+
26
+ select_pop = []
27
+ elite_pop = []
28
+ + copied_all_route = copy.deepcopy(all_route)
29
+ # トーナメント選択
30
+ while True:
31
+ select = rnd.sample(evaluate_value, tournament_size)
32
+ select.sort(reverse=ascending)
33
+ for i in range(tournament_select_num):
34
+ value = select[i]
35
+ index = evaluate_value.index(value)
36
+ - select_pop.append(all_route[index])
37
+ + select_pop.append(copied_all_route[index])
38
+
39
+ # 個体数の半数個選択するまで実行
40
+ if len(select_pop) >= len(all_route) / 2:
41
+ break
42
+
43
+ # エリート保存
44
+ sort_evaluate_value = copy.deepcopy(evaluate_value)
45
+ sort_evaluate_value.sort(reverse=ascending)
46
+
47
+ for i in range(elite_select_num):
48
+ value = sort_evaluate_value[i]
49
+ index = evaluate_value.index(value)
50
+ elite_pop.append(all_route[index])
51
+ return select_pop, elite_pop
52
+ ```

2

修正

2021/01/17 12:02

投稿

退会済みユーザー
answer CHANGED
@@ -7,6 +7,6 @@
7
7
  となっているのでcrossover関数内では順序交叉が実行されません。
8
8
 
9
9
  結果、短いルートを通っている個体どうしを交叉し(=ルートを組み替えて)別のルートを生成する、ということができず、
10
- ルートの短縮化を、最初に生成された個体の突然変異(コードでは3%)にのみ頼ることになっていることになります。
10
+ ルートの短縮化を、個体の突然変異(コードでは3%)にのみ頼ることになっていることになります。
11
11
 
12
- このため、短いルートを持つ個体が生まれにくい構造になっているものと思われます。
12
+ このため、ルートを短縮化しにくい構造になっているものと思われます。

1

修正

2021/01/17 11:09

投稿

退会済みユーザー
answer CHANGED
@@ -6,7 +6,7 @@
6
6
  ```
7
7
  となっているのでcrossover関数内では順序交叉が実行されません。
8
8
 
9
- 結果、短いルートを通っている個体どうしを交叉する=ルートを組み替えてさらに短いルートを生成する、ということができず、
9
+ 結果、短いルートを通っている個体どうしを交叉し(=ルートを組み替えて)別のルートを生成する、ということができず、
10
- ルートの短縮化を、突然変異(コードでは3%)にのみ頼ることになっていることになります。
10
+ ルートの短縮化を、最初に生成された個体の突然変異(コードでは3%)にのみ頼ることになっていることになります。
11
11
 
12
12
  このため、短いルートを持つ個体が生まれにくい構造になっているものと思われます。