質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

682閲覧

missing 1 required positional argumentが直せない

old.exe

総合スコア23

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/09/25 23:20

お世話になります。遺伝的アルゴリズムで巡回セールスマン問題を解くプログラムを作っています。タイトルのようなエラーに対処できません。以下、コード全体とエラー文になります。

python

1import random 2import math 3import csv 4import copy 5 6 7 8def read_tspfile(): 9 """ 10 tspファイルを読み込み、都市の座標(float型)を 11 [[都市番号,X,Y],[...],...] の形で返す 12 """ 13 def str2float(cities): 14 data = [[0]]*len(cities) 15 for i in range(len(cities)): 16 city = [0]*len(cities[i]) 17 data[i] = city 18 try: 19 for j in range(len(cities[i])): 20 data[i][j] = float(cities[i][j]) 21 except: 22 data[i]*=0 23 continue 24 data2 = list(filter(None,data)) 25 return data2 26 27 def remove_blank(cities): 28 for i in range(len(cities)): 29 for j in range(len(cities[i])): 30 try: 31 cities[i].remove('') 32 except: 33 continue 34 35 with open("a280.tsp","r") as fin: 36 data = [city.split(' ') for city in fin.read().splitlines()] 37 remove_blank(data) 38 cities_data = str2float(data) 39 return cities_data 40 41 42 43cities_data = read_tspfile() 44population = [] # [[経路],[経路],[経路]...[経路]] 45cities = [] # Cityオブジェクトを入れるリスト 46CITIES_N = len(cities_data) # 都市数 47 48 49 50class City: 51 def __init__(self,num,X,Y): 52 self.num = num 53 self.X = X 54 self.Y = Y 55 56 57 58class Route: 59 def __init__(self): 60 self.distance = 0 61 62 # 経路を作成(重複なしのランダム) 63 self.citynums = random.sample(list(range(CITIES_N)),CITIES_N) 64 65 66 def calc_distance(self): 67 """ citynumsリストの各都市間の距離の総和を求める """ 68 self.distance = 0 69 for i,num in enumerate(self.citynums): 70 """ 71 1つ前の都市との距離を計算 72 i=0のとき、i-1は最後の都市(最後の都市からスタートへの距離) 73 """ 74 self.distance += math.dist((cities[num].X, 75 cities[num].Y), 76 (cities[self.citynums[i-1]].X, 77 cities[self.citynums[i-1]].Y)) 78 return self.distance 79 80 81 def copy_route(self,route): 82 return copy.copy(route) # deepcopy? 83 84 85 def crossover(self, p1, p2): 86 # 子の遺伝子情報 87 c1 = self.copy_gene(p1) 88 c2 = self.copy_gene(p2) 89 for i in range(len(c1)): 90 if random.random() > 0.5: 91 c1[i], c2[i] = c2[i], c1[i] 92 93 mutated_c1, mutated_c2 = self.mutate(c1,c2) 94 95 return mutated_c1,mutated_c2 96 97 98 # 一様交叉 99 def mutate(self,c1,c2,mutate_rate=0.05): 100 if random.random() > mutate_rate: 101 if random.random() > 0.5: 102 select_num = [i for i in range(c1)] 103 select_index = random.sample(select_num, 2) 104 105 a = c1[select_index[0]] 106 b = c1[select_index[1]] 107 c1[select_index[1]] = a 108 c1[select_index[0]] = b 109 110 else: 111 select_num = [i for i in range(c2)] 112 select_index = random.sample(select_num, 2) 113 114 a = c2[select_index[0]] 115 b = c2[select_index[1]] 116 c2[select_index[1]] = a 117 c2[select_index[0]] = b 118 119 return c1,c2 120 121 122def pfga(): 123 124 # 2未満なら追加。これだけだとランダムに2こ取り出す動作でエラー吐く。別途初期集団は作っておく 125 if len(population) < 2: 126 population.append(Route()) 127 128 # ランダムに2個取り出す 129 p1 = population.pop(random.randint(0, len(population)-1)) 130 p2 = population.pop(random.randint(0, len(population)-1)) 131 132 # 子を作成 133 c1, c2 = Route.crossover(p1,p2) 134 135 if p1.calc_distance() < p2.calc_distance(): 136 p_min = p1 137 p_max = p2 138 else: 139 p_min = p2 140 p_max = p1 141 if c1.calc_distance() < c2.calc_distance(): 142 c_min = c1 143 c_max = c2 144 else: 145 c_min = c2 146 c_max = c1 147 148 if c_min.calc_distance() >= p_max.calc_distance(): 149 # 子2個体がともに親の2個体より良かった場合 150 # 子2個体及び適応度の良かった方の親個体計3個体が局所集団に戻り、局所集団数は1増加する。 151 population.append(c1) 152 population.append(c2) 153 population.append(p_max) 154 elif p_min.calc_distance() >= c_max.calc_distsnce(): 155 # 子2個体がともに親の2個体より悪かった場合 156 # 親2個体のうち良かった方のみが局所集団に戻り、局所集団数は1減少する。 157 population.append(p_max) 158 elif p_max.calc_distance() >= c_max.calc_distance() and p_min.calc_distance() <= c_max.calc_distance(): 159 # 親2個体のうちどちらか一方のみが子2個体より良かった場合 160 # 親2個体のうち良かった方と子2個体のうち良かった方が局所集団に戻り、局所集団数は変化しない。 161 population.append(c_max) 162 population.append(p_max) 163 elif c_max.calc_distance() >= p_max.calc_distance() and c_min.calc_distance() <= p_max.calc_distance(): 164 # 子2個体のうちどちらか一方のみが親2個体より良かった場合 165 # 子2個体のうち良かった方のみが局所集団に戻り、全探索空間からランダムに1個体選んで局所集団に追加する。局所集団数は変化しない。 166 population.append(c_max) 167 population.append(Route()) 168 else: 169 raise ValueError("not comming") 170 171 172 173 174# citiesにCityオブジェクトを入れる 175for i in range(CITIES_N): 176 cities.append(City(cities_data[i][0], 177 cities_data[i][1], 178 cities_data[i][2])) # num,X,Yの順 179 180 181# populationに個体を追加 182for i in range(2): 183 population.append(Route()) 184 185 186generation = 0 187best_route = random.choice(population) # 個体(経路) 188best_dist = best_route.calc_distance() # 距離 189first = best_dist # 1番優秀 190 191 192 193with open('PfGA_result.csv','w') as fout: 194 195 csvout = csv.writer(fout) 196 result = [] 197 198 while True: 199 pfga() 200 201 population.sort(key=Route.calc_distance) 202 dist1 = population[0].calc_distance() 203 204 if dist1 < best_dist: 205 best_dist = dist1 206 best_route = population[0] 207 208 generation += 1 209 210 if generation == 1 or generation%100 == 0: 211 data = [] 212 data.extend([generation,best_dist]) 213 result.append(data) 214 if generation == 500: 215 csvout.writerows(result) 216 print(best_route.citynums) 217 break 218
Traceback (most recent call last): File …, line 198, in pfga() File ..., line 133, in pfga c1, c2 = Route.crossover(p1,p2) TypeError: crossover() missing 1 required positional argument: 'p2'

以上になります。汚いコードで恐縮ですが、よろしければ回答お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

crossover()Route クラスのインスタンスメソッドなので、呼ぶためには Route クラスのインスタンスが必要です。

python

1r = Route() 2c1, c2 = r.crossover(p1, p2) 3 4// インスタンスを入れる変数はなくてもいい 5c1, c2 = Route().crossover(p1, p2)

さっとコードを眺めてみましたが、むしろ copy_route() crossover() mutate() は引数から self を消してクラスメソッドにすべきという気がします。

投稿2022/09/25 23:29

編集2022/09/26 00:41
int32_t

総合スコア20672

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

old.exe

2022/09/26 07:31

回答ありがとうございました。このエラーは回答の通りにしたら直りました。また別のエラーが色々出ましたが、少し頑張ってみてダメなら別途質問しようと思います。改めて回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問