Методы фабрики нужно рассмотреть как альтернативу конструкторам - главным образом, когда конструкторы не достаточно выразительны, т.е.
class Foo{
public Foo(bool withBar);
}
не так выразительно как:
class Foo{
public static Foo withBar();
public static Foo withoutBar();
}
классы Фабрики полезны при необходимости в сложном процессе для построения объекта когда конструкция нуждается в зависимости, которую Вы не хотите для фактического класса, когда необходимо создать различные объекты и т.д.
Идея состоит в том, что фильтр должен быть достаточно широким, чтобы представлять функцию Гаусса. Эмпирическое правило - использовать размер фильтра не менее 6 * сигма
.
Так как поддержка должна быть сосредоточена вокруг нуля, это даст вам диапазон -3 * сигма [ От 1119014] до
+ 3 * сигма
(чтобы быть более точным, это - / + round (6 * sigma - 1) / 2
для учета нуля в середине). Отсюда:
function gaussFilter = gauss(sigma)
width = round((6*sigma - 1)/2);
support = (-width:width);
gaussFilter = exp( -(support).^2 ./ (2*sigma^2) );
gaussFilter = gaussFilter/ sum(gaussFilter);
Пример : (все следующие эквивалентны)
sigma = 1.2;
width = round((6*sigma - 1)/2);
gauss(sigma)
normpdf( -width:width, 0, sigma )
fspecial('gaussian', [1 2*width+1], sigma)
h = gausswin(2*width+1)';
h = h / sum(h)
Отличная головоломка!
Я вижу, что большинство людей запоминают положение каждой части. Как насчет того, чтобы применить более простой подход и сохранить содержимое каждого квадрата ? Это обеспечивает автоматическое продвижение и захваченные фрагменты.
И это позволяет использовать кодирование Хаффмана . Фактически, начальная частота фигур на доске почти идеальна для этого: половина квадратов пусты, половина оставшихся квадратов - пешки и т. Д.
Учитывая частоту каждой фигуры, я построил Хаффмана дерево на бумаге, которое я здесь повторять не буду. Результат, где c
обозначает цвет (белый = 0, черный = 1):
для всей доски в исходной ситуации у нас
Всего: 164 бита для начального состояния платы. Значительно меньше, чем 235 бит ответа, получившего наибольшее количество голосов. И он будет только уменьшаться по мере развития игры (кроме случаев повышения).
Я смотрел только на положение фигур на доске; дополнительное состояние (чей ход, кто рокировался, на проходе, повторяющиеся ходы и т. д.) нужно будет кодировать отдельно. Может быть, еще 16 бит самое большее, Возможные оптимизации:
c
, которые затем могут быть выводится из квадрата, на котором находится слон. (Пешки, получившие звание слонов, нарушают эту схему ...) [-3*sigma -2*sigma -1*sigma 0 1*sigma 2*sigma 3*sigma]
И если вы возведете в квадрат каждый элемент поддержки и умножите на -1, -support. ^ 2
[-9*sigma^2 -4*sigma^2 -1*sigma^2 0 -1*sigma^2 -4*sigma^2 -9*sigma^2]
Таким образом, разделив его на 2 * sigma ^ 2
, всегда будет один и тот же вектор ,
[-9/2 -4/2 -1/2 0 -1/2 -4/2 -9/2]
Или
-4.5000 -2.0000 -0.5000 0 -0.5000 -2.0000 -4.5000
Итак, , поэтому вы всегда получаете один и тот же ответ.
Итак, вам нужно проверить свой алгоритм на создание одномерного гауссовского фильтра.
РЕДАКТИРОВАТЬ:
Ваш исходный код в порядке: кроме Я не понимаю, почему вы сделали поддержку
с -3 * sigma: sigma: 3 * sigma
- вы должны изменить его на support = -3: 3
.
Вы также можете использовать:
gaussFilter = fspecial('gaussian',[1 7],sigma)
EDIT: Ознакомьтесь с решением Amro для получения полного кода и объяснения, почему support = -3 * sigma: 3 * sigma
, а не support = -3 * sigma: sigma: 3 * sigma