回答編集履歴
13
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
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
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
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
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
|
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
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
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
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 が持つリストへの参照を持つ子が追加されてしまうことになります。
|
18
|
+
new_pop には elite が持つリストへの参照を持つ子が追加されてしまうことになります。
|
19
|
+
|
20
|
+
つまり、elite と elite 以外の個体との間で**同じ遺伝子を共有している状態**になってしまうということです。
|
21
|
+
この結果、(popの内容を表示したとき)elite 間の遺伝子組み換えの結果が elite 以外の個体にも反映されたように見えてしまいます。
|
19
22
|
|
20
23
|
一様交叉の結果得られる個体は**新しい個体**と考えるならば、cxUniform 関数は、新しいリストを返すようにするべきでしょう。
|
21
24
|
```python
|
5
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
test
CHANGED
@@ -36,7 +36,7 @@
|
|
36
36
|
|
37
37
|
ここで、ループ中、上位 {全個体数 × elite_rate} 個以上の個体がすべて同じ遺伝子パターンを有している状況になると、同じパターンを有する個体間でしか交叉が行われなくなり、結果**上位エリートと同じ遺伝子パターンの遺伝子を持った個体が残りの下位個体を駆逐する**ことになってしまいます。
|
38
38
|
|
39
|
-
質問記載のコードのパラメータ設定の場合、個体数が10個で elite_rate が 0.2 であ
|
39
|
+
質問記載のコードのパラメータ設定の場合、個体数が10個で elite_rate が 0.2 であり、常に上位2つの個体のみエリートとして選ばれるため、早々にして上位2個の個体が同じ遺伝子パターンになる可能性が高くなります。
|
40
40
|
|
41
41
|
|
42
42
|
いったん上位2個の個体が同じ遺伝子パターンを有してしまうと、どんなに世代数を重ねても、遺伝子パターンは変化しません。
|
3
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
test
CHANGED
@@ -60,7 +60,7 @@
|
|
60
60
|
break
|
61
61
|
```
|
62
62
|
|
63
|
-
|
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
test
CHANGED
@@ -28,10 +28,11 @@
|
|
28
28
|
```
|
29
29
|
|
30
30
|
② コードを素直に読んだ場合、アルゴリズムとして、下記のような流れになっているようです。
|
31
|
-
+ select で
|
31
|
+
+ select 関数で、全個体数のうち上位 elite_rate の割合の個体をエリートとして選出(エリート選出数=全個体数 × elite_rate )
|
32
32
|
+ 選出したエリートからランダムに2つ(その2つが同一個体である場合も含む)を選び出して、一様交叉を行う。
|
33
|
-
+ 一様交叉を行った
|
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
|
+
|