注册网站域名要多少钱,上海企业seo,网站优化方式有哪些,备案查询工信部我正在尝试实现功能。它的工作方式应该是这样的#xff1a;它需要两个列表。标记一些索引#xff0c;最好居中。父母双方都切换标记索引。其他索引按顺序转到其父元素。如果该父元素中已经存在相同的元素#xff0c;则它将映射并检查同一元素在其他父元素的位置并到达那里。…我正在尝试实现功能。它的工作方式应该是这样的它需要两个列表。标记一些索引最好居中。父母双方都切换标记索引。其他索引按顺序转到其父元素。如果该父元素中已经存在相同的元素则它将映射并检查同一元素在其他父元素的位置并到达那里。import randomdef pm(indA, indB):size min(len(indA), len(indB))c1, c2 [0] * size, [0] * size# Initialize the position of each indices in the individualsfor i in range(1,size):c1[indA[i]] ic2[indB[i]] icrosspoint1 random.randint(0, size)crosspoint2 random.randint(0, size - 1)if crosspoint2 crosspoint1:crosspoint2 1else: # Swap the two cx pointscrosspoint1, crosspointt2 crosspoint2, crosspoint1for i in range(crosspoint1, crosspoint2):# Keep track of the selected valuestemp1 indA[i]temp2 indB[i]# Swap the matched valueindA[i], indA[c1[temp2]] temp2, temp1indB[i], indB[c2[temp1]] temp1, temp2# Position bookkeepingc1[temp1], c1[temp2] c1[temp2], c1[temp1]c2[temp1], c2[temp2] c2[temp2], c2[temp1]return indA, indBa,b pm([3, 4, 8, 2, 7, 1, 6, 5],[4, 2, 5, 1, 6, 8, 3, 7])错误in pmc1[indA[i]] iIndexError: list assignment index out of range最佳答案不知道您的代码中是否还有其他错误(我没有运行它)但这是对此的解释。在Python(与其他大多数语言一样)中列表(更精确的序列)索引基于0 l [1, 2, 3, 4, 5, 6] for e in l:... print(e, l.index(e))...1 02 13 24 35 46 5 l[0]1 l[5]6 l[6]Traceback (most recent call last):File , line 1, in IndexError: list index out of range总结您的问题您的indA和indB列表各有6个元素([1..6])及其索引[0..5]您的c1和c2列表也有6个元素(索引也为[0..5])但是您使用的是1中的值。作为2列表中的索引而值6是一个问题因为没有这样的索引要解决您的问题您应该使用有效的索引值。要么在indA和indB中有适当的值(这是我选择的值)a, b pmxCrossover([0, 3, 1, 2, 5, 4], [4, 0, 2, 3, 5, 1])减去1无论遇到indA或indB用作索引的值c1[indA[i] - 1] i作为一般建议每当遇到错误时请在出现故障的行之前添加打印语句(从中打印(部分)内容)这可能会为您提供线索从而可以自己解决问题。 EDIT0发布原始代码(略有修改的版本)并进行索引转换在算法之前(从每个元素中减去1)具有有效索引在算法之后加1返回基于1的索引code00.py#!/usr/bin/env python3import sysimport randomdef 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 individualsfor i in range(1, size):c1[ind_a[i]] ic2[ind_b[i]] i# Choose crossover pointscrosspoint1 random.randint(0, size)crosspoint2 random.randint(0, size - 1)if crosspoint2 crosspoint1:crosspoint2 1else: # Swap the two cx pointscrosspoint1, crosspointt2 crosspoint2, crosspoint1# Apply crossover between cx pointsfor i in range(crosspoint1, crosspoint2):# Keep track of the selected valuestemp1 ind_a[i]temp2 ind_b[i]# Swap the matched valueind_a[i], ind_a[c1[temp2]] temp2, temp1ind_b[i], ind_b[c2[temp1]] temp1, temp2# Position bookkeepingc1[temp1], c1[temp2] c1[temp2], c1[temp1]c2[temp1], c2[temp2] c2[temp2], c2[temp1]return ind_a, ind_bdef 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 1temp_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.)输出(一种可能性(由于random.randint))[cfatiCFATI-5510-0:e:\Work\Dev\StackOverflow\q058424002] e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe code00.pyPython 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32Initial: [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.