2017-11-24 1 views
-1

저는 파이썬에서 유전 알고리즘을 사용하여 함수의 최대 계산을위한 코드를 작성했습니다. 이것은 here입니다. 내가 배열의 값을 변경하려면파이썬에서 배열 값을 변경하십시오.

, 나는 오류 얻을 : 한 번만 실행 '을 위해',이 부분에

def _crossover_chromosomes(chromosome1,chromosome2): 
    crossover_chrom = Chromosome() 
    for i in range(8): 
    if random.random() >= 0.5: 
     crossover_chrom.get_genes()[0][i] = chromosome1.get_genes()[0][i] 
     crossover_chrom.get_genes()[1][i] = chromosome1.get_genes()[0][i] 
    else: 
     crossover_chrom.get_genes()[0][i] = chromosome2.get_genes()[0][i] 
     crossover_chrom.get_genes()[1][i] = chromosome2.get_genes()[0][i] 
return crossover_chrom 

을 그리고 다섯 번째 줄에 배열 값을 변경하고자하는 경우 , 프로그램을 종료합니다.

오류 :

crossover_chrom.get_genes()[0][i] = chromosome1.get_genes()[0][i] 
    TypeError: 'str' object does not support item assignment 
+0

그나마 당신이 "나는 오류가"생각이 돕는 훨씬 덜 helpfull이다 이 특정 인덱스에 자리수의하는 문자를 변경하는 예입니다 귀하의 질문에 실제로 오류 메시지를 넣는 것보다 문제가 있습니까? –

+0

죄송합니다, 코드를 편집했습니다 – Fatai

+0

'get_genes()'가 특별히 돌려주는 것은 무엇입니까? 'numpy' 배열 또는 다른 데이터 유형입니까? –

답변

0

보인다. 그래서 당신은 인덱스에 의해 문자열에 새로운 값을 할당하려고합니다. 따라서 오류가 발생합니다. 임시 변수에 개별적으로 값을 할당하여

crossover_chrom.get_genes()[0] = "{0}{1}{2}".format(
    crossover_chrom.get_genes()[0][:i], 
    chromosome1.get_genes()[0][i], 
    crossover_chrom.get_genes()[0][i+1:]) 

또는 더 나은 : 문자열로 할당하는 당신이 원하는 무엇 경우이 같은 그것을 할 수 있습니다 (일명 i 번째 위치에 문자열의 단일 문자를 변경) 명확성을 위해 그리고 get_gene 기능마다 호출 피하기 위해 :

다른 당신은 단순히 객체의 예에 목록을 호출하여 (그것을 할 수있는 목록에 문자열을 변환해야
orig_gene=crossover_chrom.get_genes()[0] 
new_gene1=chromosome1.get_genes()[0] 
#... 
orig_gene = "{0}{1}{2}".format(
     orig_gene[:i], 
     new_gene1[i], 
     orig_gene[i+1:]) 

:

list(crossover_chrom.get_genes()[0]) 

또는 get_genes()를 수정하여 문자열 목록 대신 목록을 반환합니다.

+0

그것은 완벽하게 정확했습니다! 고맙습니다:) – Fatai

0

파이썬 문자열을 변경할 수 있습니다. 예를 들어 a='10010110' 일 수없고 a[3]='1'을 할당 할 수 없습니다. 그것은 오류의 원인입니다. 문자열을 피할 필요가 있습니다. 대신 bool 또는 integers 배열을 사용하십시오. 같은

뭔가 :

crossover_chrom.get_genes()[0] 

는 문자열을 반환처럼 당신이 제공하는 무슨 잘못 만보고있을 수 있습니다

class Chromosome: 
    def __init__(self): 
    self._genes = [[],[]] 
    self._fitness = 0 
    self.xd = 0 
    self.yd = 0 

    xd = random.randint(0,256) 
    self._genes[0] = [ int(xd/2**i%2) for i in reversed(range(8))] 

    yd = random.randint(0,256) 
    self._genes[1] = [ int(yd/2**i%2) for i in reversed(range(8))] 
+0

코드를 변경했지만이 오류가 발생합니다. 역방향 (범위 (8))의 self._genes [0] = [int (xd/2 ** i % 2)] TypeError : 'tuple' 지원 항목 할당 – Fatai

+0

나 바보, 튜플 문자열과 같은 방식으로 변경할 수 있습니다 :-). 목록이어야합니다. 나는 그것을 고쳤다. 죄송합니다 – xhancar

0

파이썬에서 문자열 불변성을 해결하는 방법은 문자열을 다시 작성하는 것입니다.

index=3 
string="abcdefgh" 

string= string[:index]+string[index].upper()+ string[index+1:] 
print(string) 

이 출력됩니다 :

abcDefgh 
관련 문제