Академический Документы
Профессиональный Документы
Культура Документы
ОТЧЕТ
к лабораторной работе №1
на тему:
«Выполнение и алгоритмизация теоретико-множественных
операций над нечеткими множествами»
По дисциплине: «Дискретная математика»
Махачкала 2021
Теоретические сведения необходимые для выполнения
лабораторной работы
Нечетким множеством, определенным на элементах исходного базового
множества
A={a i }, i=1,2 ,. . ., n1 , называется и обозначается множество пар
~
A = ¿¿ , где μ(a k ) – функция принадлежности, определяющая
~
степени принадлежности
a
элементов k к нечеткому множеству A .
~
Таким образом, к нечеткому множеству A относятся такие элементы базового
множества
ak ∈ A , для которых выполняется условие μ(a k )> 0 . Факт
~
принадлежности элемента
ak ai к нечеткому множеству A обозначается следующим
~
1
(a k )
~
A
a k* ak A
*
a k
1
Следует отметить, что операция пересечения нечетких множеств
естественным образом распространяется на произвольное их количество m. При
этом результирующее множество состоит только из элементов, которые
принадлежат всем участвующим в пересечении нечетким множествам. Степень
принадлежности элементов результирующего множества определяется следующим
образом: μ3 ( x i )=min( μ1 ( x i ), μ2 (x i ),. .. , μm ( x i ))
Пример 1.1.1. Пусть заданы следующие два нечетких множеств:
X 1 =¿ ¿ ; X 2 =¿ ¿ .
Тогда пересечением данных нечетких множеств будет множество:
X 3 =¿ ¿ .
μ3 ( x i )=max(μ 1 ( x i ), μ 2 ( x i )) .
μ ( x i )=(1−μ X ( xi ))
¿
X .
Пример 1.1.3. Так, дополнением для нечеткого множества
X 1 =¿ ¿ является следующее нечеткое множество
2
¿
X 1 =¿ ¿ , а для множества
¿
X 2 =¿ ¿ – множество X 2 =¿ ¿ .
Следует отметить, что большое значение для практического применения
математического аппарата нечетких множеств имеет сравнение между собой
нечетких множеств Х1 , Х2 и определение степени их нечеткого равенства
ρ( Х 1 , Х 2 ) .
,
где & - нечеткая логическая операции «И», которая аналогично как и
одноименная теоретико-множественная операция пересечения нечетких множеств
выполняется путем определения минимума попадающих под нее степеней
принадлежности сравниваемых элементов; → – логическая операция нечеткой
импликации; V - нечеткая логическая операции «или», которая аналогично как и
теоретико-множественная операция объединения нечетких множеств выполняется
путем определения максимума попадающих под нее степеней принадлежности
сравниваемых элементов.
Пусть два нечетких множество Х1 , Х2 состоят из одинакового количества n
одноименных элементов. Тогда степень их нечеткого равенства ρ( Х 1 , Х 2 ) можно
определить следующим образом:
n n
ρ( Х 1 , Х 2 )=min ρi ( μ 1 ( x i ) , μ 2 ( x i ) )=min ( μ1 ( x i )↔ μ2 ( x i ))
i=1 i =1 ,
3
Для принятия решений по полученным результатам такого сравнения между
собой нечетких множеств Х1 и Х2 применяется следующее эвристическое правило:
а) если степень нечеткого равенства сравниваемых между собой множеств
Х1 и Х2 определяется соотношением ρ( Х 1 , Х 2 )>0,5 , то принимается решение, что
они нечетко равны между собой, что обозначается следующим образом X 1 ≈X 2 . В
противном случае, следует перейти к п. б;
4
Объединение:
X1∪X2 = {<0,7;1>,<0,5;2>,<0,2;3>,<0,3;4>,<0,9;5>,<0,5;6>,<0,6;7>,<0,7;8>,<0,5;9>,
<0,6;10>,<0,2;11>,<0,2;12>,<0,9;13>,<0,3;14>,<0,1;15>,<0,8;16>,<0,2;17>,<0,3;18>,
<0,8;19>,<0,6;20>}
Дополнение:
¿
X 1 = {<0,5;2>, <0,8;3>,<0,1;5>,<0,5;6>,<0,6;7>,<0,4;10>,<0,8;12>,<0,1;13>,<0,7;14>,
<0,8;17>,<0,2;19>,<0,4;20>}
¿
X 2 = {<0,3;1>, <0,7;4>,<0,6;5>,<0,4;7>,<0,3;8>,<0,2;9>,<0,8;11>,<0,5;13>,<0,9;15>,
<0,2;16>,<0,7;18>,<0,6;20>}
б) Построила блок-схемы алгоритмов выполнения различных теоретико-
множественных операций над нечеткими множествами Х1 и Х2 на ЭВМ.
Пресечение: Объединение: Дополнение:
НАЧАЛО НАЧАЛО
Формирование Формирование
мн-в Х1 и Х2 мн-в Х1 и Х2
Формирование
мн-в Х1 и Х2
X3 = X1∩X2
НАЧАЛО
Вывод
КОНЕЦ
Вывод Вывод 1 и 2
X3 = X1∪X2
КОНЕЦ КОНЕЦ
5
output("X1", x1); //вывод в консоли нечеткого множества Х1 через метод вывода
output("X2",x2); //вывод в консоли нечеткого множества Х2 через метод вывода
int sim = 0;
for (int i = 0; i < x1.length; i++)
for (int j = 0; j < x2.length; j++)
if (x1[i][1] == x2[j][1]) sim++; //подсчет количества пересечений по элементам
peresechenie(x1,x2,sim, "X1∩X2");
obedinenie(x1,x2,sim,"X1∪X2");
dopolnenie(x1,"-X1");
dopolnenie(x2,"-X2");
}
/* Метод реализации операции пересечения нечётких множеств, параметры метода:
два массива, с которыми будет работать метод, количество пересечений, имя
переменной при выводе. */
static void peresechenie(int x1[][],int x2[][], int sim, String name){
int x_per[][] = new int[sim][2]; // введение массива, который будет хранить в себе
данные множества пересечений
int c = 0;
for (int i = 0; i < x1.length; i++)
for (int j = 0; j < x2.length; j++) {
if (x1[i][1] == x2[j][1] && x1[i][0] <= x2[j][0]) {
x_per[c][0] = x1[i][0];
x_per[c][1] = x1[i][1];
c++;
} else if (x1[i][1] == x2[j][1] && x1[i][0] >= x2[j][0]) {
x_per[c][0] = x2[j][0];
x_per[c][1] = x2[j][1];
c++;
}
}
output(name, x_per);
}
/* Метод реализации операции объединения нечётких множеств, параметры метода:
два массива, с которыми будет работать метод, количество пересечений, имя
переменной при выводе. */
static void obedinenie (int x1[][], int x2[][],int sim, String name){
int k = 0, j = 0, i = 0, x_ob[][] = new int[x1.length+ x2.length-sim][2];
while (i < x_ob.length) {
if (k != x1.length && j != x2.length) {
if (x1[k][1] < x2[j][1]) {
x_ob[i][0] = x1[k][0];
x_ob[i][1] = x1[k][1];
k++;
} else if (x1[k][1] > x2[j][1]) {
x_ob[i][0] = x2[j][0];
x_ob[i][1] = x2[j][1];
j++;
} else {
if (x1[k][0] > x2[j][0]) {
6
x_ob[i][0] = x1[k][0];
x_ob[i][1] = x1[k][1];
k++;
j++;
} else {
x_ob[i][0] = x2[j][0];
x_ob[i][1] = x2[j][1];
j++;
k++;
}
}
i++;
} else if (k == x1.length) {
x_ob[i][0] = x2[j][0];
x_ob[i][1] = x2[j][1];
j++;
i++;
} else {
x_ob[i][0] = x1[k][0];
x_ob[i][1] = x1[k][1];
k++;
i++;
}
}
output(name,x_ob);
}
/* Метод реализации операции дополнения нечётких множеств, параметры метода:
массив, с которым будет работать метод, имя переменной при выводе. */
static void dopolnenie (int a[][], String name){
int x_dop[][]= new int[a.length][2];
for ( int l = 0; l < a.length; l++) {
x_dop[l][0] = 10-a[l][0];
x_dop[l][1] = a[l][1];
}
output(name, x_dop);
}
/* Метод вывода нечётких множеств, параметры метода:
имя переменной при выводе, массив, с которым будет работать метод. */
7
г) Произвела на ЭВМ необходимые расчеты. Результат выполнения кода
программы:
X1 = {<0,5;2>,<0,2;3>,<0,9;5>,<0,5;6>,<0,4;7>,<0,6;10>,<0,2;12>,<0,9;13>,<0,3;14>,
<0,2;17>,<0,8;19>,<0,6;20>}
X2 = {<0,7;1>,<0,3;4>,<0,4;5>,<0,6;7>,<0,7;8>,<0,8;9>,<0,2;11>,<0,5;13>,<0,1;15>,
<0,8;16>,<0,3;18>,<0,4;20>}
X1∩X2 = {<0,4;5>,<0,4;7>,<0,5;13>,<0,4;20>}
X1∪X2 = {<0,7;1>,<0,5;2>,<0,2;3>,<0,3;4>,<0,9;5>,<0,5;6>,<0,6;7>,<0,7;8>,<0,8;9>,
<0,6;10>,<0,2;11>,<0,2;12>,<0,9;13>,<0,3;14>,<0,1;15>,<0,8;16>,<0,2;17>,<0,3;18>,<0,8;
19>,<0,6;20>}
-X1 = {<0,5;2>,<0,8;3>,<0,1;5>,<0,5;6>,<0,6;7>,<0,4;10>,<0,8;12>,<0,1;13>,<0,7;14>,
<0,8;17>,<0,2;19>,<0,4;20>}
-X2 = {<0,3;1>,<0,7;4>,<0,6;5>,<0,4;7>,<0,3;8>,<0,2;9>,<0,8;11>,<0,5;13>,<0,9;15>,
<0,2;16>,<0,7;18>,<0,6;20>}
8
а) определила «вручную» степени вложения ρ( X 1 ⊂ X 2 ) и ρ( X 2 ⊂ X 1 ) одного
нечеткого множества в другое:
= (0→0,7)&( 0,5→0)&(0,2→0)&(0→0,3)&(0,9→0,4)&(0,5→0)&(0,4→0,6)&
(0→0,7)&(0→0,8)&(0,6→0)&(0→0,2)&(0,2→0)&(0,9→0,5)&(0,3→0)&(0→0,1)&(0→0,8)&
(0,2→0)&(0→0,3)&(0,8→0)&(0,6→0,4)=1&0,5&0,8&1&0,4&0,5&0,6&1&1&0,6&1&0,8&0,5
&0,7&1&1&0,8&1&0,2&0,4=0,2
Формирование Формирование
мн-в Х1 и Х2 мн-в Х3 и Х4
Формирование
мн-в Х1 и Х2
НАЧАЛО
Вывод
КОНЕЦ
Вывод
Вывод
КОНЕЦ
КОНЕЦ
9
г) по полученным блок схемам алгоритмов проводимых вычислений
разработала программы их реализации на ЭВМ на одном из языков
программирования высокого уровня - Java.
vlojenie(x2,x1,"p(X2⊂X1)");
step_ravnosty(x3,x4,"p(x3,X3)");
}
/* Метод реализации операции вычисления степени вложения нечётких множеств,
параметры метода:
массивы, с которым будет работать метод, имя переменной при выводе. */
10
static void step_ravnosty(int x1[][], int x2[][], String name){
int x_ravn[] = new int[x1.length];
for (int i = 0; i < x1.length; i++)
x_ravn[i] = Integer.min(Integer.max(10-x1[i][0], x2[i][0]),Integer.max(x1[i][0], 10 -
x2[i][0]));
int step_ravnosty= x_ravn[0];
for (int i = 1; i < x_ravn.length; i++)
step_ravnosty= Integer.min(step_ravnosty,x_ravn[i]);
System.out.println(name + " = 0," + step_ravnosty );
}
}
Вывод программы:
X1 = {<0,5;2>,<0,2;3>,<0,9;5>,<0,5;6>,<0,4;7>,<0,6;10>,<0,2;12>,<0,9;13>,<0,3;14>,
<0,2;17>,<0,8;19>,<0,6;20>}
X2 = {<0,7;1>,<0,3;4>,<0,4;5>,<0,6;7>,<0,7;8>,<0,8;9>,<0,2;11>,<0,5;13>,<0,1;15>,
<0,8;16>,<0,3;18>,<0,4;20>}
X3 = {<0,6;1>,<0,4;2>,<0,8;3>,<0,3;4>,<0,9;5>,<0,7;6>,<0,3;7>,<0,6;8>,<0,3;9>,<0,2;10>,
<0,1;11>,<0,2;12>,<0,9;13>,<0,5;14>,<0,4;15>,<0,4;16>,<0,9;17>,<0,6;18>,<0,8;19>,
<0,3;20>}
Х4 = {<0,7;1>,<0,2;2>,<0,7;3>,<0,5;4>,<0,8;5>,<0,4;6>,<0,7;7>,<0,4;8>,<0,8;9>,<0,1;10>,
<0,4;11>,<0,3;12>,<0,6;13>,<0,2;14>,<0,4;15>,<0,1;16>,<0,8;17>,<0,5;18>,<0,5;19>,
<0,7;20>}
p(X1⊂X2) = 0,2
p(X2⊂X1) = 0,2
p(x3,X3) = 0,3
11