В LINQ версия моделируется алгоритм отжига


Я решил попробовать и реализовать (одна из версий) имитации отжига алгоритм, используя только для LINQ, просто чтобы увидеть, если я мог.

Я был бы очень рад, если кто-нибудь может увидеть какие-то способы улучшить его, или дать консультацию по любому крутые трюки для ведения такого рода вещи.

var result = (from res in Enumerable.Range(0, 1)
                  let R = new Random()
                  let initial = Enumerable.Range(0, 10).Select(i => R.Next(-10, 10))
                  let iterations = Enumerable.Range(0, 100)

                  let Schedule = (Func<int, float>)
                                 (X => 4 + (float)Math.Sin(X))


                  from iteration in iterations
                      let temperature = Schedule(iteration)
                      let state = Enumerable.Range(0, 10).Select(i => R.Next(-10, 10))
                      let DeltaE = state.Sum() - initial.Sum()

                      where DeltaE > 0 ||
                            Math.Pow(Math.E, DeltaE / temperature) > R.NextDouble()
                      select state.ToList()
              ).OrderBy(S => S.Sum()).First();


899
7
задан 29 октября 2011 в 03:10 Источник Поделиться
Комментарии
1 ответ

У вас есть много мелких ошибок.


  • Какова цель из ВИЭ в Перечислимым.Диапазон(0, 1)? Похоже, ты сделал это, чтобы заставить некоторые локальные переменные в 'давай' запросы, что не имеет никакого смысла для меня.

  • Вместо того, чтобы использовать Заказпо(х).Во-первых() , вы должны использовать сайт minby(х) (написать его самостоятельно, если он не существует). Есть существенная разница в производительности.

  • Значение начальной меняется каждый раз, когда он перечислен. Запутанным. (Вы можете кэшировать результаты с методом toArray или toList указывают , чтобы предотвратить повторное перечисление от более случайных.Следующие звонки)

  • Обеспечить новый случайный() выполняется только один раз (сделать это за запрос). Начальное значение по умолчанию-это текущее время, которая сильно коррелирует между вызовами. Вы, вероятно, будете в конечном итоге с двумя экземплярами случайный с точно таким же семенем.

  • Случайные.Следующий(-10, 10) возвращает значения [-10, +9]. Вы, наверное, хотели [-10, +10].

6
ответ дан 1 ноября 2011 в 04:11 Источник Поделиться