Cześć! Bardzo proszę o pomoc doświadczone osoby w następującej kwestii:
Chcę napisać prosty "interface"(?) do optymalizowania własnych funkcji (obiektów). Całość chcę zorganizować w ten sposób, że:
- Mam pewną klasę bazową (Interface) typu:
class FunkcjaBazowa //Interface
{
public:
virtual double funkcja(vector<double>& data) = 0;
//... inne funkcje i ew. jakieś zmienne
};
- Po klasie Interface chcę dziedziczyć tworząc własne typy funkcji np.:
class MojaFunkcja1 : public FunkcjaBazowa // np. jakiś prosty liniowy model
{
public:
double funkcja(vector<double>& data);
//...
private:
vector<double> parametry; //f(x) = p1*X1 + p2*X2 ...
//...
};
class MojaFunkcja2 : public FunkcjaBazowa //jakaś bardziej skomplikowana funkcja
{
public:
double funkcja(vector<double>& data);
private:
//zmienne do modelu:
double zmiennaD1, zmiennaD2, zmiennaD3;
bool zmiennaB1, zmiennaB2;
int zmiennaI1, zmiennaI2, zmiennaI3;
};
- Do tego chcę zrobić klasę typu tester, która wprowadzałaby do moich funkcji nowe zmienne i porównywałaby wyniki ze wzorcami oraz zapisywałaby statystyki etc. np.
class tester
{
public:
vector<vecotr<double> > dane;
vector<double> wzorce;
void tester(FunkcjaBazowa* moja_funkcja);
//... inne funkcje/zmienne
};
Teraz mam do was pytanie, jak najlepiej byłoby do tak zorganizowanego kodu zaprogramować algorytmy genetyczne, które optymalizowałyby kolejne funkcje (pochodne po FunkcjiBazowej)?
Drugie pytanie jak to zorganizować tak, by program korzystał z N wątków (rdzeni)?
Najlepszy pomysł, na który obecnie wpadłem to taki, że klasy pochodne przekazywałyby "jakoś" wskaźniki do zmiennych, które mają być optymalizowane a klasa odpowiedzialna za optymalizację (AG) zapisywałaby te wskaźniki i odpowiednio je modyfikowała. tzn. każdy "osobnik" w AG miałby osobną tablicę wskaźników do optymalizowanych zmiennych w optymalizowanym obiekcie (funkcji).
Problem jaki teoretycznie tu występuje to taki, że zmienne mogą być różnych typów - ale to wydaje mi się, że da się stosunkowo prosto rozwiązać (byłyby różne typy chromosomów).
Nieco większy problem mam z organizacją tego kodu tak, by wykorzystywał maksymalną liczbę rdzeni. No i zastanawiam się czy da się to jakoś "ładnie" rozwiązać ;-)
Bo póki co mam dość niewygodną koncepcję polegającą na tym, że trzeba:
Utworzyć N obiektów Tester, MojaFunkcja i ew. Optymalizator (gdzie N to liczba rdzeni w komputerze) i w każdym wątku przeprowadzać oddzielną optymalizację lub
Utworzyć N obiektów Tester i MojaFunkcja a w optymalizatorze podzielić osobników na N podgrup i każda podgrupa miałaby wskaźniki do n-tego obiektu MojaFunkcja.
Całość ma wyglądać mniej więcej tak:
- Tworzymy własną funkcję, która ma być optymalizowana
- Przekazujemy wskaźniki do zmiennych, które mają być optymalizowane do obiektu Optymalizator
- Optymalizator tworzy N osobników etc.
- Każdy osobnik losuje zmienne
- Po kolei każdy osobnik wprowadza do obiektu Funkcja swój zestaw zmiennych a następnie uruchamia tester i sprawdza wynik
- inne czynności dot. AG (losowanie osobników do krzyżowania, mutacji etc.)
Macie może jakieś lepsze rozwiązanie szczególnie odnośnie wykorzystania wielu wątków lub jakieś uwagi do tego co napisałem?
Z góry bardzo dziękuję za każdą pomoc!