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

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

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

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

Python

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

解決済

比較対象のデータ型が異なるという理由でリストのソードができない。

AI_engineer
AI_engineer

総合スコア8

Python 3.x

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

Python

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

2回答

0評価

0クリップ

144閲覧

投稿2022/05/25 04:53

編集2022/05/25 14:45

質問

オライリージャパン『集合知プログラミング』11章のサンプルコードがうまく実行できません。
遺伝的プログラミングを使って得られたランダムな座標から関数を同定するプログラムを組んでいます。
関数を500個作成後、それぞれの関数のスコアを算出し要素数500のリストを作ったのですが、そのスコアのリストをソートすることができずに困っています。
どなたかご教授お願いいたします。

再質問

エラーを取り除くことができましたが、原因を知りたいのでご教授下さい。
scoresがタプルのリストになっていたのでrankfunction関数(176行目)の
scores.sort(key = lambda x: x[0])
とするとエラーを解消することができましたが、これはタプル型のどの要素でソートするかを明示していなかったためエラーが出ていたという解釈でよろしいでしょうか。

実現したいこと

スコアのリストをソートする際のエラーを解消したい。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "g:\M1\code\gp\sample_gp.py", line 198, in <module> print(evolve(2, 500, rf, mutationrate=0.2, breedingrate=0.1, pexp=0.7, pnew=0.1)) File "g:\M1\code\gp\sample_gp.py", line 152, in evolve scores = rankfunction(population) File "g:\M1\code\gp\sample_gp.py", line 175, in rankfunction scores.sort() TypeError: '<' not supported between instances of 'node' and 'constnode'

該当のソースコード

python

from random import random, randint, choice from copy import deepcopy from math import log class fwrapper: def __init__(self, function, childcount, name): self.function = function self.childcount = childcount self.name = name # ノードのクラス class node: def __init__(self, fw, children): self.function = fw.function self.name = fw.name self.children = children def evaluate(self, inp): results = [n.evaluate(inp) for n in self.children] return self.function(results) def display(self, indent=0): print(' '*indent + self.name) for c in self.children: c.display(indent+1) # 変数ノードのクラス class paramnode: def __init__(self, idx): self.idx = idx def evaluate(self, inp): return inp[self.idx] def display(self, indent=0): print('{}p{}'.format(' '*indent, self.idx)) # 定数ノードのクラス class constnode: def __init__(self, v): self.v = v def evaluate(self, inp): return self.v def display(self, indent=0): print('{}{}'.format(' '*indent, self.v)) addw = fwrapper(lambda l: l[0] + l[1], 2, 'add') subw = fwrapper(lambda l: l[0] - l[1], 2, 'subtract') mulw = fwrapper(lambda l: l[0] * l[1], 2, 'multiply') def iffunc(l): if l[0] > 0: return l[1] else: return l[2] ifw = fwrapper(iffunc, 3, 'if') def isgreater(l): if l[0] > l[1]: return 1 else: return 0 gtw = fwrapper(isgreater, 2, 'isgreater') flist = [addw, mulw, ifw, gtw, subw] def exampletree(): return node(ifw, [ node(gtw, [paramnode(0), constnode(3)]), node(addw, [paramnode(1), constnode(5)]), node(subw, [paramnode(1), constnode(2)]) ]) # 最初の集団をランダムに作成 def makerandomtree(pc, maxdepth=4, fpr=0.5, ppr=0.6): # pc: 入力変数の数 if random() < fpr and maxdepth > 0: f = choice(flist) children = [makerandomtree(pc, maxdepth-1, fpr, ppr) for i in range(f.childcount)] return node(f, children) elif random() < ppr: return paramnode(randint(0, pc-1)) else: return constnode(randint(0, 10)) def hiddenfunction(x, y): return x**2 + 2*y + 3*x + 5 def buildhiddenset(): rows = [] for i in range(200): x = randint(0, 40) y = randint(0, 40) rows.append([x, y, hiddenfunction(x, y)]) return rows def scorefunction(tree, s): dif = 0 for data in s: v = tree.evaluate([data[0], data[1]]) dif += abs(v-data[2]) return dif # 突然変異 def mutate(t, pc, probchange=0.1): # 部分木を突然変異させる if random() < probchange: return makerandomtree(pc) # 突然変異させる部分木を決定する(木に潜っていく) else: result = deepcopy(t) if hasattr(t, "children"): result.children = [mutate(c, pc, probchange) for c in t.children] return result # 交叉(t1とt2同時に潜っていく) def crossover(t1, t2, probswap=0.7, top=1): if random() < probswap and not top: return deepcopy(t2) else: result = deepcopy(t1) if hasattr(t1, 'children') and hasattr(t2, 'children'): result.children = [crossover(c, choice(t2.children), probswap, 0) for c in t1.children] return result def evolve(pc, popsize, rankfunction, maxgen=500, mutationrate=0.1, breedingrate=0.4, pexp=0.7, pnew=0.05): """_summary_ Args: pc (_type_): _description_ popsize (_type_): 初期集団のサイズ. rankfunction (_type_): プログラムのリストに対して用いられ、ベストからワーストの順にランク付けする関数 maxgen (int, optional): _description_. Defaults to 500. mutationrate (float, optional): 突然変異を起こす確率. mutateに渡される. Defaults to 0.1. breedingrate (float, optional): 交叉を行う確率. crossoverに渡される. Defaults to 0.4. pexp (float, optional): ランクの低いプログラムが選ばれない確率. 値が高ければ高いほど,選択は厳格なものとなり,ランクの高いもののみが複製のために選ばれるようになる. Defaults to 0.7. pnew (float, optional): 新たな集団を作るとき,完全に新しいランダムなプログラムが作られる確率. Defaults to 0.05. Returns: _type_: _description_ """ # ランダムな低い数値を返す。pexpが低ければ低いほど得られる数値は小さくなる def selectindex(): return int(log(random())/log(pexp)) # 初期集団をランダムに作り上げる population = [makerandomtree(pc) for i in range(popsize)] for i in range(maxgen): scores = rankfunction(population) print(scores[0][0]) if scores[0][0] == 0: break # 上位2つは無条件に採用 newpop = [scores[0][1], scores[1][1]] # 次世代を作る while len(newpop) < popsize: if random() > pnew: newpop.append(mutate(crossover(scores[selectindex()][1], scores[selectindex()][1], probswap=breedingrate), pc, probchange=mutationrate)) else: # ランダムなノードを混ぜる newpop.append(makerandomtree(pc)) population=newpop scores[0][1].display() return scores[0][1] # データセットのランキングを行う関数を返す def getrankfunction(dataset): def rankfunction(population): scores = [(scorefunction(t, dataset), t) for t in population] scores.sort() return scores return rankfunction rf = getrankfunction(buildhiddenset()) print(evolve(2, 500, rf, mutationrate=0.2, breedingrate=0.1, pexp=0.7, pnew=0.1))

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

AI_engineer

2022/05/25 05:08

scoresがタプルのリストになっていたので rankfunction関数(176行目)の scores.sort(key = lambda x: x[0]) とするとエラーを解消することができましたが、これはタプル型のどの要素でソートするかを明示していなかったためエラーが出ていたという解釈でよろしいでしょうか。
ozwk

2022/05/25 05:08

質問文は編集できます

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Python 3.x

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

Python

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