回答編集履歴

13

 

2022/08/28 13:03

投稿

退会済みユーザー
test CHANGED
@@ -35,7 +35,7 @@
35
35
  + 選出したエリートからランダムに2つ(その2つが同一個体である場合も含む)を選び出して、一様交叉を行う。
36
36
  + 一様交叉を行ってできた2パターンからランダムに1つを選ぶ。
37
37
  + 上記の操作を、「全個体数 - エリート選出数」の回数だけ行う。
38
- + 上記のループを、最上位の個体もしくは最下位の個体の評価値が 10 になるまで行う
38
+ + 上記のループを、generation 回行う。ただし、最上位の個体もしくは最下位の個体の評価値が 10 になった場合はその時点でループ処理を抜ける。
39
39
 
40
40
  ここで、ループ中、上位 {全個体数 × elite_rate} 個以上の個体が**すべて同じ遺伝子パターン**を有している状況になると、両親と同じ遺伝子パターンを有する子しか生み出されなくなり、**その時点の最上位エリートを超える評価値を持つ個体が生まれなくなります** 。
41
41
   

12

 

2022/08/28 12:51

投稿

退会済みユーザー
test CHANGED
@@ -37,7 +37,7 @@
37
37
  + 上記の操作を、「全個体数 - エリート選出数」の回数だけ行う。
38
38
  + 上記のループを、最上位の個体もしくは最下位の個体の評価値が 10 になるまで行う。
39
39
 
40
- ここで、ループ中、上位 {全個体数 × elite_rate} 個以上の個体が**すべて同じ遺伝子パターン**を有している状況になると、両親と同じ遺伝子パターンを有する子しか生み出されなくなり、**その時点の最上位エリートを超える評価値を持つ個体が生まれなくなります** (コンソリーム効果)
40
+ ここで、ループ中、上位 {全個体数 × elite_rate} 個以上の個体が**すべて同じ遺伝子パターン**を有している状況になると、両親と同じ遺伝子パターンを有する子しか生み出されなくなり、**その時点の最上位エリートを超える評価値を持つ個体が生まれなくなります** 。
41
41
   
42
42
  質問記載のコードのパラメータ設定の場合、個体数が10個で elite_rate が 0.2 であり、常に上位2つの個体のみエリートとして選ばれるため、早々にして上位2個の個体が同じ遺伝子パターンになる可能性が高くなります。
43
43
    

11

 

2022/08/28 12:48

投稿

退会済みユーザー
test CHANGED
@@ -18,7 +18,7 @@
18
18
  new_pop には elite が持つリストへの参照を持つ子が追加されてしまうことになります。
19
19
   
20
20
  つまり、elite と elite 以外の個体との間で**同じ遺伝子を共有している状態**になってしまうということです。
21
- この結果、(popの内容を表示したとき)elite 間の遺伝子組み換えの結果が elite 以外の個体にも反映されたように見えてしまいます(コンソリーム効果)
21
+ この結果、(popの内容を表示したとき)elite 間の遺伝子組み換えの結果が elite 以外の個体にも反映されたように見えてしまいます。
22
22
   
23
23
  一様交叉の結果得られる個体は**新しい個体**と考えるならば、cxUniform 関数は、新しいリストを返すようにするべきでしょう。
24
24
  ```python
@@ -37,7 +37,7 @@
37
37
  + 上記の操作を、「全個体数 - エリート選出数」の回数だけ行う。
38
38
  + 上記のループを、最上位の個体もしくは最下位の個体の評価値が 10 になるまで行う。
39
39
 
40
- ここで、ループ中、上位 {全個体数 × elite_rate} 個以上の個体が**すべて同じ遺伝子パターン**を有している状況になると、両親と同じ遺伝子パターンを有する子しか生み出されなくなり、**その時点の最上位エリートを超える評価値を持つ個体が生まれなくなります**。
40
+ ここで、ループ中、上位 {全個体数 × elite_rate} 個以上の個体が**すべて同じ遺伝子パターン**を有している状況になると、両親と同じ遺伝子パターンを有する子しか生み出されなくなり、**その時点の最上位エリートを超える評価値を持つ個体が生まれなくなります** (コンソリーム効果)
41
41
   
42
42
  質問記載のコードのパラメータ設定の場合、個体数が10個で elite_rate が 0.2 であり、常に上位2つの個体のみエリートとして選ばれるため、早々にして上位2個の個体が同じ遺伝子パターンになる可能性が高くなります。
43
43
    

10

 

2022/08/28 12:47

投稿

退会済みユーザー
test CHANGED
@@ -18,7 +18,7 @@
18
18
  new_pop には elite が持つリストへの参照を持つ子が追加されてしまうことになります。
19
19
   
20
20
  つまり、elite と elite 以外の個体との間で**同じ遺伝子を共有している状態**になってしまうということです。
21
- この結果、(popの内容を表示したとき)elite 間の遺伝子組み換えの結果が elite 以外の個体にも反映されたように見えてしまいます。
21
+ この結果、(popの内容を表示したとき)elite 間の遺伝子組み換えの結果が elite 以外の個体にも反映されたように見えてしまいます(コンソリーム効果)
22
22
   
23
23
  一様交叉の結果得られる個体は**新しい個体**と考えるならば、cxUniform 関数は、新しいリストを返すようにするべきでしょう。
24
24
  ```python

9

 

2022/08/28 12:35

投稿

退会済みユーザー
test CHANGED
@@ -62,9 +62,9 @@
62
62
  ```
63
63
 
64
64
  ④ エリート間一様交叉処理のループを抜ける条件が 固定値(10)になっているので、ここは gene_length とした方がより汎用的になると思います。
65
- ```
65
+ ```diff
66
66
  for g in range(generation):
67
- - if gene_length != pop[0][0] and gene_length != pop[-1][0]:
67
+ - if 10 != pop[0][0] and 10 != pop[-1][0]:
68
68
  + if gene_length != pop[0][0] and gene_length != pop[-1][0]:
69
69
  ```
70
70
 

8

 

2022/08/28 12:29

投稿

退会済みユーザー
test CHANGED
@@ -37,7 +37,7 @@
37
37
  + 上記の操作を、「全個体数 - エリート選出数」の回数だけ行う。
38
38
  + 上記のループを、最上位の個体もしくは最下位の個体の評価値が 10 になるまで行う。
39
39
 
40
- ここで、ループ中、上位 {全個体数 × elite_rate} 個以上の個体が**すべて同じ遺伝子パターン**を有している状況になると、両親と同じ遺伝子パターンを有する子しか生み出されなくなり、**その時点の最上位エリート以上の評価値を持つ個体が生まれなくなります**。
40
+ ここで、ループ中、上位 {全個体数 × elite_rate} 個以上の個体が**すべて同じ遺伝子パターン**を有している状況になると、両親と同じ遺伝子パターンを有する子しか生み出されなくなり、**その時点の最上位エリートを超える評価値を持つ個体が生まれなくなります**。
41
41
   
42
42
  質問記載のコードのパラメータ設定の場合、個体数が10個で elite_rate が 0.2 であり、常に上位2つの個体のみエリートとして選ばれるため、早々にして上位2個の個体が同じ遺伝子パターンになる可能性が高くなります。
43
43
    

7

 

2022/08/28 12:28

投稿

退会済みユーザー
test CHANGED
@@ -37,7 +37,7 @@
37
37
  + 上記の操作を、「全個体数 - エリート選出数」の回数だけ行う。
38
38
  + 上記のループを、最上位の個体もしくは最下位の個体の評価値が 10 になるまで行う。
39
39
 
40
- ここで、ループ中、上位 {全個体数 × elite_rate} 個以上の個体がすべて同じ遺伝子パターンを有している状況になると、同じパターンを有する個体間でしか交叉が行われなくなり、結果**上位エリートと同じ遺伝子パターン遺伝子を持った個体がの下位個体を駆逐**ことになってしまいます
40
+ ここで、ループ中、上位 {全個体数 × elite_rate} 個以上の個体が**すべて同じ遺伝子パターン**を有している状況になると、両親と同じ遺伝子パターンを有するしか生み出されなくなり、**その時点の最上位エリート以上評価値を持個体が生まれなくなす**。
41
41
   
42
42
  質問記載のコードのパラメータ設定の場合、個体数が10個で elite_rate が 0.2 であり、常に上位2つの個体のみエリートとして選ばれるため、早々にして上位2個の個体が同じ遺伝子パターンになる可能性が高くなります。
43
43
    

6

 

2022/08/28 12:20

投稿

退会済みユーザー
test CHANGED
@@ -1,4 +1,4 @@
1
- 子の追加処理のバグ
1
+ 一様交叉処理のバグ
2
2
  ```python
3
3
  def main():
4
4
  (略)
@@ -14,8 +14,11 @@
14
14
  return random.choice([parent1,parent2])
15
15
 
16
16
  ```
17
- cxUniform において、 parant 間で一様交叉を行ったあと元の parant の参照を返しているため、
17
+ cxUniform において、 parant 間で一様交叉を行ったあと**元の parant の参照**を返しているため、
18
- new_pop には elite が持つリストへの参照を持つ子が追加されてしまうことになります。(elite と elite以外の個体が遺伝子を共有している状態になる)
18
+ new_pop には elite が持つリストへの参照を持つ子が追加されてしまうことになります。
19
+  
20
+ つまり、elite と elite 以外の個体との間で**同じ遺伝子を共有している状態**になってしまうということです。
21
+ この結果、(popの内容を表示したとき)elite 間の遺伝子組み換えの結果が elite 以外の個体にも反映されたように見えてしまいます。
19
22
   
20
23
  一様交叉の結果得られる個体は**新しい個体**と考えるならば、cxUniform 関数は、新しいリストを返すようにするべきでしょう。
21
24
  ```python

5

 

2022/08/28 12:16

投稿

退会済みユーザー
test CHANGED
@@ -1,4 +1,4 @@
1
-
1
+ 子の追加処理のバグ
2
2
  ```python
3
3
  def main():
4
4
  (略)
@@ -15,7 +15,7 @@
15
15
 
16
16
  ```
17
17
  cxUniform において、 parant 間で一様交叉を行ったあと元の parant の参照を返しているため、
18
- new_pop には elite が持つリストへの参照を持つ子が追加されてしまうことになります。
18
+ new_pop には elite が持つリストへの参照を持つ子が追加されてしまうことになります。(elite と elite以外の個体が遺伝子を共有している状態になる)
19
19
   
20
20
  一様交叉の結果得られる個体は**新しい個体**と考えるならば、cxUniform 関数は、新しいリストを返すようにするべきでしょう。
21
21
  ```python

4

 

2022/08/28 12:12

投稿

退会済みユーザー
test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
  ここで、ループ中、上位 {全個体数 × elite_rate} 個以上の個体がすべて同じ遺伝子パターンを有している状況になると、同じパターンを有する個体間でしか交叉が行われなくなり、結果**上位エリートと同じ遺伝子パターンの遺伝子を持った個体が残りの下位個体を駆逐する**ことになってしまいます。
38
38
   
39
- 質問記載のコードのパラメータ設定の場合、個体数が10個で elite_rate が 0.2 であるため、常に上位2つの個体のみ交叉の親として選ばれる状態ですから、早々にして上位2個の個体が同じ遺伝子パターンになる可能性が高くなります。
39
+ 質問記載のコードのパラメータ設定の場合、個体数が10個で elite_rate が 0.2 であ、常に上位2つの個体のみエリートとして選ばれるため、早々にして上位2個の個体が同じ遺伝子パターンになる可能性が高くなります。
40
40
    
41
41
 
42
42
  いったん上位2個の個体が同じ遺伝子パターンを有してしまうと、どんなに世代数を重ねても、遺伝子パターンは変化しません。

3

  

2022/08/28 12:09

投稿

退会済みユーザー
test CHANGED
@@ -41,13 +41,11 @@
41
41
 
42
42
  いったん上位2個の個体が同じ遺伝子パターンを有してしまうと、どんなに世代数を重ねても、遺伝子パターンは変化しません。
43
43
   
44
- これが、配列変化が起きていいように見える原因です。
44
+ これが評価値が頭打ちになる原因です。
45
+  
46
+ この状況を回避するには、上位エリートの遺伝子パターンを変える状況、たとえば一定確率でエリートに突然変異を起こす等のやり方が考えられます。(もちろん突然変異の設定確率によっては世代数をもっと多くしないと効果は現れません)
47
+  
45
48
    
46
- これを回避するには、上位エリートの遺伝子パターンを変える状況、たとえば一定確率でエリートに突然変異を起こす等のやり方が考えられます。
47
-  
48
-  
49
-  
50
-
51
49
  ③ 途中経過表示で new_pop と pop が 反映されていないように思われます。
52
50
 
53
51
  ```diff

2

 

2022/08/28 12:06

投稿

退会済みユーザー
test CHANGED
@@ -60,7 +60,7 @@
60
60
  break
61
61
  ```
62
62
 
63
- エリート間一様交叉処理のループを抜ける条件が 固定値(10)になっているので、ここは gene_length とした方がより汎用的になると思います。
63
+ エリート間一様交叉処理のループを抜ける条件が 固定値(10)になっているので、ここは gene_length とした方がより汎用的になると思います。
64
64
  ```
65
65
  for g in range(generation):
66
66
  - if gene_length != pop[0][0] and gene_length != pop[-1][0]:

1

  

2022/08/28 12:06

投稿

退会済みユーザー
test CHANGED
@@ -28,10 +28,11 @@
28
28
  ```
29
29
 
30
30
  ② コードを素直に読んだ場合、アルゴリズムとして、下記のような流れになっているようです。
31
- + select で上位エリートを全個体数のうち elite_rate の割合だけ 選出
31
+ + select 関数全個体数のうち上位 elite_rate の割合の個体をエリートとして選出(エリート選出数=全個体数 × elite_rate )
32
32
  + 選出したエリートからランダムに2つ(その2つが同一個体である場合も含む)を選び出して、一様交叉を行う。
33
- + 一様交叉を行った後の個体からランダムに1つを選ぶ
33
+ + 一様交叉を行ってでき2パターンからランダムに1つを選ぶ
34
- + 上記の操作を、全個体数 - エリート選出数の回数だけ行う。
34
+ + 上記の操作を、全個体数 エリート選出数の回数だけ行う。
35
+ + 上記のループを、最上位の個体もしくは最下位の個体の評価値が 10 になるまで行う。
35
36
 
36
37
  ここで、ループ中、上位 {全個体数 × elite_rate} 個以上の個体がすべて同じ遺伝子パターンを有している状況になると、同じパターンを有する個体間でしか交叉が行われなくなり、結果**上位エリートと同じ遺伝子パターンの遺伝子を持った個体が残りの下位個体を駆逐する**ことになってしまいます。
37
38
   
@@ -59,3 +60,10 @@
59
60
  break
60
61
  ```
61
62
 
63
+ ⑤ エリート間一様交叉処理のループを抜ける条件が 固定値(10)になっているので、ここは gene_length とした方がより汎用的になると思います。
64
+ ```
65
+ for g in range(generation):
66
+ - if gene_length != pop[0][0] and gene_length != pop[-1][0]:
67
+ + if gene_length != pop[0][0] and gene_length != pop[-1][0]:
68
+ ```
69
+