рефераты
Главная

Рефераты по рекламе

Рефераты по физике

Рефераты по философии

Рефераты по финансам

Рефераты по химии

Рефераты по хозяйственному праву

Рефераты по цифровым устройствам

Рефераты по экологическому праву

Рефераты по экономико-математическому моделированию

Рефераты по экономической географии

Рефераты по экономической теории

Рефераты по этике

Рефераты по юриспруденции

Рефераты по языковедению

Рефераты по юридическим наукам

Рефераты по истории

Рефераты по компьютерным наукам

Рефераты по медицинским наукам

Рефераты по финансовым наукам

Рефераты по управленческим наукам

Психология и педагогика

Промышленность производство

Биология и химия

Языкознание филология

Издательское дело и полиграфия

Рефераты по краеведению и этнографии

Рефераты по религии и мифологии

Рефераты по медицине

Рефераты по сексологии

Рефераты по информатике программированию

Краткое содержание произведений

Контрольная работа: Моделирование систем

Контрольная работа: Моделирование систем

Содержание

Задание 1

Задание 2

Задание 3

Задание 4

Задание 5

Задание 6

Список используемой литературы


Задание 1

Построить таблицу значений функции алгебры логики, найти все существенные переменные:       

Решение

Распишем данную функцию по действиям и для всех наборов значений 3 переменных, посчитаем их результаты:

xyz

x|z

x|y

x V y V z

(x|z)( x|y)

f

000 1 1 0 1 0
001 1 1 1 1 0
010 1 1 1 1 0
011 1 1 1 1 0
100 1 1 1 1 0
101 0 1 1 0 0
110 1 0 1 0 0
111 0 0 1 0 0

Функция тождественно принимает значение 0 при любых значениях переменных x,y,z. Поэтому в данной функции существенных переменных нет.

Задание 2

Построить полином Жегалкина функции:


Решение

Записываем таблицу значений функции

xyz f
000 0
001 1
010 1
011 0
100 0
101 0
110 1
111 0

Находим СДНФ функции по единицам:

СДНФ функции:

Полином Жегалкина:

Задание 3

Найти СКНФ и СДНФ функции:

Решение

Найдем с помощью таблицы значений:

xyz xy

f
000 0 1 0
001 0 0 1
010 0 1 0
011 0 0 1
100 0 1 0
101 0 0 1
110 1 1 1
111 1 0 0

Получим СДНФ (единицы функции) и СКНФ (нули функции):

СДНФ (единицы):       

СКНФ (нули):    

Задание 4

С помощью карт Карно найти минимальную КНФ и ДНФ функции:

Решение

Запишем карту Карно:

      zt 00 01 11 10
xy
00 1 1 0 0
01 1 0 0 0
11 1 0 0 1
10 0 0 1 0

Минимальные формы:

КНФ (покрытия по нулям):

ДНФ (покрытия по единицам):     

Задание 5

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

Решение

Таблица:

1 2 3 4 5
1 0 1 1 0 0
2 0 0 1 1 0
3 0 0 0 1 1
4 0 0 0 0 1
5 0 0 0 0 0

Пути из 1 в 4:

1.  1-3-4

2.  1-2-4

Задание 6

Придумать связный взвешенный граф из восьми вершин и не менее чем 14 ребер (нумерация ребер – слева направо, веса от 1 до 20). Для этого графа построить минимально островное дерево с помощью алгоритма Прима, и найти расстояние между вершинами 1 и 8 с помощью алгоритма Дейкстры. Реализовать алгоритм на любом языке программирования.

алгебра логика граф полином дейкстра

Решение


Текст программы для алгоритма Дейкстра

//---------------------------------------------------------------------------

#include <clx.h>

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

//Нахождение расстояния от источника до всех вершин в графе

//с неотрицательными весами (метод Дейкстры).

//Нахождение кратчайшего пути из S в T.

#include <iostream.h>

#define MaxNodes 14

#define B 1000  //Машинный эквивалент бесконечности.

//Описание типа узла стека.

typedef struct Zveno *svqz;

struct Zveno

{

  int Element;

  svqz Sled;

};

class Spisok

{

  private:

         int A[MaxNodes][MaxNodes];  //Матрица весов дуг.

         int D[MaxNodes]; //Матрица расстояний от источника до

                          //всех вершин графа.

          svqz Stack; //Указатель на рабочий стек.

         void UDALENIE (svqz *, int *);

         void W_S (svqz *, int);

         int Pusto_Q (int *);

  public:

          Spisok() {Stack = NULL;}

         void Vvod_Ves();

          void Reshenie ();

};

void main ()

{

  Spisok A;

  A.Vvod_Ves();

  A.Reshenie();

}

int Spisok::Pusto_Q (int *Q)

{

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

    if ( *(Q+i)!=0 ) return 0; //Ложь - не пусто!

  return 1; //Истина - пусто!

}

void Spisok::Reshenie ()

{

  int S; // Начальная вершина пути (источник).

  int T; // Конечная вершина пути.

  int u,v,Min;

  int i,j,k;

  svqz UkZv;

  int Q[MaxNodes];

  cout << "input source : ";

  cin >> S; S--;

  //Инициализация.

  for (i=0;i<MaxNodes;i++) { D[i] = A[S][i]; Q[i] = 0; }

  D[S] = 0;

  for (i=0;i<MaxNodes;i++)  Q[i] = 1;

  Q[S] = 0;

  //Вычисление матрицы расстояний от

  //источника до всех вершин графа.

  while (!Pusto_Q(&Q[0])) //Пока Q не пусто.

  {

    Min = B;

    for (i=0;i<MaxNodes;i++)

     if (Q[i]==1 && D[i]<Min) { Min = D[i]; u = i; }

    Q[u] = 0;

    for (i=0;i<MaxNodes;i++)

     if (Q[i] == 1)

       if ( D[i] > D[u]+A[u][i] ) D[i] = D[u] + A[u][i];

  }

  //Вывод матрицы расстояний от источника

  //до всех вершин графа.

  cout << "matrix of distanses: \n";

  for (i=0;i<MaxNodes;i++) cout << D[i] << " ";

  cout << endl;

  // -----------------------------------------------------

  // Нахождение кратчайшего пути из S в T с использованием

  //            построенной матрицы расстояний.

  // -----------------------------------------------------

  cout << "Inpute finish node: ";

  cin >> T; T--;

  W_S (&Stack,T); v = T;

  while ( v!=S )

  {

    for (i=0;i<MaxNodes;i++)

      if ( D[v]==D[i]+A[i][v] ) u = i;

    W_S (&Stack,u);

    v = u;

  }

  //Вывод кратчайшего пути на экран дисплея.

  cout << "Minimal path: ";

  UkZv = Stack;

  while ( UkZv != NULL )

  {  cout << (UkZv->Element+1) << " ";

     UkZv = UkZv->Sled;  }

  cout << endl;

}

void Spisok::Vvod_Ves()

//Ввод матрицы весов дуг заданного графа.

{

  cout << "Inppute the elements of edge matrix by strings:\n";

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

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

     {

       cout << "Inpute A[" << (i+1) << "," << (j+1) << "]: ";

       cin >> A[i][j];

       if ( A[i][j]==0 ) A[i][j] = B;

     }

}

void Spisok::W_S (svqz *stk, int Elem)

//Помещение Elem в стек stk.

{

  svqz q=new (Zveno);

  (*q).Element = Elem;

  (*q).Sled = *stk; *stk = q;

}

void Spisok::UDALENIE (svqz *stk, int *Klad)

//Удаление звена из стека, заданного указателем *stk.

//Значение информационного поля удаляемого звена сохраня-

//ется в параметре Klad.

{

  svqz q;

  if (*stk==NULL) cout<<"try to select from the empty stack!\n";

  else

         { *Klad = (**stk).Element;

           q = *stk; *stk = (**stk).Sled; delete q; }

}

Алгоритм Прима:

//---------------------------------------------------------------------------


#include <clx.h>

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

#include <iostream.h>

#define TRUE 1

#define FALSE 0

typedef int Boolean;

typedef unsigned int SubInt;

typedef struct Uzel *Ref;

struct Uzel

{

  SubInt X; //Начало дуги.

  SubInt Y; //Конец дуги

  int Pay;  //Стоимость дуги.

  Ref Left; //Указатель на левого сына.

  Ref Right;//Указатель на правого сына.

};

typedef struct zveno *svqz;

struct zveno

{

  unsigned int Element[256];

  svqz Sled;

  zveno();

};


zveno::zveno()

{

  for(int k=0;k<256;Element[k++]=0);

}

class Spisok

{

  private:

          Ref Root;

          void Search (int, int, int, Ref *);

          void Poisk (svqz, SubInt, svqz *);

          void Postroenie (svqz *);

          void Udalenie (svqz *, svqz);

  public:

          Spisok() { Root = NULL;} //Вначале дерево пусто.

          void Reshenie();

          void Postr();

};

void Spisok::Search (int A, int B, int C, Ref *p)

//Добавление вершины, содержащей поля A,B,C, в дерево *p.

{

  if ( (*p) == NULL )

  {

           (*p) = new (Uzel); (**p).X = A; (**p).Y = B; (**p).Pay = C;

           (**p).Left = (**p).Right = NULL;

  }

  else

           if ( C<=(**p).Pay ) Search (A,B,C,&((**p).Left));

           else

                    if ( C>(**p).Pay ) Search (A,B,C,&((**p).Right));

}

void Spisok::Postroenie (svqz *UkStr)

//Постpоение линейного однонапpавленного списка

//с заглавным звеном, содержащего вершины графа.

{

  svqz UkZv;

  int el;

  (*UkStr) = new (zveno);

  UkZv = (*UkStr); UkZv->Sled = NULL;

  cout << "Input nodes: \n";

  cin >> el;

  while ( el!=0 )

  {

          UkZv->Sled = new (zveno); UkZv = UkZv->Sled;

          UkZv->Element[el] = 1; UkZv->Sled = NULL;

          cin >> el;

  }

}

void Spisok::Postr()

//Постpоение деpева, содержащего все ребра графа.

{

  int A,B,C;

  cout << "For every nodes input input start and finish\n";

  cout << "node and cost of edge:\n";

  cin >> A >> B >> C;

  while ( A!=0 )

  { Search (A,B,C,&Root);

          cin >> A >> B >> C;

  }

}

void Spisok::Poisk (svqz st, SubInt MENT, svqz *Res)

{

  svqz q;

  (*Res) = NULL; q = st->Sled;

  while  ( q != NULL  &&  (*Res) == NULL )

  {

          if ( q->Element[MENT]==1 ) (*Res) = q;

          else  q = q->Sled;

  }

}

void Spisok::Udalenie (svqz *zv, svqz UkStr)

//Удаление из однонапpавленного списка с заглавным звеном

//элемента, на который указывает указатель zv.

{

         svqz Z;     //"Стаpый" указатель.

         svqz UkZv1; //"Hовый" указатель.

         if ( (*zv)->Sled != NULL ) (**zv) = *((**zv).Sled);

         else

         {  Z = UkStr; UkZv1 = UkStr->Sled;

                   while  (UkZv1 != (*zv))

                   { Z = UkZv1; UkZv1 = UkZv1->Sled; }

                   Z->Sled = NULL; delete UkZv1;

         }

}

void Spisok::Reshenie()

{

  svqz UkStr;  //Указатель на список.

  Ref UkUzel;  //Рабочий указатель на узел дерева.

  Ref UkUzel1; //Рабочий указатель на узел дерева.

  SubInt T1,T2;

  svqz Res1,Res2;

  //Построение первоначальных множеств вершин графа.

  Postroenie (&UkStr);

  cout <<"Edges with minimsl cost: ";

  while ( UkStr->Sled->Sled != NULL )

  {

          UkUzel1 = Root;       //"Отстающий" указатель.

          UkUzel  = Root->Left; //"Опережающий" указатель.

          if ( UkUzel== NULL )

          { //Выбор в дереве ребра наименьшей стоимости и ...

                   T1 = Root->X; T2 = Root->Y;

                   //... удаление этого ребра из дерева.

                   Root = Root->Right; delete UkUzel1;

          }

          else

          { //Выбор в дереве ребра наименьшей стоимости и ...

                   while ( UkUzel->Left != NULL )

                   {

                     UkUzel1 = UkUzel1->Left;

                     UkUzel  = UkUzel->Left;

                   }

                   T1 = UkUzel->X; T2 = UkUzel->Y;

                   //... удаление этого ребра из дерева.

                   UkUzel1->Left = UkUzel->Right;

                   delete UkUzel;

          }

          //Если v и w принадлежат различным

          //множествам W1 и W2 из VS ...

          Res1 = Res2 = NULL;

          Poisk (UkStr,T1,&Res1);

          Poisk (UkStr,T2,&Res2);

          if ( Res1!=Res2 )

          

           for (int k=0;k<256;k++)

  }

}

void main ()

{

  Spisok Tree;

  Tree.Postr();

  Tree.Reshenie();

}


Список используемой литературы

 

1.  Нефедов В.Н., Осипова В.А. Курс дискретной математики / МАИ. М., 1992.

2.  Кристофидес Н. Теория графов. Алгоритмический подход. М.: Мир, 1978.

3.  Уилсон Р. Введение в теорию графов. М.: Мир, 1977.

4.  Берзтисс А.Т.Структуры данных.1974


© 2012 Рефераты, курсовые и дипломные работы.