Розробка універсального алгоритму із застосуванням методу віток та меж

Обчислення оптимальних показників на основі математичних розрахунків. Спрощена математична модель. Перебір варіантів булевих змінних і вибір оптимального за цільовою функцією. Теоретичні положення методу гілок та меж. Кінцева множина допустимих рішень.

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

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

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

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

ЗМІСТ

  • 1. Постановка задачі

1.1 Змістовна постановка задачі

  • 1.2 Математична модель
  • 1.2.1 Дані
  • 1.2.2 Цільова функція
  • 1.2.3 Обмеження
  • 1.3 Спрощена математична модель
  • 1.3.1 Дані
  • 1.3.1 Цільова функція
  • 1.3.3 Обмеження
  • 2. Алгоритм розв'язання задачі
  • 2.1 Огляд методів розв'язання задачі
  • 2.2 Теоретичні положення методу гілок та меж
  • 2.2.1 Вступ
  • 2.2.2 Розгалуження
  • 2.2.3 Бінарне розбиття
  • 2.2.4 Розбиття по компонентах
  • 2.2.5 Оцінка
  • 2.2.1 Рекорд
  • 2.2.1 Тест
  • 2.3 Схема алгоритму розв'язання задачі
  • 2.4 Метод гілок та меж для задачі з булевими змінними
  • 2.4.1 Вступ
  • 2.4.1 Правило галуження
  • 2.4.1 Тест
  • 2.5 Оцінка трудомісткості алгоритму
  • 3. Опис програмної реалізації
  • 3.1 Вхідні дані
  • 3.2 Вихідні дані
  • 3.3 Опис програмного продукту
  • 3.4 Інструкція користувача
  • 4. Приклади застосування методу
  • 4.1 Приклад 1
  • 4.1.1 Цільова функція
  • 4.1.2 Обмеження
  • 4.13 Розв'язок засобами Excel
  • 4.2 Приклад 2
  • 4.2.1 Цільова функція
  • 4.2.2 Обмеження
  • 4.2.3 Розв'язок засобами Excel
  • 4.2.4 Розв'язок за допомогою програми
  • Висновки
  • Перелік посилань
  • Додаток А

1. Постановка задачі

1.1 Змістовна постановка задачі

Користувач(гравець) - власник піцерії з певним стартовим капіталом, повинен закупити обладнання, наняти працівників, купити рецепти, закупити та налагодити поставки інгредієнтів та товарів в піццерію. Паралельно розвиваються в місті конкуренти, тому йому потрібно дбати про рекламу, якість обслуговування (кваліфікація нанятих працівників), старатися мінімізувати ціну піци також на популярність впливають наявність асортименту і комфорт всередині будівлі піццерії, яку можна тюнінгувати рослинами, водовідводом, туалетами і т.д.

Користувач виконуючи певні дії може або покращити або погіршити свою популярність. Що вплине на кількість відвідувачів і прибуток. При певному проценті популярності гра закінчується і користувач перемагає (абсолютна монополія:-))))

Користувач матиме можливість в кінці виконаного ходу проглянути в пункті меню «Статистика» порівняльні характеристики його дій з оптимальними показниками. Оптимальні показники обчислюються на основі математичних розрахунків.

Спрощена постановка задачі матиме вигляд представлений нижче

1.2 Математична модель

1.2.1 Дані

У даній задачі представлено такі змінні:

- кількість виготовлених піц j-того виду

;

-

;

- частка націнки на піцу j-того виду ; ;

Також в задачі представлено такі константи:

- бюджет (максимально допустимі витрати) (грн) ;

- погнозована загальна кількість замовлених піц ;

T - обмеження надприбутку

- початкові капіталовкладення в j-тий вид піцци (грн), ;

- собівартість j-того виду піци (грн), ;

- частка попиту на j-тий вид піцци , ;

? безкінечно велике число.

1.2.2 Цільова функція

Максимізація прибутку

1.2.3 Обмеження

Обмеження розділяються на три групи, перша з них стосується об'ємів виготовлення:

Друга група стосується обмежень витрат:

Третя група стосується обмежень на попит

1.3 Спрощена математична модель

Спрощена математична модель відповідає математичній моделі яка переводить задачу з класу дискретних до класу неперервних задач, знявши обмеження

1.3.1 Дані

У даній задачі представлено такі змінні:

- кількість виготовлених піц j-того виду

;

-

;

- частка націнки на піцу j-того виду ; ;

Також в задачі представлено такі константи:

- бюджет (максимально допустимі витрати) (грн) ;

- прогнозована загальна кількість замовлених піц ;

T - обмеження надприбутку

- початкові капіталовкладення в j-тий вид піцци (грн), ;

- собівартість j-того виду піци (грн), ;

- частка попиту на j-тий вид піцци , ;

? безкінечно велике число.

1.3.2 Цільова функція

Максимізація прибутку

1.3.3 Обмеження

Обмеження розділяються на три групи, перша з них стосується об'ємів виготовлення:

Друга група стосується обмежень витрат:

Третя група стосується обмежень на попит

2. Алгоритм розв'язання задачі

2.1 Огляд методів розв'язання задачі

Для даного типу задач немає певного сталого методу розв'язання задач. Метод розв'язку підбирається відповідно до специфіки та особливостей задачі. Для даної задачі можна розглянути такі методи:

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

Інший варіант розв'язку задачі є зняття обмежень булевих змінних зробивши їх неперервними, але обмежити їх зверху одиницею а знизу нулем, і вирішувати задачу як частково цілочисельну.

Модифікований метод гілок та меж, про нього більш детально буде описано в наступному пункті.

Серед принятих до розгляду методів науковці схиляються до використання методу гілок та меж для такої конфігурації задачі. Не проводячи складних розрахунків можна зазначити що комбінаторний метод виконає більше а в гіршому випадку рівну кількість ітерації як метод гілок та меж. Мінусом другого методу є те що рішення цілочисельної задачі має більшу складність чим неперервної.

Математична модель задачі належить до класу задач дискретного програмування.

2.2 Теоретичні положення методу гілок та меж

2.2.1 Вступ

На практиці часто виникають завдання вибору оптимальних рішень дискретного характеру. При цьому розрізняють завдання чисто комбінаторного типу, безлічі допустимих рішень яких є кінцевими; задачі цілочислового програмування, в яких змінні приймають цілочисельні значення; завдання частково цілочисельного програмування, в яких тільки частина змінних приймає цілочисельні значення. Завдання, які ставляться до комбінаторним, зазвичай зручніше представляти, використовуючи поняття теорії графів або теорії матроідов. Завдання цілочисельного програмування зручніше представляти використовуючи поняття математичного програмування. [1].

Нехай маємо задачу дискретного програмування:

(2.1)

(2.2)

де - кінцева множина допустимих рішень.

Метод гілок і меж належить до групи методів, які враховують комбінаторний характер завдання, тобто дискретність всіх або окремих змінних. Метод базується на впорядкованому переборі рішень, розгляд лише тих рішень, які є за певними ознаками перспективними, і відкиданні відразу цілих множин рішень, які безперспективні.

Вперше цей метод запропонували Ленд і Дойг в 1960 р. для задачі цілочислового лінійного програмування. Однак по-справжньому метод був оцінений після роботи Літтла, Мурті, Суїні і Керела, присвяченій завданню комівояжера, які дали назву методу і звернули увагу на його загальний характер.

Алгоритми методів гілок і меж можуть бути описані за допомогою декількох ключових понять: розгалуження, оцінки, рекорду, тесту, стратегії.

Розглянемо загальну схему розв'язання задачі (2.1) - (2.2) і використання методу вірі і меж для вирішення задачі цілочисельного лінійного програмування, завдання комівояжера і завдання про знаходження найкоротшого шляху в мережі.

2.2.2 Розгалуження

Передбачається що існує правило , яке зіставляє будь-якій множині скінченну кількість множин таких, що множина множин являєтся розбиттям множини (разбиття множини - множина множин, які взаємно не перетинаються в об'єднанні дають ). Разбиття множини будемо позначати так:

.

Відносно правила разбиття множини в ідеальному випадку передбачається:

- якщо потужність множини , тоді ;

- якщо , тоді множина не може бути разбита на підмножини, тобто в цьому випадку .

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

Для кожної конкретної задачі існує багато способів розгалуження множини її рішень в виді дерева . Найбільш широко використовуются два наступних правила розгалуження:

- бінарне розгалуження;

- розгалуження по компонентах.

2.2.3 Бінарне розбиття

Зв'язано з розбиттям множини рішень по деякому признаку на дві підмножини, які не перетинаються: та і при цьому . Дерево розбиття для цього способу має вигляд, показаний на рисунку 2.1 Такі дерева називаются бінарними.

математичний модель булевий рішення

Рисунок 2.1 - Бінарне розбиття

2.2.4 Розбиття по компонентах

Реализуєтся шляхом фіксації значень змінних. Покомпонентне розбиття можливе, якщо множина може бути задана обмеженнями виду:

Для цього способу розбиття дерево має вид, показаний на рисунку 2.2.

Рисунок 2.2 - Розбиття по компонентах

2.2.5 Оцінка

В методі вітвок і меж для каждої з подмножин множини допустимих рішень визначається оцінка (нижня границя) значень цільової функції. Оцінка являєтся функцією і в ідеальному випадку має наступні властивості:

- (в задачі на максимум має знак “”);

- , якщо і ;

- , якщо (в випадку задачі на максимум ).

Для обчислення оцінки може бути вирішена деяка оптимізаційна задача простої структури:

(2.3)

що являєтся оцінкою для задачі:

(2.4)

Від оціночної задачі потрібне виконання наступних умов:

- якщо оціночна задача (2.3) не має допустимих рішень, тоді і задача (2.4) не має допустимих рішень;

- значення цільової функції вирішення задачі (2.3) не гірше, ніж значення цільової функції вирішення задачі (2.4).

2.2.6 Рекорд

При вирішенні оціночних завдань можуть бути знайдені допустимі рішення задачі (2.4), а значить і задачі (2.1) - (2.2). Найкраще значення цільової функції задачі (2.1) - (2.2), яке досягається на множині знайдених допустимих рішень, називається рекордом, а відповідно допустиме рішення називається рекордним.

Якщо на даному кроці допустимі решення задачі (2.1)-(2.2) не знайдені, тоді рекорд вважаєтьсяся рівним . Далі поточне значення рекорда будемо позначати .

2.2.7 Тест

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

Тест. Якщо для деякої множини справедливо, що тоді множина виключаєтся із подальшошего розгляду.

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

Для конкретних завдань вдається будувати і інші емпіричні тести, які грунтуються на необхідних умовах оптимальності або будь-яких інших положеннях.

Розглянемо ключові поняття для конкретно даної задачі

Маємо задачу дискретного програмування

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

Оцінка визначатиметься розв'язком спрощеної задачі з накладанням певного обмеження на кожному етапі розбиття.

Розбиття виконуватимемо по правилу

.

2.3 Схема алгоритму розв'язання задачі

Введемо позначення: - поточний список підмножини множини .

КРОК 0. Анализ множини .

Обчислити оцінку . Нехай - множина допустимих рішень, які отримані при оцінюванні множини .

Якщо , то вважаємо, що , .

Якщо і для найкращого з цих рішень виконується рівність

(2.5)

тоді - рішення задачі, КІНЕЦЬ.

Якщо рівність (2.5) не виконується, тоді ввіжаємо, що.

КРОК 1. Аналіз списка.

Якщо список не пустий, тогді перейти на крок 2, інакше - зупинити обчислення. При цьому:

якщо , тоді - значення початкової задачі, а відповідне рекорду рішення - рішення задачі;

якщо , тоді початкова задача не має допустимих рішень.

КРОК 2. Вибір множини для розгалуження.

Вибрати з списка множину згідно з правилом:

.

КРОК 3. Розгалуження.

Отримати множину

,..

КРОК 4. Аналіз потомків.

Обчислити оцінку для елементів з

.

КРОК 5. Редагування рекорда.

При оцінювання множин допустимі рішення початкової задачі могли стати відомими. Нехай - така множина допустимих рішень.

Якщо , тоді .

КРОК 6. Тест.

Сформувати новий список по правилу:

,.

(при цьому з урахуванням того, що рекорд міг змінитися, з списка будуть виключені всі подмножини , оцінка яких гірше, ніж у рекорда). Перехід на КРОК 1.

2.4 Метод гілок та меж для задачі з булевими змінними

2.4.1 Вступ

Використовувати будемо задачу зведену до спрощеної математичної моделі.

У нас є булевих змінних

2.4.2 Правило галуження та оцінка

Вибираємо по порядку змінні з списку булевих змінних. Розгалужуємо по правилу =0 та =1.

Оціночну задачу отримуємо додаючи до спрощеної математичної моделі по черзі ці обмеження. Розвязуємо задачу квадратичного програмування, та отримуємо певне значення цільової функції Z та та змінних .

Будуємо дерево по правилу як зображено на рисунку 2.3.

Рисунок 2.3 - Правило галуження

Для кожної вершини дерева значення спрощеної задачі дає нижню оцінку відповідної множини розв'язків.

2.4.3 Тест

Припустимо, що рекордний розв'язок(найкращий допустимий, знайдений до поточного моменту часу) має значення цільової функції (рекорд). І нехай в дереві галуження є вершина з нижньою оцінкою . Це означає, що будь-який допустимий розв'язок , який можна отримати в результаті розробки цієї вершини буде мати гірше значення цільової функції. Отже, немає сенсу розгалужувати цю вершину. Таким чином ця вершина може бути виключена з розглядання.

2.5 Оцінка трудомісткості алгоритму

Нехай кількість змінних булевого типу, тоді можливі два варіанта для першої змінної, 4 для другої, 8 для третьої і т.д. Отже, максимальна кількість ітерацій рівна при цьому мінімальна кількість рівна , тобто на кожному рівні розглядабться всього 2 варіанта.

3. Опис програмної реалізації

Для розв'язання задачі був створений програмний продукт. Для написання програми було обрано Oracle JDeveloper 11g.

JDeveloper - безкоштовне інтегроване середовище розробки програмного забезпечення, розроблена корпорацією Oracle. Надає можливість для розробки на мовах програмування Java, XML, SQL і PL / SQL, HTML, JavaScript, BPEL і PHP. JDeveloper покриває весь життєвий цикл розробки програмного забезпечення від проектування, кодування, налагодження, оптимізації та профілювання до його розгортання.[2]

Виробник зазначає в якості основного завдання середовища - максимальне використання можливостей візуального та декларативного підходу до розробки програмного забезпечення на додаток до зручної середовищі кодування. Oracle JDeveloper інтегрована з Oracle Application Development Framework - Java EE-каркасом для створення комерційних додатків на Java. [2]

Розроблений програмний продукт має наступні можливості:

- розв'язання задачі методом гілок та меж

- відображення результатів розв'язання у вигляді дерева;

- відображення оптимального результату;

- відображення оптимального шляху;

3.1 Вхідні дані

Вхідними даними є:

таблиця в базі даних що містить такі поля:

id - індифікатор поля;

p_id - посилання на батьківський ідентифікатор;

var_name - назва булевої змінної;

val_var - буливе значеня змінної;

val_comb - значення цільової функції.

3.2 Вихідні дані

Вихідними даними є:

- оптимальне значення цільової функції;

- оптимальні значення змінних.

- хід розв'язання у вигляді дерева

3.3 Опис програмного продукту

Програмний продукт отримує дані з таблиць, аналізує їх і створює нову таблицю що містить використані програмою дані. В майбутньому до програми може бути дороблено спеціальний модуль який реалізовуватиме задачу квадратного програмування та розв'язуватиме задачу повністю обмінюючись даними між програмою базою та модулем.

Також програмний продукт надає можливість побачити дерево розвязку, шлях до оптимального розвязку та сам оптимальний результат.

Специфікація функцій програмного продукту наведена у таблиці 3.1.

Таблиця 3.1 - Специфікація функцій програмного продукту

Функції

Опис функції

Start.fCreatedForm

Створення форми

Start.getConnect

Отримання підключення

Start.fConnectToBase

Підключення до бази

HeadWindow.jbInit

Ініціалізація елементів форми

HeadWindow.jButtonBack_actionPerformed

Вихід

HeadWindow.setTreeInList

Задає дерево в таблицю

HeadWindow.isResult

Перевіряє розвязуваність задачі

HeadWindow.searchInTree

Основна функція, викликає збережену процедуру, створює в базі таблицю з розв'язком

HeadWindow.getValueZ

Отримує оптимальний результат

HeadWindow.getPath

Отримує шлях

AuxiliaryFunctionsManager.getIntFromBase

Отримує ціле значення з запиту

AuxiliaryFunctionsManager.getStrFromBase

Отримує строкове значення з бази

AuxiliaryFunctionsManager.SQLquestion

Надсилає запит в базу

AuxiliaryFunctionsManager.setValueInTable

Передає результат запиту в таблицю.

3.4 Інструкція користувача

Для запуску програми використовується файл RGR.jar.

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

Рисунок 3.1 - Програмне представлення

4. Приклади застосування методу

4.1 Приклад 1

4.1.1 Цільова функція

Максимізація прибутку

4.1.2 Обмеження

Обмеження на об'єми виготовлення:

Обмеження на витрати:

Обмеження на попит:

4.1.3 Розв'язок засобами Excel

Знаходимо розв'язок при (рисунок 4.1)

Рисунок 4.1 - Розвязок засобами Excel

Додамо наш розв'язок до дерева (рисунок 4.2)

Рисунок 4.2 - Дерево розбиття

Знаходимо розв'язок при (рисунок 4.3)

Рисунок 4.3 - Розвязок засобами Excel

Додамо до дерева отримане рішення (рисунок 4.4)

4.4 - Дерево розбиття

Як бачимо при результат кращий тому розгалужуємо вітку з даним результатом.

Знаходимо розв'язок при (рисунок 4.5)

Рисунок 4.5 - Розвязок засобами Excel

Додамо в дерево даний розв'язок і отримаємо (рисунок 4.6)

Рисунок 4.6 - Дерево розбиття

Знаходимо розв'язок при (рисунок 4.7)

Рисунок 4.7 - Розвязок засобами Excel

Додаємо вітку в дерево і отримуємо (рисунок 4.8)

Рисунок 4.8 - Дерево розбиття

Як бачимо при результат кращий тому розгалужуємо вітку з даним результатом.

Знаходимо розв'язок при , (рисунок 4.9)

Рисунок 4.9 - Розвязок засобами Excel

Додамо даний розвязок до нашого дерева (рисунок 4.10)

Рисунок 4.10 - Дерево розбиття

Знаходимо розв'язок при , (рисунок 4.11)

Рисунок 4.11 - Розв'язок засобами Excel

Додаємо розв'язок (рисунок 4.12)

Рисунок 4.12 - Дерево розбиття

Як бачимо при результат кращий до того ж він цілочисельний. Також змінна Отже, оптимальним є рішення при комбінації і значення цільової функції Z=94375. Цей результат підтверджено на рисунку 4.13

Рисунок 4.13 - Розвязок засобами Excel

Дерево розбиття зображено на рисунку 4.14

Рисунок 4.14 - Дерево розбиття

4.2 Приклад 2

4.2.1 Цільова функція

Максимізація прибутку

4.2.2 Обмеження

Обмеження на об'єми виготовлення:

Обмеження на витрати:

Обмеження на попит:

4.2.3 Розв'язок засобами Excel

Знаходимо розв'язок при (рисунок 4.15)

Рисунок 4.15 - Розвязок засобами Excel

Додамо отриманий розв'язок до дерева (рисунок 4.16)

Рисунок 4.16 - Дерево розбиття

Знаходимо розв'язок при (рисунок 4.17)

Рисунок 4.17 - Розвязок засобами Excel

Додамо до дерева отримане рішення (рисунок 4.18)

Рисунок 4.18 - Дерево розбиття

Як бачимо при результат кращий тому розгалужуємо вітку з даним результатом.

Знаходимо розв'язок при (рисунок 4.19)

Рисунок 4.19 - Розв'язок засобами Excel

Додамо в дерево даний розв'язок і отримаємо (рисунок 4.20)

Рисунок 4.20 - Дерево розбиття

Знаходимо розв'язок при (рисунок 4.21)

Рисунок 4.21 - Розв'язок засобами Excel

Додаємо вітку в дерево і отримуємо (рисунок 4.22)

Рисунок 4.22 - Дерево розбиття

Як бачимо при результат кращий тому розгалужуємо вітку з даним результатом.

Знаходимо розв'язок при , (рисунок 4.23)

Рисунок 4.23 - Розв'язок засобами Excel

Додамо даний розв'язок до нашого дерева (рисунок 4.24)

Рисунок 4.24 - Розв'язок засобами Excel

Знаходимо розв'язок при , (рисунок 4.25)

Рисунок 4.25 - Розв'язок засобами Excel

Додаємо розв'язок (рисунок 4.26)

Рисунок 4.26 - Дерево розбиття

Як бачимо при результат кращий тому розгалужуємо вітку з даним результатом

Знаходимо розв'язок при (рисунок 4.27)

Рисунок 4.27 - Розв'язок засобами Excel

Додаємо розв'язок в дерево (рисунок 4.28)

Рисунок 4.28 - Дерево розбиття

Знаходимо розв'язок при (рисунок 4.29)

Рисунок 4.29 - Розв'язок засобами Excel

Додаємо його до дерева (рисунок 4.30)

Рисунок 4.30 - Дерево розбиття

Отже, оптимальним є рішення при комбінації і значення цільової функції Z=122250. Цей результат підтверджено на рисунку 4.31

Рисунок 4.31 - Розв'язок засобами Excel

Кінцеве дерево розбиття зображено на рисунку 4.32

Рисунок 4.32 - Дерево розбиття

4.2.4 Розв'язок за допомогою програми

На рисунку 4.33 зображено розв'язок даної задачі за допомогою програми

Рисунок 4.33 - Розв'язок програми

Висновки

При виконанні курсової роботи було вивчено метод гілок та меж а також в окремому випадку його застосування до задач дискретного програмування. Складено робочий, провірений практично алгоритм рішення даного типу задач. Результати можна побачити в указаних прикладах на рисунках з 4.1 по 4.33

Перелік посилань

1. Метод ветвей и границ. Методические указания к самостоятельной работе. / Сост. Е.Г.Жданова. - К.: НТУУ „КПИ”, 2010. - 58 с.

2. Вікіпедія:JDeveloper

http://ru.wikipedia.org/wiki/JDeveloper

Додаток А

Код програми

AuxiliaryFunctionsManager

package coursework;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import javax.swing.JTable;

import javax.swing.table.DefaultTableModel;

public class AuxiliaryFunctionsManager {

public Integer getIntFromBase(Connection m_Connection, String var_query) {

System.out.println(var_query);

Integer var_valueInt;

var_valueInt = 0;

if (m_Connection != null) {

Statement m_Statement = null;

try {

m_Statement = m_Connection.createStatement();

if (m_Statement.execute(var_query)) {

while (m_Statement.getResultSet().next()) {

for (int i = 1; i <= m_Statement.getResultSet().getMetaData().getColumnCount(); i++) {

var_valueInt = Integer.parseInt(m_Statement.getResultSet().getObject(i).toString());

}

}

}

} catch (Exception el) {

// res.setText(el.toString());

} finally {

try {

m_Statement.close();

} catch (SQLException sqle) {

// res.setText(sqle.toString());

}

}

}

return var_valueInt;

}

public String getStrFromBase(Connection m_Connection, String var_query) {

System.out.println(var_query);

String var_valueStr;

var_valueStr = "";

if (m_Connection != null) {

Statement m_Statement = null;

try {

m_Statement = m_Connection.createStatement();

if (m_Statement.execute(var_query)) {

while (m_Statement.getResultSet().next()) {

for (int i = 1; i <= m_Statement.getResultSet().getMetaData().getColumnCount(); i++) {

var_valueStr = m_Statement.getResultSet().getObject(i).toString();

}

}

}

} catch (Exception el) {

} finally {

try {

m_Statement.close();

} catch (SQLException sqle) {

}

}

}

return var_valueStr;

}

public void SQLquestion(Connection m_Connection, String var_query) {

System.out.println(var_query);

if (m_Connection != null) {

Statement m_Statement = null;

try {

m_Statement = m_Connection.createStatement();

if (m_Statement.execute(var_query)) {

}

} catch (Exception el) {

} finally {

try {

m_Statement.close();

} catch (SQLException sqle) {

}

}

}

}

public void setValueInTable(Connection m_Connection, String var_query, JTable jTableSetData) {

if (m_Connection != null) {

Statement m_Statement = null;

try {

m_Statement = m_Connection.createStatement();

if (m_Statement.execute(var_query)) {

MyModelTable m_MyModelTable = new MyModelTable(m_Statement.getResultSet());

jTableSetData.setModel(m_MyModelTable);

}

} catch (SQLException el) {

jTableSetData.setModel(new DefaultTableModel());

} finally {

try {

m_Statement.close();

} catch (SQLException sqle) {

}

}

}

}

}

HeadWindow

package coursework;

import java.awt.Dimension;

import java.awt.Rectangle;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.JTextField;

import javax.swing.ScrollPaneConstants;

public class HeadWindow extends JFrame {

private JButton jButtonBack = new JButton();

private JTable jTableOrderList = new JTable();

private JScrollPane jScrollPaneForTable = new JScrollPane(jTableOrderList);

private AuxiliaryFunctionsManager m_AuxiliaryFunctionsManager = new AuxiliaryFunctionsManager();

private Connection m_Connection;

private JTextField jTextField1 = new JTextField();

private JLabel jLabel1 = new JLabel();

private JLabel jLabel2 = new JLabel();

private JTextField jTextField2 = new JTextField();

public HeadWindow(Connection m_Connection) {

this.m_Connection = m_Connection;

try {

jbInit();

} catch (Exception e) {

e.printStackTrace();

}

}

private void jbInit() throws Exception {

this.getContentPane().setLayout(null);

this.setSize(new Dimension(412, 279));

jButtonBack.setText("Вихід");

jButtonBack.setBounds(new Rectangle(195, 225, 100, 20));

jButtonBack.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

jButtonBack_actionPerformed(e);

}

});

jScrollPaneForTable.setBounds(new Rectangle(0, 0, 410, 170));

jScrollPaneForTable.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);

jTextField1.setBounds(new Rectangle(0, 225, 170, 20));

jLabel1.setText("Шлях");

jLabel1.setBounds(new Rectangle(30, 205, 34, 14));

jLabel2.setText("Результат пошуку");

jLabel2.setBounds(new Rectangle(330, 205, 100, 15));

jTextField2.setBounds(new Rectangle(320, 225, 75, 20));

jTableOrderList.setFillsViewportHeight(true);

this.getContentPane().add(jTextField2, null);

this.getContentPane().add(jLabel2, null);

this.getContentPane().add(jLabel1, null);

this.getContentPane().add(jTextField1, null);

this.getContentPane().add(jScrollPaneForTable, null);

this.getContentPane().add(jButtonBack, null);

setTreeInList();

getValueZ();

jTextField1.setEditable(false);

getPath();

jTextField2.setEditable(false);

}

private void jButtonBack_actionPerformed(ActionEvent e) {

System.exit(0);

}

private void setTreeInList() {

if (isResult() == true) {

searchInTree();

m_AuxiliaryFunctionsManager.setValueInTable(m_Connection,

"select LPAD(' ', 20 * level) || mmdo_tree.var_name || ' = ' || mmdo_tree.val_var || ' Z = ' || mmdo_tree.val_comb as TREE from mmdo_tree\n" +

"start with mmdo_tree.p_id = 1\n" +

"connect by prior mmdo_tree.id=mmdo_tree.p_id\n" +

"ORDER SIBLINGS BY mmdo_tree.var_name\n", jTableOrderList);

} else {

JOptionPane.showMessageDialog(this, "перевірте правильність тестових даних");

}

}

private boolean isResult() {

if (m_AuxiliaryFunctionsManager.getIntFromBase(m_Connection,

"select count(*) from mmdo where mmdo.var_name='y4' and mmdo.val_comb>=0") >

0) {

return true;

} else {

return false;

}

}

private void searchInTree() {

m_AuxiliaryFunctionsManager.SQLquestion(m_Connection, "drop table mmdo_tree;" + "create table mmdo_tree(\n" +

"id number,\n" +

"p_id number,\n" +

"var_name varchar2(5),\n" +

"val_var integer,\n" +

"val_comb number);\n" +

"\n" +

"insert into mmdo_tree(id,p_id,var_name,val_var,val_comb) select * from mmdo where mmdo.var_name='y1';\n" +

"insert into mmdo_tree(id,p_id,var_name,val_var,val_comb) select * from mmdo where mmdo.p_id=(\n" +

"select mmdo.p_id from mmdo where mmdo.val_comb=(select max(mmdo.val_comb) from mmdo where mmdo.var_name='y4') and mmdo.var_name='y4'\n" +

")\n" +

"and mmdo.var_name='y4';\n" +

"insert into mmdo_tree(id,p_id,var_name,val_var,val_comb) select * from mmdo where mmdo.p_id=(\n" +

"select p_id from mmdo where mmdo.var_name='y3' and id=(\n" +

"select mmdo.p_id from mmdo where mmdo.val_comb=(select max(mmdo.val_comb) from mmdo where mmdo.var_name='y4') and mmdo.var_name='y4'\n" +

"))\n" +

"and mmdo.var_name='y3';\n" +

"insert into mmdo_tree(id,p_id,var_name,val_var,val_comb) select * from mmdo where mmdo.p_id=(\n" +

"select p_id from mmdo where id=(\n" +

"select p_id from mmdo where mmdo.var_name='y3' and id=(\n" +

"select mmdo.p_id from mmdo where mmdo.val_comb=(select max(mmdo.val_comb) from mmdo where mmdo.var_name='y4') and mmdo.var_name='y4'\n" +

"))\n" +

")\n" +

"and mmdo.var_name='y2';\n" +

"\n");

}

private void getValueZ() {

jTextField1.setText(m_AuxiliaryFunctionsManager.getStrFromBase(m_Connection, "select lol from(\n" +

"select SYS_CONNECT_BY_PATH(mmdo_tree.var_name||'='||mmdo_tree.val_var, ' / ') as lol, level aaa from mmdo_tree\n" +

"connect by prior mmdo_tree.p_id=mmdo_tree.id\n" +

"start with mmdo_tree.id = (select mmdo_tree.id from mmdo_tree where mmdo_tree.val_comb=(select max(mmdo_tree.val_comb) from mmdo_tree where mmdo_tree.var_name='y4') and mmdo_tree.var_name='y4')\n" +

") where aaa=4\n"));

}

private void getPath() {

jTextField2.setText(m_AuxiliaryFunctionsManager.getStrFromBase(m_Connection,

"select max(mmdo.val_comb) from mmdo where mmdo.var_name='y4'"));

}

}

MyModelTable

package coursework;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import javax.swing.event.TableModelListener;

import javax.swing.table.TableModel;

public class MyModelTable implements TableModel {

private ResultSet m_ResultSet;

private ArrayList<String> cols = new ArrayList<String>();

private ArrayList<ArrayList> rows = new ArrayList<ArrayList>();

public MyModelTable(ResultSet m_ResultSet) {

this.m_ResultSet = m_ResultSet;

try {

for (int i = 1; i <= m_ResultSet.getMetaData().getColumnCount(); i++) {

cols.add(m_ResultSet.getMetaData().getColumnName(i));

}

while (m_ResultSet.next()) {

ArrayList row = new ArrayList();

for (int i = 1; i <= m_ResultSet.getMetaData().getColumnCount(); i++) {

row.add(m_ResultSet.getObject(i));

}

rows.add(row);

}

} catch (SQLException e) {

}

}

@Override

public int getRowCount() {

return rows.size();

}

@Override

public int getColumnCount() {

return cols.size();

}

@Override

public String getColumnName(int columnIndex) {

return cols.get(columnIndex);

}

@Override

public Class<?> getColumnClass(int columnIndex) {

return Object.class;

}

@Override

public boolean isCellEditable(int rowIndex, int columnIndex) {

return false;

}

@Override

public Object getValueAt(int rowIndex, int columnIndex) {

return rows.get(rowIndex).get(columnIndex);

}

@Override

public void setValueAt(Object aValue, int rowIndex, int columnIndex) {

}

@Override

public void addTableModelListener(TableModelListener l) {

}

@Override

public void removeTableModelListener(TableModelListener l) {

}

}

Start

package coursework;

import java.awt.Dimension;

import java.awt.Toolkit;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.Locale;

import javax.swing.JFrame;

import javax.swing.UIManager;

public class Start {

private Connection m_Connection;

private JFrame m_JFrame;

public Start() {

try {

fConnectToBase();

} catch (SQLException e) {

}

m_JFrame = new HeadWindow(m_Connection);

fCreatedForm();

}

private void fCreatedForm() {

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

Dimension frameSize = m_JFrame.getSize();

if (frameSize.height > screenSize.height) {

frameSize.height = screenSize.height;

}

if (frameSize.width > screenSize.width) {

frameSize.width = screenSize.width;

}

m_JFrame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);

m_JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

m_JFrame.setResizable(false);

m_JFrame.setVisible(true);

}

public static Connection getConnect() throws SQLException, ClassNotFoundException {

Class.forName("oracle.jdbc.driver.OracleDriver");

return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "Stepan", "qwerty");

}

public void fConnectToBase() throws SQLException {

try {

if (m_Connection == null) {

m_Connection = Start.getConnect();

}

} catch (ClassNotFoundException f) {

System.out.println("Error" + f.getMessage());

}

}

public static void main(String[] args) {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (Exception e) {

e.printStackTrace();

}

Locale.setDefault(Locale.ENGLISH);

new Start();

}

}

Размещено на Allbest.ru


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

  • Планування цілеспрямованих дій і прийняття рішень. Характеристика методу повного перебору - універсального методу вирішення оптимізаційних задач, якщо множина допустимих рішень обмежена. Експоненційна складність евристичного пошуку. Складність алгоритмів.

    реферат [62,2 K], добавлен 13.06.2010

  • Розробка алгоритму та написання програми обчислення множин. Доведення теоретико-математичних тотожностей і тверджень. Побудова диз’юнктивної нормальної форми. Розробка алгоритму та написання програми знаходження множини елементарних циклів у графі.

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

  • Системи автоматичного керування. Описання методу стикування розв'язків на основі теореми по n-інтервалів. Застосування методу динамічного програмування (рівняння Р. Белмана). Моделювання задачі синтезу та аналізу на електронній обчислювальній машині.

    контрольная работа [632,5 K], добавлен 31.03.2014

  • Створення алгоритму програмної моделі розкладу в учбовому закладі для ефективного вирішення завдань автоматичного складання розкладу, шляхом підбору найбільш оптимальних варіантів. Шляхи реалізації розробленого алгоритму в середовищі Mathemetica 5.0.

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

  • Створення програмного модуля "Множина" та організація його правильної структури, визначення методів та властивостей цього модуля (елементами множини є цілі числа). Реалізація математичних операцій з множинами з забезпеченням використання цього класу.

    курсовая работа [76,1 K], добавлен 25.09.2010

  • Розробка програмних модулів базових операцій обробки на підставі розрядно-логарифмічного кодування. Дослідження алгоритму розв'язку системи лінійних алгебраїчних рівнянь. Реалізація алгоритму Гауса. Покращення точності розрахунків за допомогою рл-чисел.

    курсовая работа [427,2 K], добавлен 20.11.2013

  • Теоретичні відомості про язик С++. Розробка програми, що виконує основні арифметичні дії над простими та складними числами на язику С++. Опис алгоритму програми та її код. Інструкція по користуванню. Обгрунтовування вибору та складу технічних засобів.

    курсовая работа [852,8 K], добавлен 30.11.2011

  • Обґрунтування переваги чисельного диференціювання функції з використанням інтерполяційної формули Стірлінга по відношенню до формул Ньютона, Гауса та Бесселя. Розробка оптимального алгоритму обчислення другої похідної. Лістинг, опис і тестування програми.

    курсовая работа [483,2 K], добавлен 21.10.2013

  • Розробка програмного продукту на мові С++ з використанням об’єктноорієнтованого підходу для математичних обрахувань задач з геометричними фігурами коло та кільце. Можливості швидкого обчислення виведених даних, їх графічне зображення у вікні програми.

    курсовая работа [778,8 K], добавлен 06.05.2014

  • Використання графічного методу і симплекс-методу при вирішенні задач лінейного програмування. Сутність двоякого симплекс-методу і М-методу, приклади використання. Аналіз методу динамичного програмування. Специфіка вирішення матричної, антагоністичної гри.

    контрольная работа [1,1 M], добавлен 02.07.2011

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