Рой Пакет Питон
Я пытаюсь использовать 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)