<p>不确定你的代码中是否有其他错误(我没有运行它),但下面是对此的解释。在<em>Python</em>中(与大多数其他语言一样),<strong>列出了</strong>(更精确地说是序列)<strong>索引是基于<em>0</em>的</strong>:</p>
<blockquote>
<pre class="lang-py prettyprint-override"><code>>>> l = [1, 2, 3, 4, 5, 6]
>>>
>>> for e in l:
... print(e, l.index(e))
...
1 0
2 1
3 2
4 3
5 4
6 5
>>>
>>> l[0]
1
>>> l[5]
6
>>> l[6]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
</code></pre>
</blockquote>
<p>总结您的问题:</p>
<ol>
<li>您的indA</em>和indB</em>列表各有6个元素(<em>[1..6]</em>),它们的索引:<em>[0..5]</em></li>
<li>您的<em>c1</em>和<em>c2</em>列表也有6个元素(索引也是<em>[0..5]</em>)</li>
<li>但是,您使用<strong><em>#1中的值。作为<strong><em>#2中列表中的索引。</em></strong>,值<strong><em>6</em></strong>是个问题,因为没有这样的索引</li>
</ol>
<p>要解决问题,应该使用有效的索引值。或者:</p>
<ul>
<li><p>在<em>indA</em>和<em>indB</em>中有适当的值(这是我选择的值):</p>
<pre class="lang-py prettyprint-override"><code>a, b = pmxCrossover([0, 3, 1, 2, 5, 4], [4, 0, 2, 3, 5, 1])
</code></pre></li>
<li><p>减去<strong><em>1</em></strong>,<strong>当您遇到用作索引的<em>indA</em>或<em>indB</em>中的值时:</p>
<pre class="lang-py prettyprint-override"><code>c1[indA[i] - 1] = i
</code></pre></li>
</ul>
<p>一般的建议是:每当你遇到错误时,在错误行之前加上<strong><em>print</em></strong>语句<strong>(打印其中的部分内容),这可能会给你一些线索,帮助你自己解决问题。你知道吗</p>
<h3>@编辑0</h3>
<p>过帐(稍加修改的版本)原始代码,并进行索引转换:</p>
<ul>
<li>在算法之前:从每个元素中减去1,得到有效的索引</li>
<li>算法完成后:加1回到基于1的索引</li>
</ul>
<p>代码00.py:</p>
<pre class="lang-py prettyprint-override"><code>#!/usr/bin/env python3
import sys
import random
def pmx_crossover(ind_a, ind_b):
size = min(len(ind_a), len(ind_b))
c1, c2 = [0] * size, [0] * size
# Initialize the position of each indices in the individuals
for i in range(1, size):
c1[ind_a[i]] = i
c2[ind_b[i]] = i
# Choose crossover points
crosspoint1 = random.randint(0, size)
crosspoint2 = random.randint(0, size - 1)
if crosspoint2 >= crosspoint1:
crosspoint2 += 1
else: # Swap the two cx points
crosspoint1, crosspointt2 = crosspoint2, crosspoint1
# Apply crossover between cx points
for i in range(crosspoint1, crosspoint2):
# Keep track of the selected values
temp1 = ind_a[i]
temp2 = ind_b[i]
# Swap the matched value
ind_a[i], ind_a[c1[temp2]] = temp2, temp1
ind_b[i], ind_b[c2[temp1]] = temp1, temp2
# Position bookkeeping
c1[temp1], c1[temp2] = c1[temp2], c1[temp1]
c2[temp1], c2[temp2] = c2[temp2], c2[temp1]
return ind_a, ind_b
def main():
#initial_a, initial_b = [1, 2, 3, 4, 5, 6, 7, 8], [3, 7, 5, 1, 6, 8, 2, 4]
initial_a, initial_b = [1, 4, 2, 3, 6, 5], [5, 1, 3, 4, 6, 2]
index_offset = 1
temp_a = [i - index_offset for i in initial_a]
temp_b = [i - index_offset for i in initial_b]
a, b = pmx_crossover(temp_a, temp_b)
final_a = [i + index_offset for i in a]
final_b = [i + index_offset for i in b]
print("Initial: {0:}, {1:}".format(initial_a, initial_b))
print("Final: {0:}, {1:}".format(final_a, final_b))
if __name__ == "__main__":
print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
main()
print("\nDone.")
</code></pre>
<p><strong>输出</strong>(可能性之一(由于<code>random.randint</code>)):</p>
<blockquote>
<pre class="lang-bat prettyprint-override"><code>[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q058424002]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code00.py
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32
Initial: [1, 4, 2, 3, 6, 5], [5, 1, 3, 4, 6, 2]
Final: [1, 3, 2, 4, 6, 5], [5, 1, 4, 3, 6, 2]
Done.
</code></pre>
</blockquote>