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

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

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

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

Python

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

解決済

missing 1 required positional argumentが直せない

old.exe
old.exe

総合スコア23

Python 3.x

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

Python

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

1回答

0リアクション

0クリップ

234閲覧

投稿2022/09/25 23:20

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

python

import random import math import csv import copy def read_tspfile(): """ tspファイルを読み込み、都市の座標(float型)を [[都市番号,X,Y],[...],...] の形で返す """ def str2float(cities): data = [[0]]*len(cities) for i in range(len(cities)): city = [0]*len(cities[i]) data[i] = city try: for j in range(len(cities[i])): data[i][j] = float(cities[i][j]) except: data[i]*=0 continue data2 = list(filter(None,data)) return data2 def remove_blank(cities): for i in range(len(cities)): for j in range(len(cities[i])): try: cities[i].remove('') except: continue with open("a280.tsp","r") as fin: data = [city.split(' ') for city in fin.read().splitlines()] remove_blank(data) cities_data = str2float(data) return cities_data cities_data = read_tspfile() population = [] # [[経路],[経路],[経路]...[経路]] cities = [] # Cityオブジェクトを入れるリスト CITIES_N = len(cities_data) # 都市数 class City: def __init__(self,num,X,Y): self.num = num self.X = X self.Y = Y class Route: def __init__(self): self.distance = 0 # 経路を作成(重複なしのランダム) self.citynums = random.sample(list(range(CITIES_N)),CITIES_N) def calc_distance(self): """ citynumsリストの各都市間の距離の総和を求める """ self.distance = 0 for i,num in enumerate(self.citynums): """ 1つ前の都市との距離を計算 i=0のとき、i-1は最後の都市(最後の都市からスタートへの距離) """ self.distance += math.dist((cities[num].X, cities[num].Y), (cities[self.citynums[i-1]].X, cities[self.citynums[i-1]].Y)) return self.distance def copy_route(self,route): return copy.copy(route) # deepcopy? def crossover(self, p1, p2): # 子の遺伝子情報 c1 = self.copy_gene(p1) c2 = self.copy_gene(p2) for i in range(len(c1)): if random.random() > 0.5: c1[i], c2[i] = c2[i], c1[i] mutated_c1, mutated_c2 = self.mutate(c1,c2) return mutated_c1,mutated_c2 # 一様交叉 def mutate(self,c1,c2,mutate_rate=0.05): if random.random() > mutate_rate: if random.random() > 0.5: select_num = [i for i in range(c1)] select_index = random.sample(select_num, 2) a = c1[select_index[0]] b = c1[select_index[1]] c1[select_index[1]] = a c1[select_index[0]] = b else: select_num = [i for i in range(c2)] select_index = random.sample(select_num, 2) a = c2[select_index[0]] b = c2[select_index[1]] c2[select_index[1]] = a c2[select_index[0]] = b return c1,c2 def pfga(): # 2未満なら追加。これだけだとランダムに2こ取り出す動作でエラー吐く。別途初期集団は作っておく if len(population) < 2: population.append(Route()) # ランダムに2個取り出す p1 = population.pop(random.randint(0, len(population)-1)) p2 = population.pop(random.randint(0, len(population)-1)) # 子を作成 c1, c2 = Route.crossover(p1,p2) if p1.calc_distance() < p2.calc_distance(): p_min = p1 p_max = p2 else: p_min = p2 p_max = p1 if c1.calc_distance() < c2.calc_distance(): c_min = c1 c_max = c2 else: c_min = c2 c_max = c1 if c_min.calc_distance() >= p_max.calc_distance(): # 子2個体がともに親の2個体より良かった場合 # 子2個体及び適応度の良かった方の親個体計3個体が局所集団に戻り、局所集団数は1増加する。 population.append(c1) population.append(c2) population.append(p_max) elif p_min.calc_distance() >= c_max.calc_distsnce(): # 子2個体がともに親の2個体より悪かった場合 # 親2個体のうち良かった方のみが局所集団に戻り、局所集団数は1減少する。 population.append(p_max) elif p_max.calc_distance() >= c_max.calc_distance() and p_min.calc_distance() <= c_max.calc_distance(): # 親2個体のうちどちらか一方のみが子2個体より良かった場合 # 親2個体のうち良かった方と子2個体のうち良かった方が局所集団に戻り、局所集団数は変化しない。 population.append(c_max) population.append(p_max) elif c_max.calc_distance() >= p_max.calc_distance() and c_min.calc_distance() <= p_max.calc_distance(): # 子2個体のうちどちらか一方のみが親2個体より良かった場合 # 子2個体のうち良かった方のみが局所集団に戻り、全探索空間からランダムに1個体選んで局所集団に追加する。局所集団数は変化しない。 population.append(c_max) population.append(Route()) else: raise ValueError("not comming") # citiesにCityオブジェクトを入れる for i in range(CITIES_N): cities.append(City(cities_data[i][0], cities_data[i][1], cities_data[i][2])) # num,X,Yの順 # populationに個体を追加 for i in range(2): population.append(Route()) generation = 0 best_route = random.choice(population) # 個体(経路) best_dist = best_route.calc_distance() # 距離 first = best_dist # 1番優秀 with open('PfGA_result.csv','w') as fout: csvout = csv.writer(fout) result = [] while True: pfga() population.sort(key=Route.calc_distance) dist1 = population[0].calc_distance() if dist1 < best_dist: best_dist = dist1 best_route = population[0] generation += 1 if generation == 1 or generation%100 == 0: data = [] data.extend([generation,best_dist]) result.append(data) if generation == 500: csvout.writerows(result) print(best_route.citynums) break
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'

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

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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

Python

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