def __init__(self): super().__init__() self.geometry("790x480") self.title("Computer Intelligence") self.runType = 0 self.fig = plt.figure() self.ax = self.fig.add_subplot(111) self.ax.axis('equal') self.canvas = FigureCanvasTkAgg(self.fig, master=self) self.fuzzyAlgorithm = FuzzyAlgorithmHw1() self.mathAlgorithm = MathAlgorithm() self.file = File() self.orbitData = [[], []] self.recordIndex = 0 self.carStartInfo, self.endArea, self.track = self.file.getTrackData( 'case01.txt') self.car = Car(self.carStartInfo[:2], self.carStartInfo[2], self.ax, self.track, self.endArea) self.car.draw(False) self.componment() self.update()
def __init__(self): self.iteration = 500 self.dimension = 3 self.genePoolSize = 1000 self.genePool = [] self.minFitness = 10000 self.matingRate = 0.6 self.mutationRate = 0.01 self.bestGene = None self.file = File()
def __init__(self): self.__WINDOW = tk.Tk() self.__WINDOW.title("Neural Network HW_01") self.__WINDOW.resizable(0, 0) self.__WINDOW.geometry("750x650+100+100") self.__WINDOW.protocol("WM_DELETE_WINDOW", self._closeWindow) self.__FILE = File() self._component() self.__FIGURE_PLT = figurePlt(self.__WINDOW, 2, -2) self.__WINDOW.mainloop()
class Crawler: def __init__(self): self.todo = File("./data/todo.txt") self.done = File("./data/done.txt") def crawl(self): while (True): if self.todo.is_empty(): break print("Start new crawl") url = self.todo.pop() print("scrape url: {}".format(url)) links = Scraper.scrape(url) print(links) for link in links: self.todo.add(link) self.done.add(url) print("save files") self.todo.save() self.done.save()
def __init__(self, learnRate, endRound, fileName): self.__LEARN_RATE = learnRate self.__END_ROUND = endRound self.__DATA_WITH_WEIGHT, maxDataRange, minDataRange = File().getFileContent(fileName, -1) self.__DATA_FOR_TRAINING, self.__DATA_FOR_TESTING = self.randomDataTo2Array(self.__DATA_WITH_WEIGHT) self.__DATA_LENGTH = len(self.__DATA_WITH_WEIGHT[0]) - 2 self.__DATA_WITH_WEIGHT_LENGTH = self.__DATA_LENGTH + 1 self.__W = self.randomWeight() self.__E = [] for i in self.__DATA_WITH_WEIGHT: if i[self.__DATA_LENGTH + 1] not in self.__E: self.__E.append(i[self.__DATA_LENGTH + 1])
def __init__(self): self.todo = File("./data/todo.txt") self.done = File("./data/done.txt")
class UiLayout: def __init__(self): self.__WINDOW = tk.Tk() self.__WINDOW.title("Neural Network HW_01") self.__WINDOW.resizable(0, 0) self.__WINDOW.geometry("750x650+100+100") self.__WINDOW.protocol("WM_DELETE_WINDOW", self._closeWindow) self.__FILE = File() self._component() self.__FIGURE_PLT = figurePlt(self.__WINDOW, 2, -2) self.__WINDOW.mainloop() def checkValueIsFloat(self, value): try: float(value) return True except ValueError: return False def _startCalcu(self): self.__FIGURE_PLT.clearPlt() learnRate = self.learnRate_tf.get() endTime = self.endCondition_tf.get() if self.checkValueIsFloat(learnRate) and self.checkValueIsFloat( endTime): self.errorMsg_lb_var.set('') fileName = self.fileOptionValue.get() data, maxRangeNum, minRangeNum = self.__FILE.getFileContent( fileName, 1) __PERCEPTRON = Perceptron(float(learnRate), float(endTime), fileName) self.showStartW_lb_var.set('起始鍵結值:' + str(__PERCEPTRON.getWeight())) __PERCEPTRON.perceptronCalcu('training') testingDataIndex = __PERCEPTRON.getTestingDataIndex() arr = __PERCEPTRON.getWeightYToZero() self.__FIGURE_PLT.resetDataRagne(maxRangeNum, minRangeNum) self.__FIGURE_PLT.updateCanvasForPoint(data, testingDataIndex) self.__FIGURE_PLT.updateCanvasForLine(arr) self.showEndW_lb_var.set('結束鍵結值:' + str(__PERCEPTRON.getWeight())) self.showTrainingRate_lb_var.set( '訓練辨識率:' + str(__PERCEPTRON.getDataSuccessRate('training')) + '%') self.showTestingRate_lb_var.set( '測試辨識率:' + str(__PERCEPTRON.getDataSuccessRate('testing')) + '%') else: self.errorMsg_lb_var.set('請輸入學習率與收斂條件') def _closeWindow(self): self.__WINDOW.quit() self.__WINDOW.destroy() def _component(self): self.learnRate_lb = tk.Label(self.__WINDOW, text='學習率', font=('Arial', 10)) self.learnRate_lb.grid(row=0) self.learnRate_tf = tk.Entry(self.__WINDOW, ) self.learnRate_tf.grid(row=0, column=1) self.endCondition_lb = tk.Label(self.__WINDOW, text='收斂條件', font=('Arial', 10)) self.endCondition_lb.grid(row=1) self.endCondition_tf = tk.Entry(self.__WINDOW, ) self.endCondition_tf.grid(row=1, column=1) fileOptions = self.__FILE.getDataSetFileName() self.fileOptionValue = tk.StringVar(self.__WINDOW) self.fileOptionValue.set(fileOptions[0]) self.fileOption_lb = tk.Label(self.__WINDOW, text='請選擇檔案', font=('Arial', 10)) self.fileOption_lb.grid(row=2) self.fileOption_op = tk.OptionMenu(self.__WINDOW, self.fileOptionValue, *fileOptions) self.fileOption_op.grid(row=2, column=1) self.startCalcu_bt = tk.Button(self.__WINDOW, text="開始", command=self._startCalcu, width=10) self.startCalcu_bt.grid(row=0, rowspan=2, column=2, columnspan=2, padx=10, pady=5) self.closeWindow_bt = tk.Button(self.__WINDOW, text="離開", command=self._closeWindow, width=10) self.closeWindow_bt.grid(row=0, column=4, columnspan=2, rowspan=2, padx=10, pady=5) self.errorMsg_lb_var = tk.StringVar() errorMsg_lb = tk.Label(self.__WINDOW, textvariable=self.errorMsg_lb_var, font=('Arial', 10)) errorMsg_lb.grid(row=4, columnspan=2) self.showStartW_lb_var = tk.StringVar() self.showStartW_lb_var.set('起始鍵結值:') showW_lb = tk.Label(self.__WINDOW, textvariable=self.showStartW_lb_var, font=('Arial', 10)) showW_lb.grid(row=6, column=0) self.showEndW_lb_var = tk.StringVar() self.showEndW_lb_var.set('結束鍵結值:') showW_lb = tk.Label(self.__WINDOW, textvariable=self.showEndW_lb_var, font=('Arial', 10)) showW_lb.grid(row=6, column=2) self.showTrainingRate_lb_var = tk.StringVar() self.showTrainingRate_lb_var.set('訓練辨識率:') showTrainingRate_lb = tk.Label( self.__WINDOW, textvariable=self.showTrainingRate_lb_var, font=('Arial', 10)) showTrainingRate_lb.grid(row=7, column=0) self.showTestingRate_lb_var = tk.StringVar() self.showTestingRate_lb_var.set('測試辨識率:') showTestingRate_lb = tk.Label(self.__WINDOW, textvariable=self.showTestingRate_lb_var, font=('Arial', 10)) showTestingRate_lb.grid(row=7, column=1)
class Hw1Layout(tk.Tk): def __init__(self): super().__init__() self.geometry("790x480") self.title("Computer Intelligence") self.runType = 0 self.fig = plt.figure() self.ax = self.fig.add_subplot(111) self.ax.axis('equal') self.canvas = FigureCanvasTkAgg(self.fig, master=self) self.fuzzyAlgorithm = FuzzyAlgorithmHw1() self.mathAlgorithm = MathAlgorithm() self.file = File() self.orbitData = [[], []] self.recordIndex = 0 self.carStartInfo, self.endArea, self.track = self.file.getTrackData( 'case01.txt') self.car = Car(self.carStartInfo[:2], self.carStartInfo[2], self.ax, self.track, self.endArea) self.car.draw(False) self.componment() self.update() def update(self): if self.runType != 0: self.ax.clear() self.car.draw(True) if self.runType == 1: carState = self.car.updateCarPos() # self.runType = 0 self.orbitData[0].append([ self.car.getSensorToTrackDistance('front'), self.car.getSensorToTrackDistance('right'), self.car.getSensorToTrackDistance('left'), self.car.getcarSteeringWheelAngle(), ]) self.orbitData[1].append([ self.car.carCenterPos[0], self.car.carCenterPos[1], self.car.getSensorToTrackDistance('front'), self.car.getSensorToTrackDistance('right'), self.car.getSensorToTrackDistance('left'), self.car.getcarSteeringWheelAngle() ]) # print(self.orbitData) if carState: self.runType = 0 else: self.updateCarInfoLb() fsDistance = self.car.getSensorToTrackDistance('front') rsDistance = self.car.getSensorToTrackDistance('right') lsDistance = self.car.getSensorToTrackDistance('left') steeringWheelAngle = self.fuzzyAlgorithm.fuzzySystem( fsDistance, rsDistance, lsDistance) self.car.setcarSteeringWheelAngle(steeringWheelAngle) if self.runType == 0: self.ax.clear() self.car.draw(True) self.updateCarInfoLb() self.file.writeContentToFile(self.orbitData[0], 'train4D.txt') self.file.writeContentToFile(self.orbitData[1], 'train6D.txt') self.orbitData = [[], []] elif self.runType == 2: record4D = self.file.getCarRecord('train4D.txt') self.car.setcarSteeringWheelAngle( record4D[self.recordIndex][3]) self.recordIndex += 1 carState = self.car.updateCarPos() self.updateCarInfoLb() if carState: self.recordIndex = len(record4D) if len(record4D) == self.recordIndex: self.runType = 0 self.recordIndex = 0 elif self.runType == 3: record6D = self.file.getCarRecord('train6D.txt') self.car.setcarSteeringWheelAngle( record6D[self.recordIndex][5]) self.recordIndex += 1 carState = self.car.updateCarPos() self.updateCarInfoLb() if carState: self.recordIndex = len(record6D) if len(record6D) == self.recordIndex: self.runType = 0 self.recordIndex = 0 self.canvas.draw() self.after(100, self.update) def updateCarInfoLb(self): fsDistance = self.car.getSensorToTrackDistance('front') rsDistance = self.car.getSensorToTrackDistance('right') lsDistance = self.car.getSensorToTrackDistance('left') self.fsDistance_lb_var.set(fsDistance) self.rsDistance_lb_var.set(rsDistance) self.lsDistance_lb_var.set(lsDistance) self.carAngle_lb_var.set(self.car.getCarAngle()) self.carSteeringWheelAngle_lb_var.set( self.car.getcarSteeringWheelAngle()) def componment(self): plot_widget = self.canvas.get_tk_widget().place(x=180, y=0) infoPos = (10, 100) valueX = 100 self.start_bt = tk.Button(self, text="開始", command=self.startBt, width=15, height=2) self.start_bt.place(x=10, y=10) fileOptions = self.file.getAllTrackFilename() self.fileOptionValue = tk.StringVar('') self.fileOptionValue.set(fileOptions[0]) self.fileOption_lb = tk.Label(self, text='更換軌道', font=('Arial', 10)) self.fileOption_lb.place(x=infoPos[0], y=infoPos[1] - 35) self.fileOption_op = tk.OptionMenu(self, self.fileOptionValue, *fileOptions) self.fileOption_op.place(x=infoPos[0], y=infoPos[1] - 15) carAngle_tx = tk.Label(self, text='自走車角度 :', font=('Arial', 10)) carAngle_tx.place(x=infoPos[0], y=infoPos[1] + 20) self.carAngle_lb_var = tk.StringVar() self.carAngle_lb_var.set(str(self.car.getCarAngle())) carAngle_lb = tk.Label(self, textvariable=self.carAngle_lb_var, font=('Arial', 10)) carAngle_lb.place(x=infoPos[0] + valueX, y=infoPos[1] + 20) carSteeringWheelAngle_tx = tk.Label(self, text='方向盤角度 :', font=('Arial', 10)) carSteeringWheelAngle_tx.place(x=infoPos[0], y=infoPos[1] + 40) self.carSteeringWheelAngle_lb_var = tk.StringVar() self.carSteeringWheelAngle_lb_var.set( str(self.car.getcarSteeringWheelAngle())) carSteeringWheelAngle_lb = tk.Label( self, textvariable=self.carSteeringWheelAngle_lb_var, font=('Arial', 10)) carSteeringWheelAngle_lb.place(x=infoPos[0] + valueX, y=infoPos[1] + 40) fsDistance_tx = tk.Label(self, text='前感測器距離 :', font=('Arial', 10)) fsDistance_tx.place(x=infoPos[0], y=infoPos[1] + 60) self.fsDistance_lb_var = tk.StringVar() self.fsDistance_lb_var.set(0) fsDistance_lb = tk.Label(self, textvariable=self.fsDistance_lb_var, font=('Arial', 10)) fsDistance_lb.place(x=infoPos[0] + valueX, y=infoPos[1] + 60) rsDistance_tx = tk.Label(self, text='右感測器距離 :', font=('Arial', 10)) rsDistance_tx.place(x=infoPos[0], y=infoPos[1] + 80) self.rsDistance_lb_var = tk.StringVar() self.rsDistance_lb_var.set(0) rsDistance_lb = tk.Label(self, textvariable=self.rsDistance_lb_var, font=('Arial', 10)) rsDistance_lb.place(x=infoPos[0] + valueX, y=infoPos[1] + 80) lsDistance_tx = tk.Label(self, text='左感測器距離 :', font=('Arial', 10)) lsDistance_tx.place(x=infoPos[0], y=infoPos[1] + 100) self.lsDistance_lb_var = tk.StringVar() self.lsDistance_lb_var.set(0) lsDistance_lb = tk.Label(self, textvariable=self.lsDistance_lb_var, font=('Arial', 10)) lsDistance_lb.place(x=infoPos[0] + valueX, y=infoPos[1] + 100) self.readTrack_bt = tk.Button(self, text="讀取 4D 記錄", command=self.readTrackBt, width=15, height=2) self.readTrack_bt.place(x=infoPos[0], y=infoPos[1] + 150) self.readHistory_bt = tk.Button(self, text="讀取 6D 記錄", command=self.readHistoryBt, width=15, height=2) self.readHistory_bt.place(x=infoPos[0], y=infoPos[1] + 200) def startBt(self): carStartInfo, endArea, track = self.file.getTrackData( self.fileOptionValue.get()) self.car.resetCarState(carStartInfo[:2], carStartInfo[2]) self.car.setTrack(track) self.car.setEndArea(endArea) self.runType = 1 def readTrackBt(self): carStartInfo, endArea, track = self.file.getTrackData( self.fileOptionValue.get()) self.car.resetCarState(carStartInfo[:2], carStartInfo[2]) self.car.setTrack(track) self.car.setEndArea(endArea) self.runType = 2 def readHistoryBt(self): carStartInfo, endArea, track = self.file.getTrackData( self.fileOptionValue.get()) self.car.resetCarState(carStartInfo[:2], carStartInfo[2]) self.car.setTrack(track) self.car.setEndArea(endArea) self.runType = 3
class Hw2Layout(tk.Tk): def __init__(self): super().__init__() self.geometry("790x480") self.title("Computer Intelligence - Gene & RBFN") self.runType = 0 self.fig = plt.figure() self.ax = self.fig.add_subplot(111) self.ax.axis('equal') self.canvas = FigureCanvasTkAgg(self.fig, master=self) self.GeneAlgorithm = GeneAlgorithm() self.mathAlgorithm = MathAlgorithm() self.file = File() self.orbitData = [[], []] self.recordIndex = 0 self.carStartInfo, self.endArea, self.track = self.file.getTrackData('case01.txt') self.car = Car(self.carStartInfo[:2], self.carStartInfo[2], self.ax, self.track, self.endArea) self.car.draw(False) self.componment() self.update() def update(self): if self.runType != 0: self.ax.clear() self.car.draw(True) if self.runType == 1: carState = self.car.updateCarPos() self.orbitData[0].append([ self.car.getSensorToTrackDistance('front'), self.car.getSensorToTrackDistance('right'), self.car.getSensorToTrackDistance('left'), self.car.getcarSteeringWheelAngle(), ]) self.orbitData[1].append([ self.car.carCenterPos[0], self.car.carCenterPos[1], self.car.getSensorToTrackDistance('front'), self.car.getSensorToTrackDistance('right'), self.car.getSensorToTrackDistance('left'), self.car.getcarSteeringWheelAngle() ]) if carState: self.runType = 0 else: self.updateCarInfoLb() fsDistance = self.car.getSensorToTrackDistance('front') rsDistance = self.car.getSensorToTrackDistance('right') lsDistance = self.car.getSensorToTrackDistance('left') if int(self.data_vb_var.get()) == 1: steeringWheelAngle = self.GeneAlgorithm.testingFor4D(fsDistance, rsDistance, lsDistance) else: steeringWheelAngle = self.GeneAlgorithm.testingFor6D(self.car.carCenterPos[0], self.car.carCenterPos[1], fsDistance, rsDistance, lsDistance) self.car.setcarSteeringWheelAngle(steeringWheelAngle) if self.runType == 0: self.ax.clear() self.car.draw(True) self.updateCarInfoLb() self.file.writeContentToFile(self.orbitData[0], 'train4D.txt') self.file.writeContentToFile(self.orbitData[1], 'train6D.txt') self.orbitData = [[], []] elif self.runType == 2: record4D = self.file.getCarRecord('train4D.txt') self.car.setcarSteeringWheelAngle(record4D[self.recordIndex][3]) self.recordIndex += 1 carState = self.car.updateCarPos() self.updateCarInfoLb() if carState: self.recordIndex = len(record4D) if len(record4D) == self.recordIndex: self.runType = 0 self.recordIndex = 0 elif self.runType == 3: record6D = self.file.getCarRecord('train6D.txt') self.car.setcarSteeringWheelAngle(record6D[self.recordIndex][5]) self.recordIndex += 1 carState = self.car.updateCarPos() self.updateCarInfoLb() if carState: self.recordIndex = len(record6D) if len(record6D) == self.recordIndex: self.runType = 0 self.recordIndex = 0 self.canvas.draw() self.after(100, self.update) def updateCarInfoLb(self): fsDistance = self.car.getSensorToTrackDistance('front') rsDistance = self.car.getSensorToTrackDistance('right') lsDistance = self.car.getSensorToTrackDistance('left') self.fsDistance_lb_var.set(fsDistance) self.rsDistance_lb_var.set(rsDistance) self.lsDistance_lb_var.set(lsDistance) self.carAngle_lb_var.set(self.car.getCarAngle()) self.carSteeringWheelAngle_lb_var.set(round(self.car.getcarSteeringWheelAngle(), 4)) def componment(self): plot_widget = self.canvas.get_tk_widget().place(x = 180, y = 0) genePos = (10, 0) self.algorithmSection_lb = tk.Label(self, text = 'Gene & RBFN 訓練', font = ('Arial', 12)) self.algorithmSection_lb.place(x = genePos[0], y = genePos[1]) self.start_training = tk.Button(self, text = "開始訓練", command = self.startTrain, width = 10, height = 1) self.start_training.place(x = genePos[0], y = genePos[1] + 25) self.data_vb_var = tk.StringVar() self.data_vb_var.set(1) self.data4D_lb = tk.Label(self, text = '訓練資料集', font = ('Arial', 10)) self.data4D_lb.place(x = genePos[0], y = genePos[1] + 50) self.data4D_rb = tk.Radiobutton(self, text="4D", variable=self.data_vb_var, value=1) self.data4D_rb.place(x = genePos[0] + 70, y = genePos[1] + 50) self.data6D_rb = tk.Radiobutton(self, text="6D", variable=self.data_vb_var, value=2) self.data6D_rb.place(x = genePos[0] + 115, y = genePos[1] + 50) self.iterationTimes_lb = tk.Label(self, text = '迭代次數', font = ('Arial', 10)) self.iterationTimes_lb.place(x = genePos[0], y = genePos[1] + 70) self.iterationTimes_lb_var = tk.StringVar() self.iterationTimes_lb_var.set('10') self.iterationTimes_tx = tk.Entry(self, width = 10, textvariable = self.iterationTimes_lb_var) self.iterationTimes_tx.place(x = genePos[0] + 70, y = genePos[1] + 70) self.genePoolSize_lb = tk.Label(self, text = '族群大小', font = ('Arial', 10)) self.genePoolSize_lb.place(x = genePos[0], y = genePos[1] + 90) self.genePoolSize_lb_var = tk.StringVar() self.genePoolSize_lb_var.set('100') self.genePoolSize_tx = tk.Entry(self, width = 10, textvariable = self.genePoolSize_lb_var) self.genePoolSize_tx.place(x = genePos[0] + 70, y = genePos[1] + 90) self.mating_lb = tk.Label(self, text = '交配機率', font = ('Arial', 10)) self.mating_lb.place(x = genePos[0], y = genePos[1] + 110) self.mating_lb_var = tk.StringVar() self.mating_lb_var.set('0.6') self.mating_tx = tk.Entry(self, width = 10, textvariable = self.mating_lb_var) self.mating_tx.place(x = genePos[0] + 70, y = genePos[1] + 110) self.mutation_lb = tk.Label(self, text = '突變機率', font = ('Arial', 10)) self.mutation_lb.place(x = genePos[0], y = genePos[1] + 130) self.mutation_lb_var = tk.StringVar() self.mutation_lb_var.set('0.01') self.mutation_tx = tk.Entry(self, width = 10, textvariable = self.mutation_lb_var) self.mutation_tx.place(x = genePos[0] + 70, y = genePos[1] + 130) infoPos = (10, 250) valueX = 100 fileOptions = self.file.getAllTrackFilename() self.fileOptionValue = tk.StringVar('') self.fileOptionValue.set(fileOptions[0]) self.carSection_lb = tk.Label(self, text = '自動車控制', font = ('Arial', 12)) self.carSection_lb.place(x = infoPos[0], y = infoPos[1] - 90) self.start_bt = tk.Button(self, text = "開始測試", command = self.startBt, width = 10, height = 1) self.start_bt.place(x = infoPos[0], y = infoPos[1] - 65) self.fileOption_lb = tk.Label(self, text = '更換軌道', font = ('Arial', 10)) self.fileOption_lb.place(x = infoPos[0], y = infoPos[1] - 35) self.fileOption_op = tk.OptionMenu(self, self.fileOptionValue, *fileOptions) self.fileOption_op.place(x = infoPos[0], y = infoPos[1] - 15) carAngle_tx = tk.Label(self, text = '自走車角度 :', font = ('Arial', 10)) carAngle_tx.place(x = infoPos[0], y = infoPos[1] + 20) self.carAngle_lb_var = tk.StringVar() self.carAngle_lb_var.set(str(self.car.getCarAngle())) carAngle_lb = tk.Label(self, textvariable = self.carAngle_lb_var, font = ('Arial', 10)) carAngle_lb.place(x = infoPos[0] + valueX, y = infoPos[1] + 20) carSteeringWheelAngle_tx = tk.Label(self, text = '方向盤角度 :', font = ('Arial', 10)) carSteeringWheelAngle_tx.place(x = infoPos[0], y = infoPos[1] + 40) self.carSteeringWheelAngle_lb_var = tk.StringVar() self.carSteeringWheelAngle_lb_var.set(str(self.car.getcarSteeringWheelAngle())) carSteeringWheelAngle_lb = tk.Label(self, textvariable = self.carSteeringWheelAngle_lb_var, font = ('Arial', 10)) carSteeringWheelAngle_lb.place(x = infoPos[0] + valueX, y = infoPos[1] + 40) fsDistance_tx = tk.Label(self, text = '前感測器距離 :', font = ('Arial', 10)) fsDistance_tx.place(x = infoPos[0], y = infoPos[1] + 60) self.fsDistance_lb_var = tk.StringVar() self.fsDistance_lb_var.set(0) fsDistance_lb = tk.Label(self, textvariable = self.fsDistance_lb_var, font = ('Arial', 10)) fsDistance_lb.place(x = infoPos[0] + valueX, y = infoPos[1] + 60) rsDistance_tx = tk.Label(self, text = '右感測器距離 :', font = ('Arial', 10)) rsDistance_tx.place(x = infoPos[0], y = infoPos[1] + 80) self.rsDistance_lb_var = tk.StringVar() self.rsDistance_lb_var.set(0) rsDistance_lb = tk.Label(self, textvariable = self.rsDistance_lb_var, font = ('Arial', 10)) rsDistance_lb.place(x = infoPos[0] + valueX, y = infoPos[1] + 80) lsDistance_tx = tk.Label(self, text = '左感測器距離 :', font = ('Arial', 10)) lsDistance_tx.place(x = infoPos[0], y = infoPos[1] + 100) self.lsDistance_lb_var = tk.StringVar() self.lsDistance_lb_var.set(0) lsDistance_lb = tk.Label(self, textvariable = self.lsDistance_lb_var, font = ('Arial', 10)) lsDistance_lb.place(x = infoPos[0] + valueX, y = infoPos[1] + 100) # self.readTrack_bt = tk.Button(self, text = "讀取 4D 記錄", command = self.readTrackBt, width = 15, height = 2) # self.readTrack_bt.place(x = infoPos[0], y = infoPos[1] + 150) # self.readHistory_bt = tk.Button(self, text = "讀取 6D 記錄", command = self.readHistoryBt, width = 15, height = 2) # self.readHistory_bt.place(x = infoPos[0], y = infoPos[1] + 200) self.loadDataSection_lb = tk.Label(self, text = '讀取檔案', font = ('Arial', 12)) self.loadDataSection_lb.place(x = infoPos[0], y = infoPos[1] + 140) self.readHistory4D_bt = tk.Button(self, text = "讀取 RBFN 4D", command = self.readHistoryRBFN4D, width = 12, height = 1) self.readHistory4D_bt.place(x = infoPos[0], y = infoPos[1] + 165) # self.readHistory6D_bt = tk.Button(self, text = "讀取 RBFN 6D", command = self.readHistoryRBFN6D, width = 12, height = 1) # self.readHistory6D_bt.place(x = infoPos[0], y = infoPos[1] + 195) def startBt(self): carStartInfo, endArea, track = self.file.getTrackData(self.fileOptionValue.get()) self.car.resetCarState(carStartInfo[:2], carStartInfo[2]) self.car.setTrack(track) self.car.setEndArea(endArea) self.runType = 1 def readTrackBt(self): carStartInfo, endArea, track = self.file.getTrackData(self.fileOptionValue.get()) self.car.resetCarState(carStartInfo[:2], carStartInfo[2]) self.car.setTrack(track) self.car.setEndArea(endArea) self.runType = 2 def readHistoryBt(self): carStartInfo, endArea, track = self.file.getTrackData(self.fileOptionValue.get()) self.car.resetCarState(carStartInfo[:2], carStartInfo[2]) self.car.setTrack(track) self.car.setEndArea(endArea) self.runType = 3 def readHistoryRBFN4D(self): vector = self.file.getRBFNParam() self.GeneAlgorithm.loadRBFN(vector, 3) def readHistoryRBFN6D(self): vector = self.file.getRBFNParam() self.GeneAlgorithm.loadRBFN(vector, 5) def startTrain(self): dimension = 3 if int(self.data_vb_var.get()) == 1 else 5 iteration = int(self.iterationTimes_lb_var.get()) genePoolSize = int(self.genePoolSize_lb_var.get()) matingRate = float(self.mating_lb_var.get()) mutationRate = float(self.mutation_lb_var.get()) print(dimension) self.GeneAlgorithm.setGeneParam(dimension, genePoolSize, matingRate, mutationRate, 100000) for index in range(iteration): self.GeneAlgorithm.training() print('Iteration ', index) print(self.GeneAlgorithm.minFitness) self.file.writeRBFNParamToFile(self.GeneAlgorithm.bestGene.vector)
class GeneAlgorithm(): def __init__(self): self.iteration = 500 self.dimension = 3 self.genePoolSize = 1000 self.genePool = [] self.minFitness = 10000 self.matingRate = 0.6 self.mutationRate = 0.01 self.bestGene = None self.file = File() def training(self): for index in range(self.genePoolSize): if random.random() < self.matingRate: val = int(random.random() * (self.genePoolSize - 1)) self.geneMating(self.genePool[index], self.genePool[val]) for index in range(self.genePoolSize): if random.random() < self.mutationRate: self.geneMutation(self.genePool[index]) self.getBestGene() def testingFor4D(self, fSen, rSen, lSen): return self.bestGene.RBFN.getOutput([fSen, rSen, lSen]) * 80 - 40 def testingFor6D(self, x, y, fSen, rSen, lSen): return self.bestGene.RBFN.getOutput([x, y, fSen, rSen, lSen]) * 80 - 40 def geneMating(self, geneA, geneB): sigmaVal = (random.random() - 0.5) * 2 * self.matingRate geneAVector = np.array(geneA.vector) + sigmaVal * (np.array(geneA.vector) - np.array(geneB.vector)) geneBVector = np.array(geneB.vector) - sigmaVal * (np.array(geneA.vector) - np.array(geneB.vector)) geneA.updateVector(geneAVector) geneB.updateVector(geneBVector) def geneMutation(self, gene): sigmaVal = (random.random() - 0.5) * 2 * self.mutationRate geneVector = np.array(gene.vector) + sigmaVal * random.random() * np.array(gene.vector) gene.updateVector(geneVector) def getBestGene(self): for geneIndex in range(self.genePoolSize): fit = self.genePool[geneIndex].getFitness(self.wheelRecord, self.senRecord) if fit < self.minFitness: self.minFitness = fit self.bestGene = copy.deepcopy(self.genePool[geneIndex]) def setGeneParam(self, dimension, genePoolSize, matingRate, mutationRate, minFitness): self.dimension = dimension self.genePoolSize = genePoolSize self.matingRate = matingRate self.mutationRate = mutationRate self.minFitness = minFitness fileName = 'train4D.txt' if self.dimension == 3 else 'train6D.txt' self.senRecord, self.wheelRecord = self.file.getCarRecordForGene(fileName) self.recordNormalization() self.genePool = [] for size in range(self.genePoolSize): self.genePool.append(Gene(self.dimension)) def recordNormalization(self): for index, wheel in enumerate(self.wheelRecord): self.wheelRecord[index] = (np.array(wheel) + 40) / 80 def loadRBFN(self, vector, dataDimension): print('loadRBFN') self.bestGene = Gene(dataDimension) self.bestGene.updateVector(vector) # 4vector = [ # 0.27413031070271554,-0.2165564702584432,0.43570801383368407,0.25766919736016813,0.8162115275208734,0.8162821060763124,0.8202941611263892,0.42819618155989114,0.08077460452911274,5.824353208226845,13.444845433520543,25.843555157662887,24.72074663331964,27.2452876319428,4.26792413219178,29.879182972982075,17.71580854125198,6.590448633825639,0.8439619974605179,25.090933045508315,15.210407312007572,26.40874256181456,25.714038156109435,29.958432120639543,0.3486954447339934,29.887137298021543,22.942949780787536,23.7447902299137,19.17562948615331,7.703035677504062,6.924410903031947,14.185147813621386,10.955673223625558,3.9415175026251936,9.477755884503381,0.2730688547204743,8.259032578761945,2.933900572696063,3.3994091470723804,9.982899337717233,1.196458072994222 # ] # vector6d =[0.3314577730610375, 1.2183321081726128, 1.557934622746724, 0.3080828456782288, 0.7291432017815879, 1.2314183874778006, 2.155807295701578,0.39081250852022686, 0.7434143743221118, 0.008997195643978547, 1.7810518811343055, 9.383480543728732, 23.748940099019297, 10.043168670510601, 13.860769542424523, 24.46494545450288, 28.202942918756225, 24.877126793973563, 3.9222106689879697, 29.877963667569002, 28.396347719098557, 9.421677792657011, 11.162980712345448, 0.3468052347140606, 10.342886386409214, 24.974118896811085, 7.540382128022785, 1.0953311755495911, 29.998498548958363, 0.046913219247201376, 1.1011038377052575, 4.306768631106814, 29.998561290785688, 12.449489740729295, 1.927979889073564, 26.479774776775724, 0.5121427432301313, 22.80113107160742, 2.072223997473536, 0.004049267680546706, 0.006525454347247486, 29.938221316682128, 13.288957250131268, 8.925158752355541, 29.95244316597126, 3.4456902434559478, 0.2788639194474892, 14.472981799950828, 2.8857602683878203, 6.79775252348321, 9.998534643282436, 0.6543266933167925, 1.0037529895699917, 3.091226193327437, 9.985620674857863, 9.065722780560979, 9.016848732343306]