2017-11-24 8 views
-1

私はPythonでGenetic Algorithmを使って関数の最大値を計算するコードを書いています。これはhereです。Pythonの配列値を変更する

私は、配列の値を変更したい場合は、私はエラーを取得する:この部分の

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 

、一度だけ実行して、5行目で配列の値を変更したい場合は「の」プログラムを終了します。

エラー:

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

いけないあなたは「私はエラーが出る」と思うが、助けのためにはるかに少ない参考になっている これは、特定のインデックスでupercaseする文字を変更する例です。実際にあなたの質問にエラーメッセージを載せるよりも、あなたの問題がありますか? –

+0

申し訳ありませんが、コード – Fatai

+0

を編集しました。 'get_genes()'は特に返されますか? 'numpy'配列か他のデータ型ですか? –

答えて

0

しかし、あなたが提供するものを見てはいるようです。だからあなたはインデックスによって新しい値を文字列に割り当てようとしているので、エラーになります。 文字列に割り当てること(別名、i番目の位置に文字列の単一の文字を変更する)あなたが望むものであるならば、あなたはこのようにそれを行うことができます:一時変数に別々の値を割り当てることで

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:]) 

またはより良いです明確にするためと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

Pythonの文字列は不変です。たとえば、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

コードを変更しましたが、このエラーが発生しました:TypeError: 'tuple'オブジェクトは、逆の(範囲(8))のiに対してself._genes [0] = [int(xd/2 ** i%2) – Fatai

+0

私は愚かですが、タプルは文字列と同じように不変です:-)。それはリストでなければなりません。それを私が直した。申し訳ありません – xhancar

0

Pythonで文字列の不変性を回避する方法は、文字列を再構築することです。

index=3 
string="abcdefgh" 

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

これは、プリントアウトします:

abcDefgh 
関連する問題