Home

Death is my deliverance from this damnation called life

Свежие записи
Name
thy_doom

Реклама

Январь, 20, 2007

Иллюстрацией метода. будет N-Queens Problem


The eight queens puzzle is the problem of putting eight chess queens on an 8×8 chessboard such that none of them is able to capture any other using the standard chess queen's moves. The colour of the queens is meaningless in this puzzle, and any queen is assumed to be able to attack any other. Thus, a solution requires that no two queens share the same row, column, or diagonal. The eight queens puzzle is an example of the more general n queens puzzle of placing n queens on an n×n chessboard.

В каждой колонке может располагаться лишь 1 фигура. Это облегчает задачу и существенно облегчает кодировку данных. Положение королев определяет одномерный массив размера n, каждый элемент которого может принимать значения от 1 до n. При этом все значения элементов массива уникальны, то есть сам массив размером n содержит n-1 натуральных чисел и 0 (так как код в сишарп, а первый элемент массива в языках семейства си имеет нулевой индекс).

memberType - класс представляющий положение королев на доске. Функция TweakSolution - та самая хрень, случайным образом расставляющая королев на доске.
class memberType
    {
        public int[] solution = new int[Program.MaxLength];
        public float energy;
       
        // Меняем положение коней из двух случаных столбцов местами.     
        public void TweakSolution()
        {
            int temp, x, y;
            Random rnd = new Random();

            x = rnd.Next(Program.MaxLength);

            do
            {
                y = rnd.Next(Program.MaxLength);
            }
            while (x == y);

            temp = this.solution[x];
            this.solution[x] = solution[y];
            this.solution[y] = temp;
        }
Конструктор заполняет главную диагональ, а затем случайным образом перемешивает королев.
       public memberType()
        {
            for (int i = 0; i < Program.MaxLength; i++)
            {
                solution[i] = i;
            }

            for (int i = 0; i < Program.MaxLength; i++)
            {
                TweakSolution();
            }
        }
Дальше - больше :D. Энергия решения считается как количество конфликтов между королевами.
        public void ComputeEnergy()
        {
            int i, j, x, y, tempx, tempy, conflicts;
            char [,]board = new char[Program.MaxLength,Program.MaxLength];

            int[] dx = { -1, 1, -1, 1 };
            int[] dy = { -1, 1, 1, -1 };

            for (i = 0; i < Program.MaxLength; i++)
            {
                board[i,solution[i]] = 'Q';
            }

            conflicts = 0;

            for ( i = 0; i < Program.MaxLength; i++)
            {
                x = i;
                y = solution[i];

                for ( j = 0; j < 4; j++)
                {
                    tempx = x; tempy = y;
                    while (true)
                    {
                        tempx += dx[j];
                        tempy += dy[j];
                        if ((tempx < 0) || (tempx >= Program.MaxLength) || (tempy < 0) || (tempy >= Program.MaxLength))
                            break;
                        if (board[tempx,tempy] == 'Q') conflicts++;
                    }
                }

            }
            energy = (float)conflicts;
        }
И последняя функция в классе решения просто выводит на экран оное.
        public void emit()
        {
            int MaxLength = Program.MaxLength;
            char[,] board = new char[MaxLength, MaxLength];
            int x, y;

            for (x = 0; x < MaxLength; x++)
            {
                board[x, this.solution[x]] = 'Q';
            }

            for (y = 0; y < MaxLength; y++)
            {
                for (x = 0; x < MaxLength; x++)
                {
                    if (board[x, y] != 'Q')
                        Console.Write(". ");
                    else
                        Console.Write("Q ");
                }
                Console.Write('\n');
            }
            Console.Write('\n');
        }

    }
Теперь кульминация балета :D.
    class Program
    {
        public static int MaxLength = 20; \\ размер доски
        public static float InitialTemperature = 30.0f; \\ начальная температура
        public static float FinalTemperature = 0.5f; \\ конечная температура
        public static float Alpha = 0.99f; \\ во сколько раз уменьшается температура
        public static int StepsPerChange = 100; \\ число итераций для каждого значения температуры
    

        static void Main(string[] args)
        {
            int timer = 0, step, solution = 0, useNew, accepted;
            float temperature = InitialTemperature;
            memberType current, working, best;

            StreamWriter Strw = new StreamWriter("strw");
            Random rnd = new Random();

            current = new memberType();
            current.ComputeEnergy();
            best = new memberType();

            best.energy = 100.0f;

            working = current;
До тех пор пока температура больше конечной выполняется алгоритм Metropolis Monte Carlo.
  • Если рабочее решение лучше данного (то есть энергия рабочего меньше) то он становится данным.
  • Если же нет, то вычисляется вероятность принятия решения. Вероятность сравнивается со случайной величиной, меньше единицы, и если вероятность принятия рабочего решения больше случайной величины, то рабочее решение копируется в данное. В обратном случае соответсвенно данное копируется в рабочее.
С каждым шагом главного цикла температура уменьшается по закону
T=Alpha*T
И в файл выводятся значения температуры, энергий и шага итерации.
            while (temperature > FinalTemperature)
            {
                Console.WriteLine("Temperature: " + temperature);

                accepted = 0;

                for (step = 0; step < StepsPerChange; step++)
                {
                    useNew = 0;
                    working.TweakSolution();
                    working.ComputeEnergy();

                    if (working.energy <= current.energy)
                    {
                        useNew = 1;
                    }
                    else
                    {
                        float test = (float)rnd.NextDouble();
                        float delta = working.energy - current.energy;
                        float calc = (float)Math.Exp(-delta / temperature);

                        if (calc > test)
                        {
                            accepted++;
                            useNew = 1;
                        }
                    }

                    if (useNew == 1)
                    {
                        useNew = 0;
                        current = working;

                        if (current.energy < best.energy)
                        {
                            best = current;
                            solution = 1;

                        }
                        else
                        {
                            working = current;
                        }
                    }
                }
                Strw.WriteLine("timer:" + timer++ + " Temperature:" + temperature +
                    " Best Energy: " + best.energy + " Accepted: " + accepted);

                temperature *= Alpha;
            }
В конце на экран выводится лучшее решение.
            Strw.Close();
            if (solution == 1)
                best.emit();

            return;
        }
    }
}
Метки: , ,

Январь, 13, 2007

Сейчас я открываю для себя новое направление в IT: слабый искусственный интеллект. Искусственный интеллект условно делится на 2 ветви: сильный и слабый.

Сильный Искусственный Интеллект


Сильный ИИ ставит своей задачей научить машину думать подобно человеку. Эта ветвь наиболее романтичная и, увы, наиболее тупиковая. Я, к сожалению, не люблю читать не-техническую литературу, поэтому кроме 3х законов роботехники ничего не знаю :).

1. A robot may not injure a human being or, through inaction, allow a human being to come to harm.
2. A robot must obey orders given it by human beings except where such orders would conflict with the First Law.
3. A robot must protect its own existence as long as such protection does not conflict with the First or Second Law.

Роботы — это прекрасно. Да чего скрывать, в детсве я хотел стать роботом :), помните утиного робокопа на колёсике из мультика Чёрный Плащ? Так вот, это мой кумир ;).

 

Но моя непоколебимая вера в возможность существования машины наделённой сознанием была разрушена после прочтения книжки "Новый ум короля: о компьютерах, мышлении и законах физики" за авторством американского физика Роджера Пенроуза.
Монография известного физика и математика Роджера Пенроуза посвящена изучению проблемы искусственного интеллекта на основе всестороннего анализа достижений современных наук. Возможно ли моделирование разума? Чтобы найти ответ на этот вопрос, Пенроуз обсуждает широчайший круг явлений: алгоритмизацию математического мышления, машины Тьюринга, теорию сложности, теорему Геделя, телепортацию материи, парадоксы квантовой физики, энтропию, рождение Вселенной, черные дыры, строение мозга и многое другое. Монография известного физика и математика Роджера Пенроуза посвящена изучению проблемы искусственного интеллекта на основе всестороннего анализа достижений современных наук. Возможно ли моделирование разума? Чтобы найти ответ на этот вопрос, Пенроуз обсуждает широчайший круг явлений: алгоритмизацию математического мышления, машины Тьюринга, теорию сложности, теорему Геделя, телепортацию материи, парадоксы квантовой физики, энтропию, рождение Вселенной, черные дыры, строение мозга и многое другое.
Это одна из тех книг, которые я бы взял на Марс. Я преклоняюсь перед Пенроузом, он осветил огромный круг проблем в небольшой книге, изложив их простым языком. Эта черта присуща талантливым и гениальным людям: просто излагать сложные вещи. Суть-же книги в том, что разум - есть очень сложная штука, не понятно как он утроен и как он рабоатет. И уж точно ясно что алгоритмизировать его нельзя. Поэтому забудьте о разумных холодильниках и микроволновках. Со стиральными машинами-же ситуация замечательна: уже сегодня они умеют общаться с тётьками и дядьками из телевизора на человеческом языке. Жаль что готовить не умают, получились бы отличными жёнами %).

Слабый Искуственный Интеллект

Слабый ИИ - это разнообразыне методы, с первого взгляда имеющие некоторую разумность. Они не универсальны: каждый из них имеет свою облать применения. Будь то распознавание речи, поиск оптимального пути или система рейтингов с last.fm.

Лучший способ хорошо разобраться в проблеме: написать о ней статью :).

Simulated Annealing

Симуляция отжига, метод основанный на законах термодинамики. Отжиг - это процесс нагревания и контролируемом охлаждения вещества. Цель процесса - получение более стойкой кристаллической структуры, так как при неконтроллируемом охлаждении результат непредсказуем и неоптимален.

Метод заключается во "встряске", когда при высоких температурах в системе наблюдается высокая молекулярная активность. Цель - найти молекулу с минимальной энергией, но при выскоих темпреатурах таких молекул будет наблюдаться множество. Конечная цель прожига: уменьшая температуру найти единственную молекулу с минмиальной температурой.

Схематически алгоритм можно представить так:
Данное решение «» Рабочее решение » Лучшее решение
  1. Создаётся случайное решение, которое становится "Данное решение"
    Решение - просто некоторый объект с определёнными полями.
  2. Обращаемся к "Данному решению", вычисляем его энергию.
  3. "Данное решение" копируется в "Рабочее решение" и случайным образом модифицируется.
  4. Теперь у нас 2 решения: "Рабочее" и "Данное". У каждого есть энергия или сила решения. Чем меньше энергия, тем лучше решение. В идеале энергия решения должна стремиться к нулю.

    Если у "Рабочего" решения температура меньше, то оно копируется в "Данное".

    Если же нет, то вычисляется вероятность принятия решения, чтобы узнать что делать с "Рабочим решением". Вероятность определяется по формуле:
    P(beta*E)=exp(-beta*E/T)
    При высоких температурах плохие решения принимаются чаще, чем отклоняются. При уменьшении температуры, уменьшается вероятность принятия плохих решений.


    По оси z - вероятность принятия решения, x - энергия, y - температура.

После некоторого числа повторений температура уменьшается на небольшую велечину по какому-то закону (линейно, логарифмически, и т.д.).

Вся эта хрень повторяется пока температура не достигнет нуля.

Конец первой серии :).

Метки: , ,
Разработано LiveJournal.com