Генерация всех разбиений множества



МИНОБРНАУКИ РОССИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования "Московский государственный технический университет радиотехники, электроники и автоматики"

МГТУ МИРЭА

 

Факультет Информационных технологий

 

(наименование кафедры)

Утверждаю

Заведующий

кафедрой ______________________

« » _____________ 2012г.

ЗАДАНИЕ

На выполнение курсовой работы

По дисциплине «Дискретная математика»

 

СтудентПолинко Сергей ДмитриевичГруппа ИВБ-3-11

 

1.Тема«Курсовая работа по дискретной математике за I курс»

2. Исходные данные:

 

3. Перечень вопросов, подлежащих разработке, и обязательного графического материала:

1, 2, 3, 4, 5 задания сопровождаются обязательным графическим материалом.

 

 

4. Срок представления к защите курсовой работы: до «»________2012г.

Задание на курсовую работу выдал «» _________2012г.Подпись руководителя

 

Антик М.И.

Задание на курсовую работу получил «» _________2012г.Подпись исполнителя

 

Полинко С.Д.

 

№1. Выяснить взаимное расположение множеств D,E,F, если A,B,C–произвольные подмножества U. Указать расположение множеств на карте Карно. Для каждого множества написать минимальную дизьюнктивную формулу. 

D: BΔC+( A* ( C \ B ) )

 

E: B+C

 

F: ( B* C ) + ( ( A \ C ) \ B )

 

   B Δ C                    ( A* ( C \ B ) )

 

B Δ C +( A * ( C \ B ) )

 

 

 B                               C

 

B + C

 

 B * C                   ( A \ C ) \ B

 

 

B * C + ( A \ C ) \ B

 

 

FDE

 

Минимизированные:

D: ( B \ C ) * ( ( C \ B ) \ A)

 

E: B+C

 

F: ( B * C ) + ( A * B * C )

 

 

№2. Проверить, что для любых множеств A,B,Cвыполнение включенияαвлечет выполнение включенияβ.

 

α : B \ CA

β : B C +( B * A )

α : ( b * c )+ a = b +1 c +2 a

β : b +5 c +4( b *3 a )

 

 

a b c 1 2 3 4 5 α β
0 0 0 1 1 0 0 1 1 1
0 0 1 1 1 0 1 1 1 1
0 1 0 0 0 0 0 0 0 0
0 1 1 1 1 0 1 1 1 1
1 0 0 1 1 0 0 1 1 1
1 1 0 0 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1

 

α< = >β

 

№3. Для произвольных множеств A,B,H проверить, является ли выполнение включения α необходимым и достаточным условием выполнения равенстваβ.

 

 

A + B α H                   H \ A =β( AΔ H ) + ( B \ A )

 

α: a + b + h               β: ( h * a ) = ( ( h * a ) + ( b * a ) ) + ( b * a )

( a *1 b ) +2 h                ( h *3 a ) =9 ( ( h *4 a ) +6 ( a *5 b ) ) +8 ( b *7 a )

 

 

a b h 1 2 3 4 5 6 7 8 9 α β
0 0 0 1 1 0 0 1 1 0 1 0 1 0
0 0 1 1 1 1 1 1 1 0 1 1 1 1
0 1 0 0 0 0 0 0 0 1 1 0 0 0
0 1 1 0 1 1 1 0 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 1 0 1 0 0 0 0 0 0 0 1 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 0 1 0 0 0 0 0 0 0 1 0

 

β ->α, является.

 

№4. Выяснить, верно ли равенство α для произвольныхA, B, C.

 

 

α: B * ( A \ C ) = ( B * ( A + C ) ) * ( B * C )

 

α : b *2( a *1 c ) = ( b *4 ( a +3 c ) ) *6 ( b *5 c )

 

 

a b c 1 2 3 4 5 6 2 6
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0
0 1 1 0 0 1 1 1 1 0 1
1 0 0 1 0 1 0 0 0 0 0
1 0 1 0 0 1 0 0 0 0 0
1 1 0 1 1 1 1 0 0 1 0
1 1 1 0 0 1 1 1 1 0 1

 

 

2 <> 6 => для произвольныхA,B иCравенство α не верно

 

 

Террористический акт
Кол-во пострадавших
Место терр. акта
Ф.И.О. террористов
Код уголовного дела*к2

№5. Террористы и террористические акты

Террорист
Ф.И.О.*к1
Возраст
Происхождение

 

Генерация подмножеств для заданного множества.

 

//Генерация подмножеств заданного множества

//сограниченным числом элементов

#include<iostream>

usingstd::cin;

usingstd::cout;

 

intmain()

{

           //Ввод размера множества

           int n;

           cin>> n;

           if(n<=0)

                          return 0;

 

           //Ввод предела размера подмножества

           intsize;

           cin>> size;

           if(size<=0 || size>n)

                          return 0;

 

           //Созданиеивводмножества

           int *A = new int[n];

           for(int l=0;l<n;l++)

                          cin>> A[l];

 

           //Создание массива для кода Грея

           short *B = new short[n];

           for(int l=0;l<n;l++)

                          B[l]=0;

 

           //Генерация всех подмножеств

           int i=0,p,j,count;

           do

           {

                          //Подсчет количества элементов в подмножестве

                          count=0;

                          for(int l=0;l<n;l++)

                                          if(B[l]==1)

                                                          count++;

                          //Вывод подмножества, если количество его элементов равно size

                          if(count==size)

                          {

                                          for(int l=0;l<n;l++)

                                          {

                                                          if(B[l]==1)

                                                                         cout<< A[l] << ' ';

                                          }

                                          cout<< '\n';

                          }

                          //Генерация следующего кода Грея

                          i++;

                          p=0;

                          j=i;

                          while (j%2==0)

                          {

                                          j=j/2;

                                          p++;

                          }

                          if(p<n)

                                          B[p]=1-B[p];

           }

           while (p<n);

           delete[] B;

           delete[] A;

 

           return 0;

}

 

Генерация всех разбиений множества

 

//Генерация всех разбиений множества

#include<iostream>

usingstd::cin;

usingstd::cout;

 

//Вывод разбиения на экран

//a - исходное множество

//b - разбиение

voidPrintPartition(int size, int *a, int* b)

{

           //Проверка на существование массивов

           if(a==NULL || b==NULL)

                          return;

           //Вычисляем количество подмножеств в данном разбиении

           int blocks=1;

           for(inti=0;i<size;i++)

                          if(b[i]>blocks)

                                          blocks=b[i];

           //Выводим каждое подмножество

           for(int i=0;i<blocks;i++)

           {

                          for(int j=0;j<size;j++)

                                          if(b[j]==i+1)

                                                          cout<< a[j] << ' ';

                          if(i!=blocks-1)

                                          cout<< "| ";

           }

           cout<< '\n';

}

 

//Помещает в элемент массива b с номером pos элементы от 1 до max

//и для каждого значения вызывает сама себя для следующей позиции массива

//а - исходное множество

//size - размер множества

void Partition(intpos, int max, int size, int *a, int *b)

{

           //Проверка на существование массивов

           if(a==NULL || b==NULL)

                          return;

           //Если достигнут конец массива, то вывести разбиение

           if(pos>=size)

           {

                          PrintPartition(size,a,b);

                          return;

           }

           //Цикл по всем возможным вариантам для данной позиции массива

           for(inti=0;i<max;i++)

           {

                          b[pos]=i+1;

                          //Переход к следующей позиции массива

                          //При этом, если данная позиция достигла максимума, то максимум следующей увеличивается на 1

                          if(i+1==max)

                                          Partition(pos+1,max+1,size,a,b);

                          else

                                          Partition(pos+1,max,size,a,b);

           }

}

 

intmain()

{

           //Ввод размера множества

           int n;

           cin>> n;

           if(n<=0)

                          return 0;

           //Вводмножества

           int *A = new int[n];

           for(inti=0;i<n;i++)

                          cin>> A[i];

           cout<< '\n';

 

           int *B = new int[n];

 

           //Генерация разбиений

           //Начальное значение: нулевой элемент массива, максимальный индекс - 1

           Partition(0,1,n,A,B);

 

           delete[] A;

           delete[] B;

 

           return 0;

}


Дата добавления: 2018-04-05; просмотров: 864; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!