Визначення кількості інформації та ентропійних характеристик об’єктів комп’ютерних мереж
Автор: Андріан Шебунчак • Июнь 5, 2022 • Лабораторная работа • 2,486 Слов (10 Страниц) • 237 Просмотры
Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Інститут комп’ютерних наук та інформаційних технологій
Кафедра автоматизованих систем управління
[pic 1]
Звіт
до лабораторної роботи № 1
з дисципліни “Теорія інформації”
на тему:
«Визначення кількості інформації та ентропійних характеристик об’єктів комп’ютерних мереж»
Виконав: студент КН-205
Шебунчак Андріан
Прийняла: викладач кафедри АСУ
Павлюк О. М.
Львів - 2022
Лабораторна робота №1
Тема роботи: «Визначення кількості інформації та ентропійних характеристик об’єктів комп’ютерних мереж»
Мета роботи: набути навики визначення кількості інформації у
повідомленнях та визначати ентропії джерела інформації, приймача, каналу
зв’язку, системи взаємозв’язаних об’єктів.
Індивідуальне [pic 2]
завдання номер 92
Хід роботи
2. Виконати обчислення середньої ймовірності появи окремих літер українського (у) алфавіту шляхом аналізу різноманітних текстів.
3-4. На основі досліджень в попередньому пункті створити таблицю розподілу ймовірностей літер в повідомленнях відповідною мовою.
За створеною таблицею визначити :
1. Кількість інформації у кожній літері.
2. Кількість інформації у Вашому прізвищі та імені записаного мовою відповідно до індивідуального варіанту.
3. Ентропію H(X).
Для цього написати відповідний програмний код.
Результат підрахунків для тексту заданою мовою.
Код програми
package com.company;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Main {
private static List<Integer> charCount = new ArrayList<>();
private static List<Double> charAverageAppear = new ArrayList<>();
private static List<Double> amountInformation = new ArrayList<>();
private static List<Double> charEntropy = new ArrayList<>();
private static StringBuilder stringBuilder = new StringBuilder("");
private static double fullProbability;
private static double averageProbability;
private static double fullAmountInform;
private static double fullEntropy;
private static int totalCount = 0;
private static Integer temp;
private static boolean sameletter;
public static void main(String[] args) {
setCharCount();
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(new File("lab1(2).txt")));
int c;
while ((c = reader.read()) != -1) {
if((c>=1040 && c <= 1096)||(c>=1100 && c <= 1103)||
(c==1169)||(c==1110)||(c==1111)||(c==1108)||
(c==1168)||(c==1028)||(c==1030)||(c==1031))
{
if (stringBuilder.isEmpty())
{
stringBuilder.append((char)c);
temp = charCount.get(0);
temp += 1;
charCount.set(0, temp);
totalCount++;
} else {
for (int i = 0; i < stringBuilder.length(); i++) {
if ((char)c == stringBuilder.charAt(i))
{
temp = charCount.get(i);
temp += 1;
charCount.set(i, temp);
totalCount++;
sameletter = true;
break;
}
sameletter = false;
}
if (!sameletter) {
stringBuilder.append((char)c);
temp = charCount.get(stringBuilder.length() - 1);
temp += 1;
charCount.set(stringBuilder.length() - 1, temp);
totalCount++;
}
}
}
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
CountAvarageAppear();
fullProbability = CountFullProbability();
averageProbability = (double)1/stringBuilder.length();
CountAmountInformation();
fullAmountInform = CountFullAmountInform();
CountCharEntropy();
fullEntropy = CountFullEntropy();
ToString();
}
public static void setCharCount() {
for (int i = 0; i < 66; i++) {
charCount.add(i, 0);
}
}
public static void CountAvarageAppear() {
for (int i = 0; i < 66; i++) {
charAverageAppear.add(i, (double)charCount.get(i)/totalCount);
}
}
public static double CountFullProbability() {
double temp = 0;
for (int i = 0; i < 66; i++) {
temp += charAverageAppear.get(i);
}
return temp;
}
public static double log2(double N)
{
return (double)(Math.log(N) / Math.log(2));
}
public static void CountAmountInformation() {
for (int i = 0; i < 66; i++) {
amountInformation.add(i, -log2(charAverageAppear.get(i)));
}
}
public static double CountFullAmountInform() {
double temporary = 0;
int i = 0;
while(charCount.get(i) != 0) {
temporary += (amountInformation.get(i) * charCount.get(i));
i++;
}
return temporary;
}
public static void CountCharEntropy() {
for (int i = 0; i < 66; i++) {
charEntropy.add(i, -charAverageAppear.get(i)*log2(charAverageAppear.get(i)));
}
}
public static double CountFullEntropy() {
double temporary = 0;
int i = 0;
while(charAverageAppear.get(i) != 0) {
temporary += charEntropy.get(i);
i++;
}
return temporary;
}
public static void ToString() {
System.out.println("Буква\t\tN\t\t\tp(x)\t\t\t\t\t\tI\t\t\t\t\t\t\tH(x)");
for (int i = 0; i < stringBuilder.length(); i++) {
System.out.printf("%-4c\t\t%-6d\t\t%-20.18f\t\t%-20.17f\t\t%-20.18f\n", stringBuilder.charAt(i), charCount.get(i), charAverageAppear.get(i), amountInformation.get(i), charEntropy.get(i));
}
System.out.println();
System.out.printf("Повна ймовірність: %.16f\n",fullProbability);
System.out.printf("Середня ймовірність: %.16f\n",averageProbability);
System.out.printf("Загальна кіклькість інформації: %.12f\n",fullAmountInform);
System.out.printf("Загальна ентропія: %.16f\n",fullEntropy);
}
}
...