Смекни!
smekni.com

«Разработка и проектирование оптимальных по различным критериям систем радиочастотной идентификации» (стр. 3 из 4)

Рассмотрим подробнее каждый из столбцов данной базы.

Первый – код – это индивидуальный номер, присваиваемый каждому считывателю. У каждого считывателя он индивидуальный, и не имеет повторов. Он используется для поиска ридера в базе данных. Также именно столбец «Код» позволяет нам узнать количество элементов . содержащихся в нашей базе данных.

Второй – название считывателя, добавленное в базу, чтобы пользователю было проще обрабатывать результаты работы программы. Это один из трёх столбцов, который возвращается пользователю в результате выполнения алгоритма. Именно он позволяет определить, из каких ридеров следует составить сеть, которая и будет покрывать нашу точку считывания.

Третий столбец – это количество антенн, которые можно подключить к отдельно взятому считывателю данной модели. Эта информация требуется, поскольку после выполнения алгоритма мы получим лишь количество антенн, которое необходимо для полного покрытия нашей точки считывания. Очевидно, что, если к одному ридеру можно подключить несколько антенн, то количество считывателей, которое будет необходимо использовать, будет меньше.

Четвёртый столбец – это частота, на которой работает наш считыватель. Она требуется, поскольку иначе существует возможность того, что ридеры в построенной нами системе не будут функционально работать. Как уже было отмечено выше, ридер при работе настраивается на определённую частоту, и способен получать информацию лишь от меток, частота которых совпадает с его собственной.

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

И, наконец, последний столбец нашей базы – это стоимость ридера, которая и используется при построении оптимальной системы по критерию «Стоимость».

Глава 3.2 Выбор критериев оптимизации

Было рассмотрено два критерия – и соответственно программа способна выдать два варианта построения сети.

Первый критерий – оптимальность стоимости сети, его выгода очевидна. Чем меньше денег будет затрачено – тем больше выгода. В этом случае подсчитывается итоговая стоимость для каждого считывателя, который позволяет построить систему, охватывающую точку целиком, и затем находится тот ридер, который при этом требует минимальной стоимости. Если таких ридеров несколько, то вход вступает следующий критерий, критерий о количестве, то есть выбирается тот считыватель, который требует минимальной стоимости, и при этом для полного покрытия точки считывания необходимо минимум ридеров.

Второй критерий – количество считывателей, использованное при построении сети. Если требуется за короткий промежуток времени создать большую по своим размерам сеть – то лучше использовать этот критерий, так как возможна ситуация с малым количеством ридеров на складе и необходимостью их экономии. В случае, если для нескольких ридеров число «количество» совпадает, и оно и является минимальным, выбирается тот считыватель, на установку которого потребуется минимальная стоимость (то есть выбирается минимум из количество умножить на стоимость).

Глава 4. Программная реализация

Глава 4.1 Основные объекты приложения

1. Класс TForm

TForm1 = class(TForm)

ADOTable1: TADOTable;

Button1: TButton;

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

RadioGroup1: TRadioGroup;

RadioGroup2: TRadioGroup;

PageControl1: TPageControl;

TabSheet1: TTabSheet;

DataSource1: TDataSource;

DBGrid1: TDBGrid;

DBNavigator1: TDBNavigator;

TabSheet2: TTabSheet;

TabSheet3: TTabSheet;

Button2: TButton;

Image1: TImage;

Edit5: TEdit;

Edit6: TEdit;

Edit7: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

Label10: TLabel;

Edit8: TEdit;

Label11: TLabel;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Label10Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

Класс TForm содержит в себе основные компоненты для работы программы. Это компонент TADOTable, позволяющий нам установить связь с базой данных, созданной с помощью программной среды Access. При помощи его взаимодействия с компонентом TDBGrid и появляется возможность воспроизведения нашей базы данных Bd на экран, а с помощью компонента TDBNavigator мы имеем возможность редактировать данные в таблице и добавлять либо удалять информацию.

Компоненты TEdit и TRadioGroup требуется нам для ввода-вывода информации, а компонент TImage – для отображения оптимального расположения ридеров, позволяющего покрыть нашу точку считывания.

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

2. Запись TReader

TReader = record

Id: Integer;

Name: String;

Count: Integer;

Chastota: String;

Rast: Extended;

Degree: Extended;

Price: Integer;

end;

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

3. Класс TDB

TDB=class(TObject)

procedure InAr();

function check_chast(Reader: TReader; Chas: String):boolean;

function how_many_line(Reader: TReader; a,b,c,d: extended; x: integer):integer;

function up(Reader: TReader; a,b,c,d: extended):boolean;

function line(Reader: TReader; a,b,c,d: extended):boolean;

function how_many_up(Reader: TReader; a,b,c,d: extended; x: integer):integer;

end;

Данный класс был создан для работы с базой данных (процедура InAr), а также для подсчёта оптимального количества ридеров, которые могут нам понадобиться для покрытия точки считывания (функции how_many_up how_many_line). Эти функции являются рекурсивными, и их алгоритм основан на следующем: мы запускаем их для икс (возвращаемое значение, оптимальное количество ридеров (или, корректнее, их антенн)) равного единице, и если видим, что одного ридера нам недостаточно, вызываем функцию для икс плюс одного ридера, и так до тех пор, пока количества считывателей не будет хватать, чтобы полностью охватить точку считывания.

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

Глава 4.2 Алгоритм поиска

В ходе работы алгоритм проходит три этапа. Рассмотрим их подробнее.

1. Проверка считывателей на соответствие входным данным.

На этом этапе сразу исключаются из рассмотрения считыватели, имеющие либо слишком маленькую дальность считывания (физически, вне зависимости от их количества, они не способны полностью охватить точку считывания), либо неподходящую частоту работы. Таким образом, после прохождения этого этапа значительно уменьшается количество считывателей, которые необходимо рассмотреть, и можно приступать ко второму этапу.

2. Проверка места установки

Очевидно, что считыватели можно установить либо на «потолке» нашей точки, либо на «стене». На этом этапе программа проверяет, можно ли отбросить один из этих двух вариантов как заранее невыгодный (или невозможный). После завершения этого этапа мы приступаем к алгоритму по поиску необходимого числа ридеров.

3. Подсчёт числа ридеров.

Мы проводим его рекурсивно, вызывая разработанную функцию с параметром единица, и далее рекурсивно увеличиваем на единицу, пока не находим того количества, которое необходимо для полного охвата точки считывания. Тогда алгоритм прерывается.

Глава 5. Анализ полученных результатов

1. Запустим приложение при заведомо некорректных данных, то есть при таких достаточно больших входных числах, что ни один считыватель из нашей базы данных не сможет охватить точку считывания таких размеров. Для этого выберем размер точки ввода – 150х150, а размеры точки появления RFID-меток – 100х100.

Рисунок 4. Запуск приложения при некорректных параметрах.

Мы видим, что приложение вывело для нас сообщение о том, что в имеющейся базе данных нет подходящих под наши требования считывателей. В качестве варианта разрешения проблемы предлагается либо закупить более современные (удовлетворяющие требованиям) считыватели, либо каким-нибудь путём изменить параметры точки считывания.

2. Запустим приложения при корректных параметрах, с целью получить общую информацию о считывателе, наиболее подходящем для создания сети считывателей. Для этого выберем размер точки ввода – 15х15, а размеры точки появления RFID-меток – 10х10. За частоту наших меток примем Low (см. Radiogroup2), а в качестве критерия оптимальности выберем деньги (Money).

Рисунок 5. Запуск приложения без рисовки расположения ридеров

Мы видим, что в результате работы приложения нам были показаны название, частота и стоимость того считывателя, использование которого полностью оптимизирует процесс создания сети.