Смекни!
smekni.com

Моделирование систем (стр. 1 из 2)

Содержание

Задание 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: &bsol;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:&bsol;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!&bsol;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: &bsol;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&bsol;n";

cout << "node and cost of edge:&bsol;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; //"Опережающий" указатель.