Discussão do artigo "Algoritmos genéticos - é fácil!" - página 13

 

Na biblioteca livre do artigo, trabalhe com o genótipo. Trabalhe com o fenótipo em FF (como no exemplo 2).

O exposto acima significa que a biblioteca funcionará com a mesma eficiência se o fenótipo for processado em FF, mas o número de iterações (execuções em FF) será significativamente maior do que se o AG trabalhar diretamente com o fenótipo (porque o detalhe do espaço de busca aumenta). No limite, a pesquisa (sem refinamento do fenótipo) tende a um espaço de pesquisa contínuo.

 

Boa noite.

Gostaria de agradecê-lo pelo excelente artigo.

No início, foi um pouco complicado para mim, mas acabei entendendo.

Antes de escrever algo neste tópico do fórum, gostaria de esclarecer se entendi corretamente seu artigo e o curso do algoritmo UGA:

1) Definir os parâmetros de entrada do UGA para uma tarefa específica.

---UGA

2) Criação de uma colônia inicial de pais por meio da combinação aleatória de genes

2.2) Cálculo do resultado de FF para cada uma dessas colônias

2.3) Remoção de clones.

3) Determinação do melhor resultado de FF de todos os indivíduos dessa colônia

4) Início do ciclo de criação de uma colônia de descendentes da primeira colônia. Os descendentes são criados usando as ferramentas: Crossover, mutação artificial e natural, replicação de genes e empréstimo de genes, sendo

Crossover - troca de partes dos cromossomos dos pais,

Mutação artificial - seleção de genes fora do intervalo (gene do pai 1, gene do pai 2).

Est. Mutação - seleção de genes do intervalo (mínimo do intervalo de genes, máximo do intervalo de genes).

Replicação - seleção de genes em intervalos próximos aos valores dos genes parentais, mas com um certo deslocamento.

empréstimo de genes - criação de um "indivíduo montado" a partir do número de pais igual ao número de genes.

5 )Exclusão de clones

6)Cálculo do resultado do FF para cada uma dessas colônias

7)Comparação dos resultados dos indivíduos descendentes com o resultado de referência e sua possível substituição. Em caso de substituição, o contador "Epochs without changes of the reference value" (Épocas sem alterações no valor de referência) é zerado

8) Ordenação de todos os indivíduos, do melhor para o pior.

9) -->item 4

10) Se ocorrerem épocas sem alteração em Y, encerrar e emitir o valor de referência encontrado.

Peço desculpas antecipadamente, talvez este seja um tópico de discussão em vez de um tutorial, mas não tenho outro lugar para pedir conselhos. Na verdade, encontrei o GA pela primeira vez em seu artigo (antes do seu artigo, eu nem entendia o que significavam as palavras "Fast(genetic algorithm)" no testador de terminal), portanto, meu conhecimento e experiência (comecei a programar em MQL5 há cerca de 2 meses) são um pouco limitados.

Se eu entender seu algoritmo GA, tentarei transplantá-lo para OOP. De fato, comecei a estudá-lo. Já implementei modelos de negociação, auto-otimizados com pesquisa direta, mas ainda não com o GA (modelos com base no princípio descrito no artigo https://www.mql5.com/ru/articles/217).

Desde já agradeço.

Генетические алгоритмы - это просто!
Генетические алгоритмы - это просто!
  • 2010.05.25
  • Andrey Dik
  • www.mql5.com
В статье автор расскажет об эволюционных вычислениях с использованием генетического алгоритма собственной реализации. Будет показано на примерах функционирование алгоритма, даны практические рекомендации по его использованию.
 

mi__x__an:

...gostaria de esclarecer se entendi corretamente seu artigo e o curso do algoritmo UGA

Em termos gerais, sim, está correto.
 

Bom dia .

Obrigado por sua resposta rápida.

Então, tenho algumas perguntas.

double Chromosome[];           /Conjunto de argumentos de função otimizados - genes
                               //(por exemplo: pesos de redes neurais, etc.)-cromossomo
int    GeneCount           =0; // Número de genes em um cromossomo
double RangeMinimum        =0.0;/Faixa mínima de pesquisa
double RangeMaximum        =0.0;/Máximo do intervalo de pesquisa
double Precision           =0.0;/Etapa de pesquisa
int    OptimizeMethod      =0; //1 - mínimo, qualquer outro - máximo

O que é a matriz Chromosome aqui? Valores possíveis do parâmetro otimizado?

Então, se, por exemplo, otimizarmos o "tamanhomínimo do lote" no intervalo de 0,1 a 1 (com uma etapa mínima de lote de 0,1),

então a matriz terá a seguinte aparência:{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, número de genes no cromossomo 1, mínimo 0.1 máximo 1.0, etapa 0.1 ? É possível?

E uma pergunta relacionada, como inserir nessa matriz, por exemplo: Stop Loss otimizado [10...500], Take Profit [10...500], tamanho mínimo do lote [0,1...1,0] e sinalizador Trailing (usar trailing ou não)[0...1]?

Em geral, como devem ser os dados de entrada ao otimizar parâmetros com diferentes tipos, mínimos e máximos de valores possíveis?

Agradeço antecipadamente pela resposta.

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
mi__x__an:

O que é a matriz de cromossomos aqui? Os valores possíveis do parâmetro otimizado?

Portanto, se, por exemplo, otimizarmos o "tamanhomínimo do lote" no intervalo de 0,1 a 1 (com uma etapa mínima de lote de 0,1),

então a matriz terá a seguinte aparência:{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, número de genes no cromossomo 1, mínimo 0.1 máximo 1.0, etapa 0.1 ? É possível?

E uma pergunta relacionada, como inserir nessa matriz, por exemplo: Stop Loss otimizado [10...500], Take Profit [10...500], tamanho mínimo do lote [0,1...1,0] e sinalizador Trailing (usar trailing ou não)[0...1]?

Em geral, como devem ser os dados de entrada ao otimizar parâmetros com diferentes tipos, mínimos e máximos de valores possíveis?

Agradeço antecipadamente pela resposta.

Não,

double Chromosome[];           /Conjunto de argumentos de função otimizados - genes

Chromosome[] é exatamente o que o comentário diz.

O primeiro índice [0] é o valor de aptidão do indivíduo. Os outros são parâmetros otimizados em um determinado intervalo. Esse é o genótipo.

Trabalhe com o fenótipo (stop losses, take profits, volumes, indicadores ou qualquer outra coisa) em FF (escala de parâmetros otimizados no intervalo dos genes do cromossomo):

Por exemplo, os genes são definidos no intervalo [-1;1], então

Índice 0: valor FF <---------------------------------------------------------[8;8]//pivô para Pi/2 oitos.

1º índice: Stop loss [10..500] <------------------------------------------------ [-1;1]

2º índice: Take profit [10..500] <--------------------------------------------- [-1;1]

3º índice: Volume mínimo do lote [0,1...1,0] <--------------------------------------- [-1;1]

4º índice: Sinalizador de trailing (para usar trailing ou não)[0..1] <------ [-1;1]

Além disso, a matriz Chromosome[] tem 5 células. Por exemplo, um cromossomo pode ter a seguinte aparência {0.2, 0.3, -0.8, 0.1, 0.9;}

 
Mas, nesse caso, o processamento da correção dos valores de genes não reais terá de ser feito no FF. Ou seja, se otimizarmos os tipos long, double e bool, o UGA gerará valores reais para todos eles, inclusive para bool, haverá muitas variações de genes no intervalo de RangeMinimum a RangeMaximum, com o uso real possível de apenas dois valores 1 e 0. E a seleção dos valores corretos já será feita no FF?
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
mi__x__an:
Mas, nesse caso, o processamento da correção dos valores de genes não reais terá de ser feito no FF. Ou seja, se otimizarmos os tipos long, double e bool, o UGA gerará valores reais para todos eles, inclusive para o bool, haverá muitas variações de genes no intervalo de RangeMinimum a RangeMaximum, com o uso real possível de apenas dois valores 1 e 0. Entendi corretamente? E a seleção dos valores corretos já será feita no FF?
Correto, se isso não for adequado, você deve usar um algoritmo genético binário (como o implementado no testador). Há um artigo sobre isso no quarto fórum.
 

Então, a melhor maneira de se livrar dessa desvantagem, para mim, seria introduzir uma função de serviço que corrige os valores dos genes do cromossomo para os que podem ser usados no FF.

-->geração de descendentes -->ajuste dos valores dos genes para valores realmente utilizáveis -->exclusão de clones -->chamada do FF.

Com esse curso de ação, você acha que isso terá um grande impacto no desempenho do UGA? Afinal, pela ideia, o número de execuções do FF deve ser reduzido se a etapa de otimização de um parâmetro for maior do que a do outro.

 
Urain:
Certo, se isso não for adequado, você deve usar um algoritmo genético binário (como o implementado no testador). Há um artigo sobre isso no quarto fórum.

Não, a questão é diferente. O algoritmo pode ser usado perfeitamente bem para esses casos também.

mi__x__an:

Mas, nesse caso, o processamento da correção dos valores, e não dos genes reais, terá de ser feito no FF. Ou seja, se otimizarmos os tipos long, double e bool, o UGA gerará valores reais para todos eles, inclusive para o bool, haverá muitas variações de genes no intervalo de RangeMinimum a RangeMaximum, com o uso real possível de apenas dois valores 1 e 0. E a seleção dos valores corretos já será feita no FF?

Todas as operações com o fenótipo devem ser feitas no FF. É uma questão de decodificação do genótipo para o fenótipo.

Ok, vamos supor que o parâmetro otimizado seja do tipo bool e que somente duas variantes sejam possíveis: true e false. Então, a decodificação será algo como isto:

if(gene<(RangeMaximum+RangeMinimum )/2.0)

p=false;

else

p=true;

onde gene é um gene específico de um cromossomo.

Acontece que, com toda a variedade de variantes possíveis desse gene (genótipo), obteremos apenas dois fenótipos. Esse também é o caso na natureza viva.

No entanto, isso tem uma consequência natural: serão geradas mais variantes de cromossomos (e, portanto, o FF será calculado mais vezes) do que o necessário para resolver o problema. Ou seja, a otimização será mais demorada. Já mencionei esse fato. Será a mesma coisa no caso de codificação binária de cromossomos. Você ainda terá que decodificar em um fenótipo específico da tarefa.

MAS. Tanto no caso de codificação binária quanto no caso de representação de genes por números reais, é muito fácil evitar cálculos de FF desnecessários (para reduzir o número de possíveis variantes de cromossomos) definindo os SEARCH STEPS AND STEP para cada PARÂMETRO OTIMIZADO. Ou seja, cortar antecipadamente as variantes desnecessárias do cromossomo (isso já é feito no otimizador padrão com codificação binária). Isso também pode ser feito para o AG do artigo, basta adicionar a funcionalidade apropriada a ele: a capacidade de definir os limites e a etapa para cada gene, ou seja, permitir que o AG trabalhe diretamente com o fenótipo.

 

mas a necessidade de especificar limites e etapas para cada gene na biblioteca reduzirá sua flexibilidade.

O que provavelmente não é a melhor ou mesmo a pior maneira que usei no otimizador de modelos de negociação:

1 - classe do parâmetro otimizado - herdeiro CObject

class COptimizatedParam: public CObject
{
public:
 string name; //имя оптимизируемого параметра, требуется для выполнения ФФ(в моем случае у меня модель полностью так и работает как работала, только с виртуальным аккаунтом)
 string type; //тип оптимизируемого параметра, требуется для см. выше
 string on;   //с какого значения начать выполнение -минимум
 string step; //шаг
 string end;  //максимум
 string value; //в моем случае инициализация модели происходит по тому же CList, который передан функции оптимизации  и value -текущее значение оптимизируемого параметра
 void   Init(string Name,string Type,string On,string Step,string End)
             {name=Name;type=Type;on=On;step=Step;end=End;}
};

2 - função virtual do modelo geral principal:

  virtual CList     *OptimizatedParams()

permite que cada modelo específico crie sua própria lista de parâmetros otimizados.

3. função de otimização - enumera recursivamente todos os valores necessários.

Todos os tipos enumerados podem ser manipulados pela função de otimização.

Agora a pergunta: seria racional criar a CList como dados de entrada, na qual as informações sobre o parâmetro otimizado são passadas por meio dessa classe do parâmetro otimizado, e a própria biblioteca UGA cria quantos limites e etapas forem necessários para cada gene. Isso lhe daria mais flexibilidade e reduziria o número de execuções desnecessárias de FF para criar clones não genéticos, mas fenotípicos.

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Виртуальные функции - Документация по MQL5