Разработка программного обеспечения для реализации и тестирования алгоритма нахождения частых множеств в транзакционных данных вертикального формата

Понятие кластеризации и принципы работы ее алгоритмов. Этапы применения кластерного анализа для получения оптимального результата. Классификация алгоритмов кластеризации. Принцип работы алгоритма LargeItem. Понятие транзакций и проблема их кластеризации.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 21.03.2016
Размер файла 1,7 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

2) Имеется 2 транзакции по 5 предметов. Один предмет общий.

Если не объединять их в один кластер, то получим 2 кластера с суммой больших предметов 10, но один предмет общий и малых нет. Получим штраф 0+10-1=9.

При объединении все предметы, кроме одного становятся малыми, т.е штраф за малые 8. Больших предметов 1, но т.к в кластере он повторен, то и число повторов необходимо вычесть. Получается, что общий штраф не меняется и составит 8.

Как видно - объединение транзакций выгодно.

3)Тот же случай, что и в пункте 2, но общих предметов в транзакциях два.

Из расчета получаем, что при образовании 2 кластеров - общий штраф 8 (10-2=8).

При объединении все предметы, кроме двух в каждой транзакции становятся малыми, т.е штраф за малые предметы - 16. Больших предметов 2, при этом каждый повторяется дважды. Т.о общий штраф получается 16.

Это еще одно подтверждение выгодности объединения транзакций с общими предметами в один кластер.

Проверим выгодность добавления транзакций с общими предметами в кластер.

1) Допустим, имеется кластер, содержащий две транзакции по 10 предметов с 2 общими предметами. Добавляем транзакцию с 10 элементами, в которой нет общих с кластером предметов.

Если образовать 2 кластера, то число больших предметов в первом кластере не изменится и так и будет равно 2. В новом кластере число больших предметов станет 10. Т.о число малых предметов в первом кластере - 16, а общий штраф будет равен - 28.

При добавлении транзакции в существующий кластер количество малых предметов увеличится на 10 и станет 26 (16+10=26).Общий штраф будет равен 28 (26+2=28).

Т.о в данном случае объединение не дает выгоды.

2) Проверим аналогичный случай, но в добавляемой транзакции один предмет является общим с кластером.

Если не объединять транзакцию и существующий кластер в новый кластер, то число больших предметов будет равно 3+10-1 (поскольку 1 предмет является общим). Малых предметов в первом кластере 16. Общий штраф составляет 28 (3+10-1+16=28).

При объединении транзакции и кластера в новый кластер общее число малых предметов составит 15+9=24. Число больших предметов 3, но т.к один является общим, при конечном расчета штрафа будем отнимать единицу.

Общий штраф в данном случае будет равен 24+3-1=26.

Видно, что объединение дает выгоду.

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

Теперь рассмотрим принцип работы алгоритма на тестовом примере.

Основными этапами работы алгоритма является:

· Первичный проход по базе транзакций и их объединение в кластеры.

· Вторичный проход по базе кластеров и расчет возможного улучшения кластеризации.

Разберем эти этапы более подробно.

Первичный проход по базе транзакций и их объединение в кластеры

Предположим, что на начальном этапе имеется гипотетическая база, состоящая из девяти транзакций. Обозначим их цифрами от 1 до 9.

Рис. 21 Транзакции 1-9

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

Рис. 22 Транзакции 2, 4-9 и новообразованный кластер (1,3)

Данная пара транзакций объединяется в кластер и для нее будет составлено бинарное дерево, таблица учета предметов, а также данные о количестве транзакций в новообразованном кластере будут добавлены в специальную таблицу (для каждого нового кластера добавляется новая строка таблицы). Ниже приведен произвольный пример структуры такой таблицы.

Номер кластера

Количество транзакций

1

3

2

4

3

1

4

0

5

2

Как мы видим выше, в процессе выполнения программы, может возникнуть случай, когда количество транзакций в кластере становится равным 0 или 1 (случаи, когда так происходит будут описаны ниже). В таких случаях необходимо удалить данные строки из таблицы, и провести перенумерацию оставшихся кластеров (Рисунок 24).

Номер кластера

Количество транзакций

1

3

2

4

3

2

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

Рассмотрим механизм построения бинарного дерева для новообразованного кластера.

Бинарное дерево строится на основе таблицы учета предметов и делителя бинарного дерева, расчет которого описан выше.

Таблица учета предметов в кластере состоит из двух столбцов. В левом находится имя предмета, а в правом число раз, сколько данный предмет содержится в данном кластере.

Листьями в бинарном дереве являются списки элементов транзакций, для которых количество нахождения раз в кластере равно.

Например, имеем кластер, состоящий из двух транзакций ([a, b, c, d, e] , [c, d, e, f]). Также имеем минимальную поддержку 70%, введенную пользователем.

Предмет считается большим, если существует в 2х транзакциях (0,7*2 = 1,4 округляем в большую сторону).

Таблица учета предметов будет выглядеть таким образом:

a

1

b

1

c

2

d

2

e

2

f

1

На основе данной таблицы строится бинарное дерево (Рисунок 25).

Рис. 25

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

При прохождении первичной кластеризации может возникнуть случай, когда одна транзакция имеет общие предметы с несколькими другими. Например, транзакция 1 будет иметь общие предметы как с транзакцией 3, так и с транзакцией 7. В таком случае происходит построение двух предварительных кластеров и сравнение их штрафов за неправильную кластеризацию. Соответственно, более удачным кластером будет являться тот кластер, у которого данный штраф будет ниже. Тогда, худший кластер удаляется, т.е удаляется дерево для этого кластера, таблица предмета учета предметов для данного кластера, а также запись о нем в таблице учета количества транзакций в кластере. В случае, если транзакция не имеет общих предметов ни с одной из существующих транзакций, то из нее образуется кластер, содержащий только эту транзакцию. Что произойдет с этими кластерами будет описано позднее.

Вторичный проход по базе кластеров и расчет возможного улучшения кластеризации

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

Рис. 26 Кластеры до вторичной кластеризации

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

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

Рассмотрим пример образования нового кластера на основе двух уже существующих.

Например, попытаемся объединить ранее рассмотренный кластер ([a, b, c, d, e] , [c, d, e, f]), состоящий из двух транзакций и новый кластер ([c, d, l, z], [y, l, z]), также состоящий из двух транзакций. Для нового кластера таблица учета предметов будет иметь следующий вид:

a

1

b

1

c

3

d

3

e

2

f

1

l

2

y

1

z

1

Также, в связи с добавлением новых элементов, будет перестроено бинарное дерево (Рисунок 27).

Рис. 27

В данном случае частота встречаемости больших предметов будет не менее 3х (0,7*4 = 2,8 округляем в большую сторону). Рассчитаем штраф для новообразованного кластера, а также для двух кластеров отдельно.

В новом кластере количество "больших предметов" 2, остальные 7 являются "малыми". Следовательно, по формуле, штраф в данном случае будет равен 7.

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

Кластер ([a, b, c, d, e] , [c, d, e, f]) имеет 3 "больших" и 3 "малых" предмета, кластер ([c, d, l, z], [y, l, z]) - 2 "больших" и 3 "малых". Исходя из этих значений, получаем штраф равный 11, что еще раз доказывает, что даже один общий предмет стимулирует объединение в общий кластер.

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

3.4 Настройка Java

Для программ, написанных на языке Java, по умолчанию выделяется 128Mb оперативной памяти. Для обработки некоторых наборов данных этого количества памяти недостаточно. Что бы увеличить количество выделяемой памяти при запуске из командной строки Windows надо добавить параметр -Xmx256m, где 256 - это количество выделяемой памяти. Так же можно поставить 512 и 1024 в зависимости от размера набора данных.

4. Тестирование

При тестировании корректности работы алгоритма будем опираться на экспериментальные данные работы алгоритма с предварительно сгенерированными базами данных разных размеров.

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

4.1 Масштабируемость

Масштабируемость - оценка линейности нарастания скорости работы алгоритма при увеличении нагрузки на него.

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

Рис. 28.

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

4.2 Deductor Studio 5.1

Так как разработанное ранее приложение LargeItem выводит в выходном файле "большие предметы", то используя специальный аналитический инструмент возможно проверить совпадение "больших предметов", выведенных программой, и частых множеств найденных в той же самой БД.

Одним из способов проверки корректности работы приложения LargeItem может являтся сравнение ее результатов с результатом работы аналитической платформы Deductor Studio 5.1. Платформа разработана рязанской фирмой "BaseGroup Labs".

Deductor Studio - предоставляет аналитикам инструментальные средства, необходимые для решения самых разнообразных аналитических задач. В области Data Mining, например:

· Прогнозирование - выполняет прогнозирование временного ряда.

· Автокорреляция - выполняет автокорреляционный анализ данных.

· Линейная регрессия - строит модель данных в виде набора коэффициентов линейного преобразования.

· Нейросеть - выполняет обработку данных с помощью многослойной нейронной сети.

· Дерево решений - выполняет обработку данных с помощью деревьев решений.

· Самоорганизующиеся карты - выполняет кластеризацию данных.

· Ассоциативные правила - обнаружение зависимостей между связанными событиями. Поиск частых множеств.

· Пользовательская модель - задание модели вручную по формулам.

Вышеперечисленное является малой частью возможностей платформы.

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

К сожалению, Deductor не работает при поиске частых множеств в базах объемах больше 12000 транзакций. При поиске выдается ошибка, и обработка данных прекращается. Возможно, эта ошибка конкретной версии программы, скачанной с официального сайта. Или данная лицензия имеет ограничение на объем данных.

Тем не менее, мы будем использовать Deductor для тестирования небольших баз.

Далее рассмотрим процесс поиска частых множеств с помощью Deductora:

Запускаем Deductor Studio 4.4. Вначале мы настраиваем источник данных, то есть средство, с помощью которого Deductor будет подключаться к базе данных транзакций.

Для этого необходимо перейти в вид "Источники данных". Вызываем меню "Вид" и выбираем в нем пункт "Источники данных". В правом окошке открывшегося вида находится дерево источников данных по типам.

Типов источников три:

1) Базы данных

2) Хранилище данных

3) Бизнес-приложение

Для импорта базы данных транзакций нам подходит первый тип. Щелкаем правой кнопкой мыши по дереву. В открывшемся списке выбираем пункт "Добавить источник данных". В данном пункте выбираем подпункт "Добавить базу данных" (рисунок 29).

Рис. 29 Создание источника данных

Далее вам предлагается список баз данных, которых можно подключить. Для подключения MySql нам подходят два варианта из списка: "MySql" и "ODBC".Если вы выберете "MySql", то соединение будет создано для одной конкретной базы. И для каждой базы придется создавать свое подключение, что может быть неудобно.

Если выбрать вариант "ODBC", то соединение будет создано для сервера, а конкретную базу данных мы будем выбирать при непосредственном импорте данных. Последний вариант мне кажется более удобным.

После выбора появится окно настроек подключения рисунок 30. Для тестирования нам понадобится минимум настроек:

· Имя - Название подключение

· Описание - описание подключения. Фактически, является комментарием, можно не заполнять.

· Описание подключения - заполняется автоматически.

· База данных - здесь необходимо выбрать подключение, настроенное подключение к ODBC драйверу.

Логин и пароль у нас уже прописан в выбранном подключении к ODBC драйверу. Другие настройки в нашем тестировании не понадобятся.

Рис. 30 Окно настроек подключения

Работоспособность подключения можно проверить, щелкнув по иконке штекера в левом верхнем углу окна настроек.

Соединение создано, далее необходимо импортировать базу данных транзакций. Переходим в вид "Сценарии": открываем меню "Вид" и выбираем в нем пункт "Сценарии".

В открывшемся виде щелкаем правой кнопкой мыши по левому окну, содержащему список сценариев. В открывшемся меню выбираем "Мастер импорта". На экран выводится список типов объектов импорта. Выбираем пункт: "База данных - настроенный источник данных".

В окне настроек импорта (Рисунок 31) в поле "База данных" выбираем настроенный нами в начале пункта 4.2 источник данных. Можно импортировать целиком таблицу из базы данных, но поскольку таблица товаров в базе данных содержит не названия товаров, а всего лишь их ключи, придется формировать запрос. Формула запроса выглядит так:

select trans.tid, tovars.title from <название базы>.trans, <название базы>.tovars where trans.elem=tovars.uniqkey

Где tovars -название таблицы товаров, trans - название таблицы транзакций.

В следующем окне запускаем импорт, и, если подключение настроено правильно и формула запроса введена без ошибок, то импорт пройдет успешно.

После окончания импорта пользователю будет предложено настроить вид отображения полученных данных (Рисунок 32).

В первом окне на рисунке 32 мы задаем параметры столбцов, то есть, указываем, какой столбец содержит ID транзакций (идентификатор), а какой элемент. Импортированная база данных представлена на рисунке 26

Рис. 32 Настройка внешнего вида импортированных данных

Рис. 33 Импортированная в Deductor база данных

кластеризация алгоритм транзакция

Для начала обработки импортированных данных нужно кликнуть правой кнопкой мыши на лист импорта в левом окне в списке сценариев. В открывшемся меню выбрать "Мастер обработки". Платформа Deductor предложит способ обработки. Выбираем в списке "Ассоциативные правила". Система предложит еще раз определить типы столбцов, аналогично верхнему экрану на рисунке 33. Определяем и нажимаем "далее".

Откроется окно настройки параметров поиска ассоциативных правил (Рисунок 34).

Рис. 34 Настройка параметров построения ассоциативных правил

Ассоциативные правила мы строить не собираемся, поэтому настройки раздела "Ассоциативные правила" не трогаем. Указываем минимальную поддержку, скажем, 20%. А максимальную поддержку устанавливаем на 100%. В следующем окне запускаем процесс поиска частых множеств.

Когда поиск закончен, предлагается выбрать способ представления результатов. Наиболее подходящий нам способ называется "Популярные наборы - отображение текста часто встречающихся множеств". На экран будут выведены результаты поиска (Рисунок 35)

Сравнив результаты работы Deductor и результаты работы программы LargeItem можно видеть, что популярные наборы выдаваемые Deductorом совпадают с "большими предметами", получаемыми после работы программы LargeItem, что говорит о корректности работы алгоритма.

Рис. 35 Результаты поиска частых множеств в Deductor

Заключение

В данной работе была затронута актуальная, интенсивно развивающаяся область методов анализа данных. Был рассмотрен новый подход к кластеризации. В рамках дипломной работы:

ь рассмотрены принципы работы алгоритмов кластеризации

ь изучена структура представления информации в виде таблиц транзакционных данных

ь рассмотрены принципы составления бинарных деревьев, а также B+ деревьев

ь модернизирован существующий алгоритм кластеризации с учетом применения в нем B+ деревьев

ь реализовано приложение для генерирования баз данных транзакций

ь проведено тестирование приложения, использующего алгоритм LargeItem

Список литературы

1. Лекции “Проектирование систем основанных на знаниях” Подлесных В.Г 2012г

2. Статья Ke Wang, ChuXu, Bing Liu_Clustering Transactions Using Large Items 2003

3. Курс лекции по дисциплине "Проектирование систем основанных на знаниях" дом "Вильямс", 2006

4. "Java2 библиотека профессионала" Кей С. Хорстманн. Гарри Корнелл, Издательский дом "Вильямс", 2006

5. Сайт компании "Инсайт", посвященный MySQL(http://www.mysql.com)

6. Дипломная работа "Разработка алгоритма извлечения ассоциативных правил из множества категориальных данных" Анваера А.Е. за 2008 год.

7. Дипломная работы "Разработка программного обеспечения для реализации и тестирования алгоритма нахождения частых множеств в транзакционных данных вертикального формата" Кызылов А. В. за 2009 год.

8. Сайт компании BaseGroup Labs (http://www.basegroup.ru/)

9. Сайт профессора Кей С. Хорстманна (http://horstmann.com)

10. Сайт компании "Sun MicroSystems"(http://ru.sun.com)

11. An efficient algorithm for mining association rules in large databases. Savasere, E. Omiecinski, and S. Navathe. In Proc. of Intl. Conf. on Very Large Databases (VLDB), 1995.

Приложение 1

Установка и настройка программного обеспечения для работы с приложениями "GeneratorDB", "LargeItem"

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

-виртуальная машина Java

-СУБД

-ODBC драйвер

Виртуальная машина Java

Виртуальная машина Java(JVM - Java Virtual Machine) необходима для запуска и работы приложений. JVM бесплатна и свободно распространяет-

ся в интернете, скачать ее можно с сайта компании "Sun MicroSystems" http://java.sun.com. Инсталлируется JVM достаточно просто.

В процессе работы была использована JSE6. Далее описана инсталляция данного продукта. Для инсталляции необходимо запустить файл jre-6u12-windows-i586-p.exe

Просцесс инсталляции состоит из двух окон:

Рис. 1 Окно инсталляции JSE6

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

Рис. 2 Окно завершения инсталляции J2SE6

СУБД

Можно использовать любую СУБД, поддерживающую SQL запросы. В работе была использована СУБД MySQL 5.1

СУБД MySQL бесплатна, скачать ее можно с сайта www.mysql.com. Скачав данную СУБД, запускаем инсталляционный файл Setup.exe

Первое окно сообщает о версии и релизе продукта. Второе окно предлагает выбрать тип установки (рисунок 3). Подойдет обычная установка - Typical

Следующее окно показывает пользователю, куда будут установлены компоненты продукта (рисунок 4). Изменить их нельзя, поскольку в предыдущем окне был выбран вид установки Typical. Изменение этих параметров, как и многих других, доступно при типе инсталляции Custom

Рис. 3 Окно выбора типа инсталляции MySQL 5.1

Рис. 4 Окно расположения компонентов MySQL 5.1

Далее происходит процесс инсталляции файлов в указанные на рисунке 4 папки.

В окне на рисунке 5 инсталлятор сообщает пользователю, что инсталляция закончена и предлагает провести конфигурацию MySQL сервера(флаг "Configure MySQL server now"). Провести такую конфигурацию можно сразу после инсталляции, если, конечно, вы не хотите конфигурировать сервер позже или вручную.

Рис. 5 Окно окончания инсталляции MySQL 5.1

Окно на рисунке 6 предлагает настроить сервис запуска MySQL сервера при запуске операционной системы Windows. Это необязательно, но в некоторых случаях удобно, иначе придется запускать сервер самостоятельно при каждой загрузке Windows.

Рис. 6 Окно настроек сервера MySQL 5.1

Особенно отмечу, окно на рисунке 7. Дело в том, что после инсталляции сервер MySQL имеет только одну учетную запись администратора с полными правами, имя этой записи "root". Изначально пароль у этой записи отсутствует, руководство по администрированию сервера MySQL настоятельно советует для безопасности и отсутствия проблем доступа к серверу после инсталляции сразу же ввести пароль для учетной записи "root". Это можно сделать в окне на рисунке 7.

Рис. 7 Окно настроек безопасности сервера MySQL 5.1

После смены пароля записи "root" появляется окно процесса настройки рисунок 8.

В окне изображен список настроек, которые будут конфигурироваться. Для запуска процесса конфигурирования нужно нажать кнопку "Execute". Если настройка прошла успешно, то все настройки из списка будут отмечены галочкой (рисунок 9).

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

Из списка кнопки "Пуск" можно вызвать MySQL client и справку по администрированию сервера MySQL 5.1 - MySQL Manual. Это можно сделать следующим образому "Пуск->Все программы->MySQL Server 5.1"

Рис. 8 Окно процесса настройки сервера MySQL 5.1

Рис. 9 Окно завершения процесса настройки сервера MySQL 5.1

ODBC драйвер

Для соединения с базой необходимо установить подходящий для вашей СУБД ODBC драйвер. Обычно его можно бесплатно скачать с сайта производителя СУБД. Установка и настройка драйверов примерно одинаковая для разных СУБД.

Поскольку в работе был использован ODBC драйвер для баз MySQL, то далее будет описан процесс установки и настройки именно этого драйвера.

Драйвер для MySQL можно скачать с сайта www.mysql.com.

Для сервера MySQL 5.1 подходит mysql-connector-odbc-5.1.5. После запуска инсталляционного файла будет проинсталлирован драйвер. Никаких настроек указывать для инсталляции не нужно.

Далее следует создать соединение с базой. Для этого открываем меню "Пуск" выбираем пункт "Выполнить" (в англоязычной версии Window "Run"). В появившейся строке (рисунок 10) вводим команду: odbcad32.exe

Рис. 10 Ввод команды в окно "Выполнить"

Открывается окно со списком источников данных - рисунок 11.

Рис. 11 Окно администратора источников данных

Нажимаем кнопку "Добавить", чтобы создать новый источник данных.

В открывшемся списке доступных драйверов выбираем подходящий (в данном случае это MySQL ODBC Driver 5.1) и нажимаем кнопку "Готово".

Появляется окно параметров источника (рисунок 12). Заполняем настройки и нажимаем кнопку "Тест" для проверки соединения, если проверка завершилась успешно, нажимаем "Ок".

Параметры:

· Data Source Name - имя источника данных. Его необходимо будет указывать во всех программах, используемых в этой работе.

· Description - это комментарий к источнику.

· Server - адрес сервера и порт, через который источник данных будет обращаться к серверу.

Если сервер MySql 5.1 стоит на этом же компьютере, надо указать localhost

· User и Password -логин и пароль пользователя необходимы для авторизации.

Например, можно использовать учетную запись "root" и пароль, который введен при инсталляции и настройке MySQL сервера.

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

Рис. 12 Окно параметров источника данных

Приложение 2

Код приложения "GeneratorDB"

Класс Main

import java.awt.*;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.swing.table.DefaultTableModel;

import java.util.*;

import java.net.URL;

import java.sql.*;

import java.io.*;

import java.util.List;

import javax.swing.DefaultListModel;

import javax.swing.SpinnerNumberModel;

import java.lang.Object;

public class Main extends javax.swing.JFrame {

int products_max = 26;

DefaultTableModel model = new DefaultTableModel();

//Таблица, в которой в одном кортеже содержится один продукт

DefaultTableModel model_compact = new DefaultTableModel();

// Таблица, в которой в одном кортеже содержится весь список

продуктов входящих в данную транзакцию

SpinnerNumberModel spinnerTransNumber_model = new SpinnerNumberModel(100, 0, 100000, 1); // Количество добовляемых транзакций

SpinnerNumberModel spinnerNumElements_model = new SpinnerNumberModel(26,

1, 1000, 1); // Количество видов продуктов

SpinnerNumberModel spinnerMinElements_model = new SpinnerNumberModel(1,

1, 1000, 1); // Минимальное количество продуктов в одной транзакции

SpinnerNumberModel spinnerMaxElements_model = new SpinnerNumberModel(26,

1, 1000, 1);// Максимальное количество продуктов в одной транзакции

DefaultListModel products = new DefaultListModel();//Лист с видами

продуктов

DefaultListModel products_id = new DefaultListModel(); //

Лист с id продуктов которые присутствуют в базе

Map prod; // Отношение (название продукта, номер продукта)

Random generator = new Random();

String alphabet = "abcdefghijklmnopqrstuvwxyz"; // Виды продуктов (для

теста)

String shop[] = {"Молоко", "Хлеб", "Вода", "Пэпси", "Фанта",

"Сникерс", "Спрайт", "Баунти", "Марс", "Кефир",

"Бананы", "Огурцы", "Помидоры", "Яйца", "Картошка",

"Жидкость_для_мытья_посуды", "Шоколад", "Пицца",

"Орехи", "Лук"};

String product_name[] = new String[1000]; // Названия продуктов

int uid = 1, // ID записи

tid = 1; // ID транзакции

int new_num = 2; // Число колонок в model_compact

int product_count[] = new int[1000];// Количетво продуктов вида i в базе

boolean compact = false; // В компактном виде?

List newTrans = new ArrayList();

FileWriter fw;

BufferedWriter bw;

/** Creates new form Main */

public Main() {

this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);

initComponents();

// Связывание моделей таблиц с элементами Swing

jTable.setModel(model);

jRowsNumber.setModel(spinnerTransNumber_model);

jNumElements.setModel(spinnerNumElements_model);

jMinElements.setModel(spinnerMinElements_model);

jMaxElements.setModel(spinnerMaxElements_model);

jVarList.setModel(products);

prod = new HashMap();

for (int i = 0; i < products_max; i++)

product_name[i] = String.valueOf(alphabet.charAt(i));

prod.put(String.valueOf(alphabet.charAt(i)), i);

refreshVars();

refreshAll();

private void initComponents() {

jAddingProductDialog = new javax.swing.JDialog();

jNewProductName = new javax.swing.JTextField();

jLabelProductName = new javax.swing.JLabel();

jAddProduct = new javax.swing.JButton();

jCancelAdding = new javax.swing.JButton();

jChangingProductsDialog = new javax.swing.JDialog();

jMakeAlphabet = new javax.swing.JButton();

jMake1000 = new javax.swing.JButton();

jMakeShopProducts = new javax.swing.JButton();

jCancelChanging = new javax.swing.JButton();

jScrollPane2 = new javax.swing.JScrollPane();

jTable = new javax.swing.JTable();

jRowsNumber = new javax.swing.JSpinner();

jDeleteRow = new javax.swing.JButton();

jNumElements = new javax.swing.JSpinner();

jLabelNumElements = new javax.swing.JLabel();

jRandomize = new javax.swing.JButton();

jLabelTransNum = new javax.swing.JLabel();

jMinElements = new javax.swing.JSpinner();

jMaxElements = new javax.swing.JSpinner();

jLabel2 = new javax.swing.JLabel();

jLabelMinElements = new javax.swing.JLabel();

jLabelMaxElements = new javax.swing.JLabel();

jSetDefaultModel = new javax.swing.JButton();

jCompact = new javax.swing.JToggleButton();

jPanel1 = new javax.swing.JPanel();

jScrollPane3 = new javax.swing.JScrollPane();

jVarList = new javax.swing.JList();

jAddVar = new javax.swing.JButton();

jDeleteVar = new javax.swing.JButton();

jClearTrans = new javax.swing.JButton();

jGenerate = new javax.swing.JButton();

jRandomPlace2 = new javax.swing.JRadioButton();

jOpenAdding = new javax.swing.JButton();

jDefaultProducts = new javax.swing.JButton();

jWrite = new javax.swing.JButton();

jWriteFile = new javax.swing.JTextField();

jOpen = new javax.swing.JButton();

jLabel1 = new javax.swing.JLabel();

jRandomPlace = new javax.swing.JRadioButton();

jNewTrans = new javax.swing.JTextField();

jConsole = new javax.swing.JLabel();

jState = new javax.swing.JProgressBar();

//панель для создания базы

SuperPanel=new javax.swing.JPanel();

UpPanel=new javax.swing.JPanel();

SuperPanel.setLayout(new BorderLayout());

UpPanel.setLayout(new GridBagLayout());

LPanel=new javax.swing.JPanel();

LPanel.setLayout(new GridBagLayout());

RPanel=new javax.swing.JPanel();

RPanel.setLayout(new GridBagLayout());

D1Panel=new javax.swing.JPanel();

D1Panel.setLayout(new GridBagLayout());

D2Panel=new javax.swing.JPanel();

D2Panel.setLayout(new GridBagLayout());

WriteLabel1=new javax.swing.JLabel();

WriteLabel2=new javax.swing.JLabel();

Field2=new javax.swing.JTextField();

//Расположение элементов и на панели

//Верхняя панель

jLabelNumElements.setText("Количество элементов");

jLabelTransNum.setText("Количество транзакций");

jLabel2.setText("Количество элементов в транзакции:");

jLabelMinElements.setText("Минимальное");

jLabelMaxElements.setText("Максимальное");

UpPanel.add(jLabelNumElements,new

GBC(0,0).setAnchor(GBC.WEST).setWeight(0,

0).setInsets(10,10,5,10));

UpPanel.add(jLabelTransNum,new GBC(0,1).setAnchor(GBC.WEST).

setWeight(0,0).setInsets(10,10,5,10));

UpPanel.add(jNumElements,new GBC(1,0).setFill(GBC.HORIZONTAL));

UpPanel.add(jRowsNumber,new GBC(1,1).setFill(GBC.HORIZONTAL));

UpPanel.add(jLabel2,new GBC(2,0,1,2).setInsets(10,10,5,10));

UpPanel.add(jLabelMinElements,new

GBC(3,0).setInsets(10,10,5,10));

UpPanel.add(jLabelMaxElements,new

GBC(3,1).setInsets(10,10,5,10));

UpPanel.add(jMinElements,new GBC(4,0).setWeight(100,

0).setAnchor(GBC.WEST));

UpPanel.add(jMaxElements,new GBC(4,1).setWeight(100,

0).setAnchor(GBC.WEST));

//Левая Панель

jSetDefaultModel.setText("Очистить");

jSetDefaultModel.addActionListener(new

java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jSetDefaultModelActionPerformed(evt);

jCompact.setText("Скомпоновать");

jCompact.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jCompactActionPerformed(evt);

jDeleteRow.setText("Удалить запись");

jDeleteRow.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jDeleteRowActionPerformed(evt);

jRandomize.setText("Добавить случайные транзакции");

jRandomize.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jRandomizeActionPerformed(evt);

jRandomPlace.setText("Случайное место");

jTable.setModel(new javax.swing.table.DefaultTableModel(

new Object [][] {

new String [] {

jTable.setCellSelectionEnabled(true);

jTable.setGridColor(new java.awt.Color(0, 0, 0));

jTable.setSelectionBackground(new java.awt.Color(204, 255, 204));

jTable.setSelectionForeground(new java.awt.Color(51, 51, 51));

jScrollPane2.setViewportView(jTable);

LPanel.add(jSetDefaultModel,new GBC(0,0).setInsets(5,10,5,0));

LPanel.add(jCompact,new GBC(1,0));

LPanel.add(jDeleteRow,new GBC(2,0).setAnchor(GBC.WEST).setWeight(100,0));

LPanel.add(jRandomize,new GBC(0,1,2,1).setInsets(5,10,5,0));

LPanel.add(jRandomPlace,new GBC(2,1).setAnchor(GBC.WEST).setWeight(100, 0));

LPanel.add(jScrollPane2,new GBC(0,2,3,3).setFill(GBC.BOTH).setWeight(100,

100).setInsets(5,10,10,10));

//Правая панель

jOpenAdding.setText("Добавить продукт");

jOpenAdding.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jOpenAddingActionPerformed(evt);

jDefaultProducts.setText("Шаблоны");

jDefaultProducts.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jDefaultProductsActionPerformed(evt);

jDeleteVar.setText("Удалить из базы");

jDeleteVar.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jDeleteVarActionPerformed(evt);

jScrollPane3.setViewportView(jVarList);

jAddVar.setText("Добавить в транзакцию");

jAddVar.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jAddVarActionPerformed(evt);

jClearTrans.setText("Очистить транзакцию");

jClearTrans.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jClearTransActionPerformed(evt);

jGenerate.setText("Добавить");

jGenerate.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jGenerateActionPerformed(evt);

jRandomPlace2.setText("Случайное место");

jWrite.setText("Записать");

jWrite.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jWriteActionPerformed(evt);

jWriteFile.setText("");

WriteLabel1.setText("ODBC драйвер:");

WriteLabel2.setText("Имя базы:");

Field2.setText("");

RPanel.add(jOpenAdding,new GBC(0,0).setInsets(10,0,0,0));

RPanel.add(jDeleteVar,new GBC(1,0).setInsets(10,0,0,0).setAnchor(GBC.WEST));

RPanel.add(jDefaultProducts,new GBC(2,0).setInsets(10,0,0,10).setWeight(100,

0).setAnchor(GBC.WEST).setFill(GBC.NONE));

RPanel.add(jScrollPane3,new GBC(0,1,3,3).setFill(GBC.BOTH).setWeight(100,

100).setInsets(10,0,0,10));

RPanel.add(jWrite,new GBC(0,6).setInsets(5,20,10,0).setFill(GBC.HORIZONTAL));

RPanel.add(WriteLabel1,new GBC(1,6).setInsets(5,30,10,0).setAnchor(GBC.WEST));

RPanel.add(jWriteFile,newGBC(2,6).setInsets(5,0,10,10).

setFill(GBC.HORIZONTAL).setAnchor(GBC.WEST).setWeight(100,0));

RPanel.add(WriteLabel2,new GBC(1,7).setInsets(5,30,10,0).setAnchor(GBC.WEST));

RPanel.add(Field2,new GBC(2,7).setInsets(5,0,10,10).setFill(GBC.HORIZONTAL).

setAnchor(GBC.WEST).setWeight(100,0));

//Диалог добавления продукта

jAddingProductDialog.setResizable(false);

jLabelProductName.setText("Имя продукта");

jAddProduct.setText("Ок");

jAddProduct.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jAddProductActionPerformed(evt);

jCancelAdding.setText("Отмена");

jCancelAdding.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jCancelAddingActionPerformed(evt);

D1Panel.add(jLabelProductName,new GBC(0,0).setAnchor(GBC.WEST).setInsets(5, 10, 15, 10));

D1Panel.add(jNewProductName,new GBC(1,0).setWeight(100,

0).setFill(GBC.HORIZONTAL).setInsets(5, 0, 5, 10));

D1Panel.add(jAddProduct,new GBC(0,1).setAnchor(GBC.EAST).setInsets(0, 0, 0, 10));

D1Panel.add(jCancelAdding,new GBC(1,1).setAnchor(GBC.WEST));

jAddingProductDialog.add(D1Panel);

//Выбор элементов

jChangingProductsDialog.setResizable(false);

jMakeAlphabet.setText("Алфавит");

jMakeAlphabet.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jMakeAlphabetActionPerformed(evt);

jMake1000.setText("1000 элементов");

jMake1000.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jMake1000ActionPerformed(evt);

jMakeShopProducts.setText("Магазин");

jMakeShopProducts.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jMakeShopProductsActionPerformed(evt);

jCancelChanging.setText("Отмена");

jCancelChanging.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jCancelChangingActionPerformed(evt);

D2Panel.add(jMakeAlphabet,new GBC(0,0).setInsets(10,10,5,10).

setFill(GBC.HORIZONTAL));

D2Panel.add(jMake1000,new GBC(0,1).setInsets(5,10,5,10).setFill(GBC.HORIZONTAL));

D2Panel.add(jMakeShopProducts,new GBC(0,2).setInsets(5,10,5,10).

setFill(GBC.HORIZONTAL));

D2Panel.add(jCancelChanging,new GBC(0,3).setInsets(5,10,10,10).

setFill(GBC.HORIZONTAL));

jChangingProductsDialog.add(D2Panel);

SuperPanel.add(UpPanel,BorderLayout.NORTH);

SuperPanel.add(LPanel,BorderLayout.WEST);

SuperPanel.add(RPanel,BorderLayout.EAST);

this.add(SuperPanel);

pack();

// Добавление колонки

// Добавление транзакций в таблицу model

private void jGenerateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-int random; // Курсор указывающий на место, куда будет вставляться новая транзакция

if (newTrans.size() == 0 && jVarList.getSelectedIndex() == -1)

return;

jConsole.setText("Добавление транзакций...");

jConsole.paintImmediately(0, 0, 2000, 50);

jState.setMinimum(0);

jState.setMaximum(spinnerTransNumber_model.getNumber().intValue());

jState.setStringPainted(true);

jState.setValue(0);

if (jVarList.getSelectedIndex() != -1) // Если есть выделенные продукты в списке

newTrans.clear();

int listSelected[] = jVarList.getSelectedIndices();

for (int j = 0; j < listSelected.length; j++)

newTrans.add(product_name[listSelected[j]]);

jNewTrans.setText(newTrans.toString());

for (int i = 0; i < spinnerTransNumber_model.getNumber().intValue(); i++)

if (jRandomPlace2.isSelected() && model.getRowCount() != 0)

random = generator.nextInt(model.getRowCount());

while (random != 0 && model.getValueAt(random-1,

0).toString().equals(model.getValueAt(random, 0).toString()))

random--;

else

random = 0;

for (int j = 0; j < newTrans.size(); j++)

Object toBeAdded[] = new Object[2];

toBeAdded[0] = tid;

toBeAdded[1]= newTrans.get(j);

if (jRandomPlace2.isSelected())

model.insertRow(random+j, toBeAdded);

else

model.addRow(toBeAdded);

product_count[Integer.valueOf(prod.get(newTrans.get(j).toString()).toString())]++;

tid++;

jState.setValue(i);

jState.paintImmediately(0, 0, 2000, 50);

jState.setValue(0);

jConsole.setText("");

if (compact)

compact();

else

refreshVars();

}//GEN-LAST:event_jGenerateActionPerformed

// Проверка на правильность заполнения полей

private boolean allIsCorrect() {

if (spinnerMaxElements_model.getNumber().intValue() >

spinnerNumElements_model.getNumber().intValue() ||

spinnerMinElements_model.getNumber().intValue() >

spinnerMaxElements_model.getNumber().intValue() ||

spinnerMinElements_model.getNumber().intValue() > products_max ||

spinnerMaxElements_model.getNumber().intValue() > products_max ||

spinnerNumElements_model.getNumber().intValue() > products_max)

return false;

return true;

// Удаление элемента из транзакции (только для не компактного режима)

private void jDeleteRowActionPerformed(java.awt.event.ActionEvent evt)

while (jTable.getSelectedRow() != -1)

product_count[

Integer.valueOf(

prod.get(

model.getValueAt(jTable.getSelectedRow(), 1).toString()

).toString()

model.removeRow(jTable.getSelectedRow());

refreshVars();

// Добавление случайных транзакций в таблицу model

private void jRandomizeActionPerformed(java.awt.event.ActionEvent evt)

if (!allIsCorrect())

return;

List listElemenets = new ArrayList(); // Список имён продуктов, из которых выбирается

//следующий продукт случайным образом

Object[] toBeAdded = new Object[2]; // (номер транзакции, имя продукта) для следующего

добавления

int numElements,

minElements = spinnerMinElements_model.getNumber().intValue(),

maxElements = spinnerMaxElements_model.getNumber().intValue();

int random; // Курсор указывающий на место, куда будет вставляться новая транзакция

jConsole.setText("Добавление случайных транзакций...");

jConsole.paintImmediately(0, 0, 2000, 50);

jState.setMinimum(0);

jState.setMaximum(spinnerTransNumber_model.getNumber().intValue());

jState.setStringPainted(true);

jState.setValue(0);

for (int i = 0; i < spinnerTransNumber_model.getNumber().intValue(); i++) // Цикл по количиству

транзакций

listElemenets.clear();

// Заполнение списка продуктов

if (jVarList.getSelectedIndex() != -1) // Если есть выделенные продукты в списке

int listSelected[] = jVarList.getSelectedIndices();

for (int j = 0; j < listSelected.length; j++)

listElemenets.add(product_name[listSelected[j]]);

//listElemenets_id.add(listSelected[j]);

if (minElements > listSelected.length)

minElements = listSelected.length;

if (maxElements > listSelected.length)

maxElements = listSelected.length;

else // Если нет выделенных продуктов в списке

for (int j = 0; j < spinnerNumElements_model.getNumber().intValue(); j++)

listElemenets.add(product_name[j]);

// Генерация числа продуктов в транзакции

numElements = generator.nextInt( maxElements -

minElements + 1 )

minElements;

// Вставка новых транзакций

if (jRandomPlace.isSelected() && model.getRowCount() != 0)

random = generator.nextInt(model.getRowCount());

while (random != 0 && model.getValueAt(random-1, 0).toString().equals(model.getValueAt(random, 0).toString()))

random--;

else

random = 0;

for (int k = 0; k < numElements; k++)

int element = generator.nextInt(listElemenets.size());

toBeAdded[0] = tid;

toBeAdded[1] = listElemenets.get(element);

product_count[Integer.valueOf(prod.get(listElemenets.get(element).toString()).toString())]++;

if (jRandomPlace.isSelected())

model.insertRow(random + k, toBeAdded);

else

model.addRow(toBeAdded);

listElemenets.remove(element);

tid++;

jState.setValue(i);

jState.paintImmediately(0, 0, 2000, 50);

jState.setValue(0);

jConsole.setText("");

if (compact)

compact();

else

refreshVars();

// Запись в базу

private void jWriteActionPerformed(java.awt.event.ActionEvent evt) {

Connection con;

String ProdApp;

String BufUniqKey;

int Buf;

String UpdTrans;

if ((jWriteFile.getText().equals("") || Field2.getText().equals(""))==false) {

try {

String CreateDB="CREATE DATABASE "+Field2.getText();

//String CreateTov="use "+Field2.getText()+"; CREATE TABLE TOVARS(UNIQKEY varchars(10) primary key);";

String CreateTov="CREATE TABLE "+Field2.getText()+".TOVARS(UNIQKEY varchar(10) primary key,TITLE varchar(50) NOT NULL )";

String CreateTrans="CREATE TABLE "+Field2.getText()+".TRANS(TID varchar(10), ELEM varchar(10) references "+Field2.getText()+".TOVARS(UNIQKEY))";

String url = "jdbc:odbc:"+jWriteFile.getText()+";";

Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");

DriverManager.setLogStream(System.out);

con = DriverManager.getConnection (

url,"" ,"" );

DatabaseMetaData dma = con.getMetaData ();

Statement stmt = con.createStatement ();

stmt.executeUpdate (CreateDB);

stmt.executeUpdate(CreateTov);

//заполнение таблицы товаров;

for (int i = 0; i < products_max; i++)

Buf=i+1;

ProdApp="INSERT INTO "+Field2.getText()+".TOVARS (UNIQKEY, TITLE) VALUES ('"+Buf+"', '"+product_name[i]+"')";

stmt.executeUpdate(ProdApp);

//Таблица транзакций

stmt.executeUpdate (CreateTrans);

for (int j = 0; j < model.getRowCount(); j++) // Цикл по записям в model

BufUniqKey="";

for (int i = 0; i < products_max; i++){

if(model.getValueAt(j, 1).toString().equalsIgnoreCase(product_name[i])){

BufUniqKey= Integer.toString(i+1);

System.out.println("Trans "+model.getValueAt(j, 0).toString()+"="+BufUniqKey);

UpdTrans="INSERT INTO "+Field2.getText()+".TRANS (TID, ELEM) VALUES ('"+model.getValueAt(j, 0).toString()+"', '"+BufUniqKey+"')";

stmt.executeUpdate (UpdTrans);

catch (java.lang.Exception ex) {

// Получив некоторые другие типы exception, распечатаем их.

ex.printStackTrace ();

// Заполнение таблицы по шаблону addColumns(tid, random)

private void clearModel(DefaultTableModel model) {

model.setRowCount(0);

model.setColumnCount(0);

model.addColumn("TID");

model.addColumn("Product");

// Очистка таблиц

private void refreshAll() {

clearModel(model);

clearModel(model_compact);

jNewTrans.setText(newTrans.toString());

for (int i = 0; i < products_max; i++)

product_count[i] = 0;

private void jSetDefaultModelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jSetDefaultModelActionPerformed

refreshAll();

refreshVars();

// Удаление продукта

private void jDeleteVarActionPerformed(java.awt.event.ActionEvent evt) {

if (jVarList.getSelectedIndex() == -1)

return;

String selectedIndex = product_name[

Integer.valueOf(

products_id.getElementAt(

jVarList.getSelectedIndex()

).toString()

for (int i = model.getRowCount()-1; i >= 0; i--)

if (model.getValueAt(i, 1).toString().equals( selectedIndex ))

model.removeRow(i);

product_count[Integer.valueOf(products_id.getElementAt(jVarList.getSelectedIndex()).toString())] = 0;

products_id.remove(jVarList.getSelectedIndex());

if (compact)

compact();

else

refreshVars();

// Переход к виду model_compact (в одной записи все продукты транзакции)

private void compact() {

if (model.getRowCount() == 0)

model_compact.setRowCount(0);

return;

jConsole.setText("Компоновка...");

jConsole.paintImmediately(0, 0, 2000, 50);

jState.setMinimum(0);

jState.setMaximum(model.getRowCount());

jState.setStringPainted(true);

jState.setValue(0);

String last_tid;

Object obj[] = new Object[2];

model_compact.setRowCount(0);

model_compact.setColumnCount(0);

model_compact.addColumn("TID");

model_compact.addColumn("Product");

SortedSet products_ = new TreeSet();

last_tid = model.getValueAt(0, 0).toString();

for (int j = 0; j < model.getRowCount(); j++) // Цикл по записям в model

if (model.getValueAt(j, 0).toString().equalsIgnoreCase(last_tid)) // Если продолжается транзакция

products_.add(model.getValueAt(j, 1).toString());

else // Если новая транзакция

obj[0] = last_tid;

obj[1] = products_.toString();

model_compact.addRow(obj);

last_tid = model.getValueAt(j, 0).toString();

products_.clear();

products_.add(model.getValueAt(j, 1).toString());

jState.setValue(j);

jState.repaint();

jState.paintImmediately(0, 0, 2000, 50);

// Добавление последней транзакции

obj[0] = last_tid;

obj[1] = products_.toString();

model_compact.addRow(obj);

refreshVars();

jState.setValue(0);

jConsole.setText("");

// Перевод базы данных в компактный вид (нажатие кнопки)

private void jCompactActionPerformed(java.awt.event.ActionEvent evt) {

if (!compact)

compact();

jTable.setModel(model_compact);

compact = true;

else

jTable.setModel(model);

compact = false;

jDeleteRow.setEnabled(!compact);

}//GEN-LAST:event_jCompactActionPerformed

// Обновление списка элементов

private void refreshVars() {

String buf;

products.clear();

products_id.clear();

for (int i = 0; i < products_max; i++)

//if (product_count[i] != 0)

buf = (i+1) + ". " + product_name[i] + "(" + product_count[i] + ")";

products.addElement(buf);

products_id.addElement(i);

private void formMouseReleased(java.awt.event.MouseEvent evt) {

refreshVars();

jConsole.setText("");

// Добавление переменной в новую транзакцию

private void jAddVarActionPerformed(java.awt.event.ActionEvent evt) {

if (jVarList.getSelectedIndex() == -1 || newTrans.contains(product_name[Integer.valueOf(products_id.getElementAt(jVarList.getSelectedIndex()).toString())]))

return;

int listSelected[] = jVarList.getSelectedIndices();

for (int j = 0; j < listSelected.length; j++)

newTrans.add(product_name[listSelected[j]]);

jNewTrans.setText(newTrans.toString());

// Очистка списка элементов в новой транзакции

private void jClearTransActionPerformed(java.awt.event.ActionEvent evt) {

newTrans.clear();

jNewTrans.setText("");

// Чтение базы данных из файла

private void jOpenActionPerformed(java.awt.event.ActionEvent evt) {

FileReader fr = null;

try {

fr = new FileReader(jWriteFile.getText());

BufferedReader br = new BufferedReader(fr);

int tranNum = 1;

String s = br.readLine();

Object[] o = new Object[2];

while (s != null)

StringTokenizer dataLine = new StringTokenizer(s);

int tranSize = dataLine.countTokens();

for (int i = 0; i < tranSize; i++)

o[0] = tranNum;

o[1] = dataLine.nextToken();

model.addRow(o);

tranNum++;

s = br.readLine();

} catch (IOException ex) {

Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);

} finally {

try {

fr.close();

} catch (IOException ex) {

Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);

// Отмена добавления (закрытие окна)

private void jCancelAddingActionPerformed(java.awt.event.ActionEvent evt) {

jAddingProductDialog.setVisible(false);

// Добавление нового типа продукта

private void jAddProductActionPerformed(java.awt.event.ActionEvent evt)

if (products_max >= 1000)

return;

for (int i = 0; i < products_max; i++)

if (product_name[i].equalsIgnoreCase(jNewProductName.getText()))

return;

product_name[products_max] = String.valueOf(jNewProductName. getText());

prod.put(String.valueOf(jNewProductName.getText()), products_max);

products_max++;

jAddingProductDialog.setVisible(false);

refreshVars();

// Открытие окна для добавления нового типа продукта

private void jOpenAddingActionPerformed(java.awt.event.ActionEvent evt)

jAddingProductDialog.setSize(330, 100);

jAddingProductDialog.setVisible(true);

refreshVars();

}//GEN-LAST:event_jOpenAddingActionPerformed

private void jDefaultProductsActionPerformed(java.awt.event.ActionEvent evt) {

jChangingProductsDialog.setSize(155, 180);

jChangingProductsDialog.setVisible(true);

private void jMake1000ActionPerformed(java.awt.event.ActionEvent evt) {

products_max = 1000;


Подобные документы

  • Сущность и понятие кластеризации, ее цель, задачи, алгоритмы; использование искусственных нейронных сетей для кластеризации данных. Сеть Кохонена, самоорганизующиеся нейронные сети: структура, архитектура; моделирование кластеризации данных в MATLAB NNT.

    дипломная работа [3,1 M], добавлен 21.03.2011

  • Основы для проведения кластеризации. Использование Data Mining как способа "обнаружения знаний в базах данных". Выбор алгоритмов кластеризации. Получение данных из хранилища базы данных дистанционного практикума. Кластеризация студентов и задач.

    курсовая работа [728,4 K], добавлен 10.07.2017

  • Анализ проблем, возникающих при применении методов и алгоритмов кластеризации. Основные алгоритмы разбиения на кластеры. Программа RapidMiner как среда для машинного обучения и анализа данных. Оценка качества кластеризации с помощью методов Data Mining.

    курсовая работа [3,9 M], добавлен 22.10.2012

  • Характеристика методов нечеткого моделирования и изучение системы кластеризации в пакетах прикладных программ. Разработка и реализация алгоритма для оптимизации базы правил нечеткого классификатора с помощью генетического алгоритма аппроксимации функции.

    дипломная работа [1,9 M], добавлен 21.06.2014

  • Описание функциональных возможностей технологии Data Mining как процессов обнаружения неизвестных данных. Изучение систем вывода ассоциативных правил и механизмов нейросетевых алгоритмов. Описание алгоритмов кластеризации и сфер применения Data Mining.

    контрольная работа [208,4 K], добавлен 14.06.2013

  • Обзор методов реализации алгоритмов искусственного интеллекта. Примеры интеллектуальных систем, основанных на алгоритмах самообучения и кластеризации данных. Создание общей структурной схемы. Выбор языков программирования и инструментальных средств.

    дипломная работа [1,6 M], добавлен 20.08.2017

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

    курсовая работа [1,8 M], добавлен 30.06.2017

  • Проблема улучшения качества отпечатков пальца с целью повышения эффективности работы алгоритмов биометрической аутентификации. Обзор алгоритмов обработки изображений отпечатков пальцев. Анализ алгоритма, основанного на использовании преобразования Габора.

    дипломная работа [4,5 M], добавлен 16.07.2014

  • Классификация задач Data Mining. Задача кластеризации и поиска ассоциативных правил. Определению класса объекта по его свойствам и характеристикам. Нахождение частых зависимостей между объектами или событиями. Оперативно-аналитическая обработка данных.

    контрольная работа [26,1 K], добавлен 13.01.2013

  • Общее понятие алгоритма и меры его сложности. Временная и емкостная сложность алгоритмов. Основные методы и приемы анализа сложности. Оптимизация, связанная с выбором метода построения алгоритма и с выбором методов представления данных в программе.

    реферат [90,6 K], добавлен 27.11.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.