Рой Пакет Питон

Я пытаюсь использовать SwarmPackagePy, доступный на Github, для исследования Bacterial Foraging Optimization, но Python и программирование для меня - новый мир. Я пытаюсь создать графический интерфейс Tkinter, чтобы сохранить значения и отправить их в функцию SwarmPackagePy.bfo() для запуска некоторых тестов. Я сделал следующий код для отправки некоторых значений в функцию:

from tkinter import *
from SwarmPackagePy import testFunctions
from SwarmPackagePy import animation
import SwarmPackagePy

def save():
    global lista
    lista = []
    global nfa
    nfa=1
    if str(entryN.get()).isnumeric():
        n=int(entryN.get())
    else:
        n=30
    if str(entryDimension.get()).isnumeric():
        dimension=int(entryDimension.get())
    else:
        dimension=2
    if str(entryIteration.get()).isnumeric():
        iteration=int(entryIteration.get())
    else:
        iteration=100
    if str(entryNc.get()).isnumeric():
        Nc=int(entryNc.get())
    else:
        Nc=2
    if str(entryNs.get()).isnumeric():
        Ns=int(entryNs.get())
    else:
        Ns=12
    if str(entryC.get()).isnumeric():
        C=int(entryC.get())
    else:
        C=0.2
    if str(entryPed.get()).isnumeric():
        Ped=int(entryPed.get())
    else:
        Ped=1.15

    alh = SwarmPackagePy.bfo(n, testFunctions.easom_function, -10, 10, dimension, iteration, Nc, Ns, C, Ped)
    animation(alh.get_agents(), tf.easom_function, -10, 10)


root = Tk()

n = Label(root, text="Number of agents:")
entryN = Entry(root)

dimension = Label(root, text="Space dimension:")
entryDimension = Entry(root)

iteration = Label(root, text="The number of iterations:")
entryIteration = Entry(root)

Nc = Label(root, text="Number of chemotactic steps:")
entryNc = Entry(root)

Ns = Label(root, text="Swimming length:")
entryNs = Entry(root)

C = Label(root, text="The size of step taken in the random direction specified by the tumble:")
entryC = Entry(root)

Ped = Label(root, text="Elimination-dispersal probability")
entryPed = Entry(root)

entryN.grid(row=0, column=1)
entryDimension.grid(row=1, column=1)
entryIteration.grid(row=2, column=1)
entryNc.grid(row=3, column=1)
entryNs.grid(row=4, column=1)
entryC.grid(row=5, column=1)
entryPed.grid(row=6, column=1)

n.grid(row=0, sticky=E)
dimension.grid(row=1, sticky=E)
iteration.grid(row=2, sticky=E)
Nc.grid(row=3, sticky=E)
Ns.grid(row=4, sticky=E)
C.grid(row=5, sticky=E)
Ped.grid(row=6, sticky=E)


c = Button(root, text="Submit", command=save)
c.grid(columnspan=2)

root.mainloop()

Я не уверен, что это нормально, но это работает. Моя идея состоит в том, чтобы сохранять лучшие значения (x и y) в каждой итерации, чтобы сравнить их с функциями бенчмарка. Есть идеи, как мне это сделать? Я не уверен, правильно ли я выразил себя. Я оставлю здесь код bfo. заранее спасибо

import numpy as np
from random import random

from . import intelligence


class bfo(intelligence.sw):
    """
    Bacteria Foraging Optimization
    """

    def __init__(self, n, function, lb, ub, dimension, iteration,
                 Nc=2, Ns=12, C=0.2, Ped=1.15):
        """
        :param n: number of agents
        :param function: test function
        :param lb: lower limits for plot axes
        :param ub: upper limits for plot axes
        :param dimension: space dimension
        :param iteration: the number of iterations
        :param Nc: number of chemotactic steps (default value is 2)
        :param Ns: swimming length (default value is 12)
        :param C: the size of step taken in the random direction specified by
        the tumble (default value is 0.2)
        :param Ped: elimination-dispersal probability (default value is 1.15)
        """

        super(bfo, self).__init__()

        self.__agents = np.random.uniform(lb, ub, (n, dimension))
        self._points(self.__agents)

        n_is_even = True
        if n & 1:
            n_is_even = False

        J = np.array([function(x) for x in self.__agents])
        Pbest = self.__agents[J.argmin()]
        Gbest = Pbest

        C_list = [C - C * 0.9 * i / iteration for i in range(iteration)]
        Ped_list = [Ped - Ped * 0.5 * i / iteration for i in range(iteration)]

        J_last = J[::1]

        for t in range(iteration):

            J_chem = [J[::1]]

            for j in range(Nc):
                for i in range(n):
                    dell = np.random.uniform(-1, 1, dimension)
                    self.__agents[i] += C_list[t] * np.linalg.norm(dell) * dell

                    for m in range(Ns):
                        if function(self.__agents[i]) < J_last[i]:
                            J_last[i] = J[i]
                            self.__agents[i] += C_list[t] * np.linalg.norm(dell) \
                                                * dell
                        else:
                            dell = np.random.uniform(-1, 1, dimension)
                            self.__agents[i] += C_list[t] * np.linalg.norm(dell) \
                                                * dell

                J = np.array([function(x) for x in self.__agents])
                J_chem += [J]

            J_chem = np.array(J_chem)

            J_health = [(sum(J_chem[:, i]), i) for i in range(n)]
            J_health.sort()
            alived_agents = []
            for i in J_health:
                alived_agents += [list(self.__agents[i[1]])]

            if n_is_even:
                alived_agents = 2*alived_agents[:n//2]
                self.__agents = np.array(alived_agents)
            else:
                alived_agents = 2*alived_agents[:n//2] +\
                                [alived_agents[n//2]]
                self.__agents = np.array(alived_agents)

            if t < iteration - 2:
                for i in range(n):
                    r = random()
                    if r >= Ped_list[t]:
                        self.__agents[i] = np.random.uniform(lb, ub, dimension)

            J = np.array([function(x) for x in self.__agents])
            self._points(self.__agents)

            Pbest = self.__agents[J.argmin()]
            if function(Pbest) < function(Gbest):
                Gbest = Pbest

        self._set_Gbest(Gbest)

0 ответов

Другие вопросы по тегам