Вы находитесь на странице: 1из 6

Отчет о лабораторной работе номер 6

Дисциплина: Теория информации и кодирования

Преподаватель: Посевин Д.П.

Студент: Мороз И.Д.

Год: 2021

Цель лабораторной работы:

Реализация концепции вероятностно-дискретных источников (ВДИ)


для заданного алфавита с длительностью каждого элемента ВДИ.

В качестве средств разработки был выбран flutter с компиляцией для


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

Описание:

Часто приходится анализровать данные с самых различных


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

Также, те или иные данные с каждого датчика могут приходить с


неравной частотой, значит, каждый элемент ВДИ имеет свою длительность
того или иного символа алфавита.

В данном случае, ВДИ является генератор псевдо-случайных чисел


мобильного телефона на базе Android.
Эта программа реализует создание ВДИ и вероятность выпадения той
или иной комбинации алфавита (из ВДИ).

Проект состоит их 3х окон.

1 - Список экспериментов
2 - Форма создания эксперимента
3 - Описание результата эксперимента. Данная форма разбита на 2 вкладки
для разделения по специфике разных опытов.

Опыт 1 – смена элемента алфавита в каждом ВДИ раз в указанное время

Опыт 2 – проверка 2 формул для вычисления производительности источника

Для первой формулы работает следующий на языке Dart код:

import 'dart:math';
class Experiment2{
static double calculate({required List<String> alphabet, required int numExperiments, required int numVDI,
required List<int>timeForEveryVDI}){
List<double> variations = generateVariations(alphabet: alphabet, numExperiments: numExperiments,
numVDI: numVDI);
double result = 0;
for(double x in variations){
result+=x*logBase(x, 2);
}
double averageTime = getAverageTime(variations, timeForEveryVDI);
return -result/averageTime;
}
static double logBase(num x, num base) => log(x) / log(base);
static double getAverageTime(List<double> variations, List<int> timeForEveryVDI) {
double result = 0;
for(int i = 0 ; i < timeForEveryVDI.length; i++) {
result += variations[i]*timeForEveryVDI[i]/1000;
}
return result;
}
static List<double> generateVariations({required List<String> alphabet,required int numVDI, required int
numExperiments}){
///заполнение массива будующих случайных ведичин каждого символа алфавита нулями
List<double> numbers = [for(int i = 0; i < numVDI; i++) 0];
Random random = Random();
/// вызываем случайные символы из алфавита, суммируем его случайную величину на 1
for(int i = 0; i < numExperiments; i++){
numbers[random.nextInt(numbers.length)] += 1;
}
/// представим получившиеся случайные величины в диапазоне [0,1]
for(int i = 0; i < numbers.length; i++){
numbers[i] = (numbers[i] /numExperiments)/alphabet.length;
}
return numbers;
}
}

Для проверки предельной формулы, работает следующий код:

import 'dart:math';
class Experiment3 {
static double calculate({required List<String> alphabet, required int numExperiments, required int numVDI,
required List<int>timeForEveryVDI}) {
Map variations = generateVariations(alphabet: alphabet, numExperiments: numExperiments, numVDI:
numVDI);
double result = 0;
variations.forEach((key, value) {
result += value*logBase(value, 2);
});
double averageTime = timeForEveryVDI.reduce(max)/1000;//getAverageTime(timeForEveryVDI);
return -result/averageTime;
}
static double logBase(num x, num base) => log(x) / log(base);
static double getAverageTime(List<int> timeForEveryVDI) {
double result = 0;
for(int time in timeForEveryVDI) {
result += time;
}
return result/1000/timeForEveryVDI.length;
}
static Map generateVariations({required List<String> alphabet, required int numExperiments, required int
numVDI}) {
List<String> values = [];

/// заполняем массив в будущем каждой случайной комбинации нулями


List<double> numbers = [
for(int i = 0; i < pow(alphabet.length, numVDI); i++) 0
];

/// создадим массив всех возможных комбинаций алфавита


for (int i = 0; i < pow(alphabet.length, numVDI); i++) {
/// получаем рекурсивной функцией эту комбинацию
String str = divisionByBase(i, alphabet.length, alphabet);
/// если комбинация на данный момент достаточно мала, добавить необходимое кол-во начальных
символов
while (str.length != numVDI) {
str = alphabet[0] + str;
}

///добавление комбинации в массив


values.add(str);
}

/// склеиваем массивы получившихся комбинаций и случайных величин


Map result = Map<String, double>.fromIterables(
values,
numbers
);

Random random = Random();

/// вычисление случайной величины для каждой комбинации алфавита


for (int i = 0; i < numExperiments; i++) {
///вычисление случайной комбинации
String strVDI = "";
for (int j = 0; j < numVDI; j++) {
strVDI += alphabet[random.nextInt(alphabet.length)];
}

/// на этом моменте случайная величина вычислена, просуммируем ее на 1


result[strVDI] += 1;
}

/// получаем из получившихся случайных величин числа на [0, 1]


for (int i = 0; i < pow(alphabet.length, numVDI); i++) {
result[values[i]] /= numExperiments;
}

/// возвращение результата


return result;
}

/// рекурсивный метод, производящий перевод из 10 системы счисления в base систему счисления,
возвращение не числа, а получащейся комбинации алфавита
static String divisionByBase(int num, int base, List<String> alphabet) {
int numResult = num ~/ base;
int numRemainder = num % base;
return (num < base ? "" : divisionByBase(numResult, base, alphabet)) + alphabet[numRemainder];
}

Вам также может понравиться