Метод релаксации переменных решения СЛАУ
Содержание
Задание 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
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
//Нахождение расстояния от источника до всех вершин в графе
//с неотрицательными весами (метод Дейкстры).
//Нахождение кратчайшего пути из S в T.
#include
#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 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 D(S) = 0; for (i=0;i Q(S) = 0; //Вычисление матрицы расстояний от //источника до всех вершин графа. while (!Pusto_Q(&Q(0))) //Пока Q не пусто. { Min = B; for (i=0;i if (Q(i)==1 && D(i) Q(u) = 0; for (i=0;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 cout << endl; // ----------------------------------------------------- // Нахождение кратчайшего пути из S в T с использованием // построенной матрицы расстояний. // ----------------------------------------------------- cout << "Inpute finish node: "; cin >> T; T--; W_S (&Stack,T); v = T; while ( v!=S ) { for (i=0;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 for (int j=0;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 #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused #include #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++) if ( Res1->Element(k)==1 || Res2->Element(k)==1 ) Res1->Element(k)=1; Udalenie (&Res2,UkStr); cout << "(" << T1 << " " << T2 << ") "; } } } void main () { Spisok Tree; Tree.Postr(); Tree.Reshenie(); } Список используемой литературы 1. Нефедов В.Н., Осипова В.А. Курс дискретной математики / МАИ. М., 1992. 2. Кристофидес Н. Теория графов. Алгоритмический подход. М.: Мир, 1978. 3. Уилсон Р. Введение в теорию графов. М.: Мир, 1977. 4. Берзтисс А.Т.Структуры данных.1974