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()
Beispiel #3
0
    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()
Beispiel #4
0
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()
Beispiel #5
0
    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])
Beispiel #6
0
 def __init__(self):
     self.todo = File("./data/todo.txt")
     self.done = File("./data/done.txt")
Beispiel #7
0
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]