Example #1
0
        private void StartSearchLoop()
        {
            var cancellationToken = _cancellationTokenSource.Token;
            var handlesToWait     = new[] { cancellationToken.WaitHandle, _runSearchLoop };

            void SearchLoop()
            {
                if (IsRecurrent)
                {
                    ReproductionParameters.WeightMutations.OverallRouletteWheelShare = 75f;
                    ReproductionParameters.AddConnectionRouletteWheelShare           = 16f;
                }

                while (true)
                {
                    var searchModel = new XorNetworkSearch(
                        PopulationParameters,
                        IsRecurrent ? RecurrentNetworkParameters : FeedForwardNetworkParameters,
                        ReproductionParameters);

                    SearchResult searchResult = default;
                    InvokeOnUiThread(HandleStartNewSearchRun);
                    for (var generation = 0; generation < GenerationsCount; ++generation)
                    {
                        WaitHandle.WaitAny(handlesToWait);
                        if (cancellationToken.IsCancellationRequested)
                        {
                            return;
                        }

                        var newSearchResult = searchModel.SearchNext();
                        InvokeOnUiThread(() => HandleNewPopulationFound(newSearchResult));
                        searchResult = newSearchResult;
                    }

                    InvokeOnUiThread(() => HandleFinishSearchRun());
                }
            }

            _searchThread = new Thread(SearchLoop);
            _searchThread.Start();
        }