Судоку как CSP - Эвристика значения

ОГЛАВЛЕНИЕ

Эвристика значения

Мы знаем, как выбрать ячейку, теперь нужно выбрать, которое  значение из вероятностей (домена) проверить первым. Это называется Эвристикой значения.

Эвристика лексикографического (словарного) порядка:

В начале эвристики значения мы снова выбираем первое значение.

char LexicographicOrderFirst(MyCell[,] branch, Pos variablePosition)
{
    return branch[variablePosition.ln, variablePosition.col].Value[0];
}

Эвристика наименьшего значения ограничения:

В этой эвристике выбирается значение, которое создает минимальную трудность для выбранных узлов ячеек. Например, если для нашей ячейки есть варианты 7 и 9, мы проверяем, в каком количестве узлов этой ячейки в домене появляется 7, и то же самое делаем для 9. Затем алгоритм выбирает число, которое меньше всего раз появляется в домене узлов ячейки.

char LeastConstraintValue(MyCell[,] branch, Pos variablePosition)
{
    int[] arr = new int[branch[variablePosition.ln, variablePosition.col].Value.Length];

    for (int i = 0; i < arr.Length; i++)
        arr[i] = 0;

    for (int i = 0; i < branch[variablePosition.ln, variablePosition.col].Value.Length; i++)

    for (int j = 0; j < branch[variablePosition.ln, variablePosition.col].Peers.Count; j++)
    {
        if (branch[branch[variablePosition.ln, variablePosition.col].Peers[j].ln,
                  branch[variablePosition.ln,
                         variablePosition.col].Peers[j].col].Value.Contains(
                  branch[variablePosition.ln, variablePosition.col].Value[i].ToString()))
            arr[i]++;
    }
    return branch[variablePosition.ln, variablePosition.col].Value[GetMinIndex(arr)];
}

Точки интереса

На этом все! Давайте посмотрим, как это работает:

 

Автор: Dotan Asselmann

Загрузить демо-пример - 181 KB

Загрузить исходный код - 207 KB