Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Генетические алгоритмы.


Автор: compaq 4.3.2007, 17:29
Всем привет. 
В общем есть такая проблемка сейчас пишу прогу по генетическим алгоритмам.
Нужно преобразовать двоичное число в код грея и из кода грея обратно в двоичный код.
У меня есть вот такие функции. 

Код

        static void Main(string[] args)
        {
            gray2bin(Convert.ToInt32("1010", 2));
            BinGray(Convert.ToByte("1100", 2));
            Console.ReadLine();
        }
        static void BinGray(int v)
        {
            int sum = (int)(v ^ (v >> 1));
            Console.WriteLine(Convert.ToString(sum, 2));
        }
        static void gray2bin(int v)
        {
            int sum = v;
            while (v > 0) { v >>= 1; sum ^= v; };
            Console.WriteLine(Convert.ToString(sum, 2));
        }

Всё бы хорошо, но я хочу добавить эти значения в ArrayList но так как значения в инте то они преобразуются в 10 систему. Но я хочу хранить в массиве значения в 2 системе. Как это можно реализовать.

Автор: Idsa 4.3.2007, 17:38
Какие именно значения ты хочешь хранить? И приведи пример, что именно не так работает.

Автор: -Mikle- 4.3.2007, 18:06
Цитата(compaq @  4.3.2007,  20:29 Найти цитируемый пост)
но так как значения в инте то они преобразуются в 10 систему

ничего никуда при сохранении в ArrayList не преобразуется. Если int, то он и остается в ArrayList как int. 

В чем вопрос то?

Код

ArrayList list=new ArrayList();
int num = 999;
list.Add(num);

// и обратно
num = (int)list[0 /* 1, 2, 3, ...n */ ];


А если тебе надо иметь удобное витовое представление int, то пользуй System.Collections.BitArray класс. Этот класс дает удобное представление числа (или массива байтов) в виде битов и работы с ними (битами).

Код

    int num = 99999;
    System.Collections.BitArray bits = new System.Collections.BitArray(num);
    bits.Set(0, true); // установить нулевой бит в единицу


Что еще нужно?

Автор: compaq 4.3.2007, 19:04
Извиняюсь не совсем корректно выразился. Я вот что имел в виду. Когда функция передает и возврашяет число она делает это в десятичной системе а мне нужно что бы она делал это в двоичной. 
Код

        static byte BinGray(byte v)
        {
            return (byte)(v ^ (v >> 1));
        }

        static void Main(string[] args)
        {
            ArrayList Popylation = new ArrayList();
            Popylation.Add(BinGray(Convert.ToByte("1100", 2)));
        }

 Или вернее мне в идеале вот что нужно. Есть двумерный массив к примеру пусть называется популяция. И мне нужно что бы он выгладил вот  так.   Популяция[Номер хромосомы][номер гена]. То есть я мог бы сделать что то типа этого.

Код

    public class Crossingover
    {
        int OnePoint()// Оператор одноточечьного кросинговера
        {
            do
            {
                NumberOne = random;//Выбираю случайным образом первую хромасому
                NumberTwo = random;//Выбираю случайным образом вторую хромасому
            } 
            while (NumberOne == NumberTwo);//Если они равны повторяю цыкл
            Point = random;//Генерю точку разрыва

            for (int intIndex = 0; intIndex >= size; intIndex++)//перебираю все гены
            {
                if (intIndex < Point)//Если не дошол до точки разрыва копирую так
                {
                    arrMassivResult[0][intIndex] = arrMassiv[NumberOne][intIndex];
                    arrMassivResult[1][intIndex] = arrMassiv[NumberTwo][intIndex];
                }
                if (intIndex >= Point)//Если дошол то так
                {
                    arrMassivResult[0][intIndex] = arrMassiv[NumberTwo][intIndex];
                    arrMassivResult[1][intIndex] = arrMassiv[NumberOne][intIndex];
                }
            }
        }
 }

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

Добавлено @ 19:06 
Кстати я знаю, что во втором куске куча ошибок не совместимых с жизнью, это так набросок просто. smile 

Автор: Idsa 4.3.2007, 19:34
Понимаешь, числа хранятся ни в десятичной, ни в восьмеричной... ни в даже шестнадцатеричной smile системе счисления. Хранятся просто биты. Систему счисления биты "приобретают", когда их выводят.
Т. о., каким образом биты, например, выводятся на экран, зависит только от того, как эти биты интерпретировала, например, функция вывода.

Вот сравни, например:
Код

Console.WriteLine(String.Format("{0:x}", 100));
Console.WriteLine(String.Format("{0:d}", 100));

Т. е. тебе нужно вычислять определенные значения, сохранять их в ArrayList, не парясь. А вот вывод этих чисел тебе нужно сделать с умом. Для этого можешь, например, заюзать BitArray, как посоветовал -Mikle-.

Автор: 0000 9.3.2007, 15:57
погодь, я вечером домой приду - у меня есть проги по генетическим алгоритмам, еще на 3 курсе в универе делал - там скину кусок кода, а сейчас и не помню толком

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)