###前提・実現したいこと
自己組織化マップによってTSPの近似解を求めたいです。
しかし、自分が実装した近傍関数はどこか違うのではないかと思ってます。
したがって、解決方法を具体的に教えて欲しいです。
###発生している問題・エラーメッセージ
学習で使用する近傍関数が0に常になり、正しく実装されていないのではないかと思っている。
###該当のソースコード
import numpy as np import matplotlib.pyplot as plt import random import math def ranX(cityXMax): #x座標の乱数 return random.randint(0,cityXMax) def ranY(cityYMax): y座標の乱数 return random.randint(0,cityYMax) def distance(a,b): #距離 d = ((a[0]-b[0])**2 + (a[1]-b[1])**2) d = math.sqrt(d) return d def neighborhoodFunction(dis,ln,nln): #近傍関数 lr = 0.8 alpha = 1.0 - (float(nln)/ln) a = -(dis/alpha)**2 h = lr * alpha * math.exp(a) return h class neuron: #ニューロン(ノード) def __init__(self,n,cityXMax,cityYMax): rv = np.array([]) rv = np.append(rv, [ranX(cityXMax),ranY(cityYMax)]) self.rv = rv #参照ベクトル class SOM: def __init__(self,cv,neurons,ln): self.neurons = neurons self.cv = cv self.ln = ln self.nln = 1 def getWinner(self,neurons,inputData,N): #勝ちニューロンを返す result = np.array([]) tmp = None for i in range(0,N): d = distance(neurons[i].rv,inputData) result = np.append(result,d) for i in range(0,N): if tmp == None: tmp = result[i] min = i if tmp > result[i]: tmp = result[i] min = i return neurons[min] def learning(self,winner,neurons,N): #学習 random_index = np.arange(N) np.random.shuffle(random_index) dis = distance(winner.rv,neurons[random_index[self.ln % N]].rv) h = neighborhoodFunction(dis,self.ln,self.nln) print(h) self.nln += 1 def main(): cv = np.array([[25,40],[36,70],[100,26],[20,210],[20,21]]) #特徴ベクトル n = 5 #都市の数 N = 20 #ニューロンの生成数 cityXMax = -1 cityYMax = -1 ln = 50 #予定している学習回数 neurons = np.array([]) for i in range(0, n): if cv[i][0] > cityXMax: cityXMax = cv[i][0] if cv[i][1] > cityYMax: cityYMax = cv[i][1] for i in range(0, N): neurons = np.append(neurons,neuron(n,cityXMax,cityYMax)) som = SOM(cv,neurons,ln) winner = som.getWinner(neurons,cv[0],N) som.learning(winner,neurons,N) if __name__ == "__main__": main()
###試したこと
近傍関数を色々変更してみたが、オーバーフローが起きたりしました。
###補足情報(言語/FW/ツール等のバージョンなど)
言語はPython3です。
プログラムは1回目の学習を行う途中まで書きました。
そこで、動作テストを行った結果、近傍関数がうまく働いていないのではないかと疑問を
持ちました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/05 03:56
2018/01/05 04:05 編集
2018/01/13 16:49
2018/01/14 00:49
2018/01/14 06:26
2018/01/14 23:40
2018/01/20 10:31 編集