Я использую python для загрузки DLL, сгенерированной в c ++ (работает правильно), используя cdll.LoadLibrary (). Проблема в том, что мне нужно перезагружать DLL внутри класса каждый раз, когда вызывается класс, иначе это дает другое поведение.
Когда я перезагружаю dll внутри класса, код оценивает функцию пригодности дляоколо 4192 раз (262 итерации), но когда я удаляю две строки, которые перезагружают dll, код запускается всего 16 раз (одна итерация), останавливаясь перед конвергенцией.
Это мой код:
import sys
import os
import pygmo as pg
from ctypes import *
pathname = os.path.dirname(sys.argv[0])
dllPath = os.path.join((os.path.abspath(pathname)), 'optmization_functions.dll')
mydll = cdll.LoadLibrary(dllPath)
mydll.rosen.restype = c_double
class RosenbrockDLL():
def __init__(self, n):
"""Pass dimensions to constructor."""
self.n = n
def fitness(self, x):
"""
The Rosenbrock function.
sum(100.0*(x[1:] - x[:-1]**2.0)**2.0 + (1 - x[:-1])**2.0)
"""
mydll = cdll.LoadLibrary(dllPath)
mydll.rosen.restype = c_double
x2 = (c_double * self.n)(*x)
r = mydll.rosen(c_int(self.n), x2)
return [r]
def get_bounds(self):
return ([-5]*self.n,[10]*self.n)
def pygmo_methods(func=RosenbrockDLL, N_vars=4, N_pop=16, N_gers=1000):
prob = pg.problem(func(n = N_vars))
algo = pg.algorithm(pg.de1220(gen = N_gers))
algo.set_verbosity(0)
archi = pg.archipelago(1, algo=algo, prob=prob, pop_size=N_pop)
archi.evolve(1)
archi.wait()
bestFevals = archi[0].get_population().problem.get_fevals()
print('\tFunction value:', *archi.get_champions_f())
print('\tDesign values:', *archi.get_champions_x())
print('\tFunction evaluations:', bestFevals)
print('\tNumber of generations:', bestFevals//N_pop)
if __name__ == "__main__":
N = 4
pygmo_methods(func=RosenbrockDLL, N_vars=N, N_pop=16, N_gers=1000)
Прямо сейчас код перезагружает DLL каждый раз, когда вызывается фитнес, что увеличивает истекшее время. Я хотел бы загрузить его только один раз.