Линейное программирование

Автор работы: Пользователь скрыл имя, 08 Октября 2013 в 22:16, курсовая работа

Краткое описание

Данный курсовой проект предназначен для решения задач линейного программирования. Для этого было необходимо произвести расчеты, используя ручной метод решения задачи симплекс методом, табличный процессор MS Excel из пакета программ Microsoft Office, а также необходимо было написать программу в среде Microsoft Visual Basic.
Для решения задач линейного программирования симплекс методом в любом из вышеперечисленных способов возникает ряд неудобств, например: при решении задачи вручную при подсчетах таблиц можно ошибиться и неправильно решить задачу, при решении задачи в табличном процессоре Microsoft Excel существует необходимость переписывать формулы при составлении новой таблицы, написание программы в среде Microsoft Visual Basic очень утомительное и занимает слишком много времени.

Содержание

Введение 4
1. ОБЩАЯ ЧАСТЬ 5
1.1 Общая задача линейного программирования, применение её для решения различных типов вычислительных задач. 5
1.2.Применение процессора Microsoft Excel для расчета задач линейного программирования 10
1.3. Использование технических и программных средств для решения задач линейного программирования 16
1.3.1.Microsoft Visual Basic 6.0 22
1.3.2 Microsoft Office 24
1.4. Алгоритм нахождения оптимального решения задач линейного программирования 26
2. СПЕЦИАЛЬНАЯ ЧАСТЬ 27
2.1. Задание для курсового проекта 27
2.1.1.Приведение задачи к каноническому виду 28
2.2. Нахождение начального опорного решения (НОР) 29
2.3. Нахождение оптимального решения 30
2.4. Алгоритмы и их описание 33
2.5. Описание программы 42
2.6. Описание процесса отладки программы обработка ошибок программы 44
2.7. Инструкция пользователю 48
3.Заключение 50

Прикрепленные файлы: 1 файл

Курсовой прект матметоды.docx

— 658.47 Кб (Скачать документ)

3. Заключение

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

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

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

 

4. Приложения

Приложение  №1. Внешний вид форм

Приложение№1.Начало

Рис 25 Общий  вид формы

 

Рис 26 Просчет  первой таблицы

 

Приложение№1.Продолжение

Рис 27 Просчет второй таблицы

 

Рис 28 Просчет  третьей таблицы 

 

 

 

 

 

 

 

 

 

 

Приложение№1.Окончание

 

Рис 29 Просчет четвертой  таблицы 

 

Рис 30 Вывод сообщения о нахождении решения

 

 

 

 

 

 

 

 

 

 

 

Приложение №2. Программный код

Приложение№2. Начало

Private DATA() As Double 'массив эл-тов расчетной таблицы

Private Q() As Double 'массив столбца Q

Private Cb() As Double 'массив эл-тов базового плана

Private X() As String 'массив обозначений строк

Private it As Integer 'индекс текущей таблицы

Private s As Integer  'генеральная строка

Private r As Integer 'генеральный столбец

Private Finish As Boolean 'значение остановки поиска решения

Private tables As Integer 'кол-во таблиц

 

Private Sub Command1_Click() ‘следующая таблица

Command1.Enabled = False

Command3.Enabled = True

 

If Check1.Value = 1 Then

Command1.Enabled = True

Command3.Enabled = False

End If

 

If Proverka Then

    Call Cel_line

    Call Next_Table

    Call ShowData

    Call Clear

    If Finish = False And Check1.Value = 1 Then

        Call Cel_line

    End If

Else

    MsgBox "Таблица не заполнена или заполнена не до конца!", vbExclamation, "Info"

End If

End Sub

 

Private Sub Command2_Click() ‘назад

Command1.Enabled = True

Command3.Enabled = True

If it > 0 Then

    it = it - 1

    Call Clear

    Call ShowData

    If Check1.Value = 1 Then

        Call Cel_line

    End If

End If

End Sub

 

Приложение№2. Продолжение

Private Sub Command3_Click() 'просчет генер. столбца и строки

Call Cel_line

Command1.Enabled = True

Command3.Enabled = False

End Sub

 

Private Sub Next_Table() 'Расчёт след таблицы

'ReDim - переопределяет область  памяти для хранения переменной  массива

If Finish = False Then

   ReDim Preserve DATA(1 To 5, 11, tables + 1)

   ReDim Preserve Q(1 To 3, tables + 1)

   ReDim Preserve Cb(1 To 3, tables + 1)

   ReDim Preserve X(1 To 3, tables + 1)

   tables = tables + 1

   For i = 1 To 3

        For j = 0 To 10

          If i = s Then

                DATA(i, j, it + 1) = DATA(i, j, it) / DATA(s, r, it)

          Else

                DATA(i, j, it + 1) = DATA(i, j, it) - (DATA(i, r, it) * DATA(s, j, it)) / DATA(s, r, it)

          End If

        Next j

   Next i

   Cb(1, it + 1) = Cb(1, it)

   Cb(2, it + 1) = Cb(2, it)

   Cb(3, it + 1) = Cb(3, it)

   Cb(s, it + 1) = Text_UP(r).Text

   X(1, it + 1) = X(1, it)

   X(2, it + 1) = X(2, it)

   X(3, it + 1) = X(3, it)

   X(s, it + 1) = Text0(r).Text

   it = it + 1

End If

End Sub

 

Private Sub Cel_line() 'поиск текущей целевой строки

If Proverka Then

Finish = False

If it = 0 Then Call FirstData

Call Celevaya

For i = 0 To 10

    Text5(i).Text = Round(DATA(5, i, it), 2)

    Text4(i).Text = Round(DATA(4, i, it), 2)

Next i

Call Find_Col

If r <> 0 Then

    Call Calc_Q

    Call Find_Row

    Else

Приложение№2. Продолжение

        MsgBox "Решение найдено!", vbExclamation, "Info"

    Finish = True

End If

Else

MsgBox "Таблица не заполнена  или заполнена не до конца!", vbExclamation, "Info"

End If

End Sub

 

Private Sub Find_Col() 'поиск главного столбца

Max = DATA(5, 1, it)

max_i = 1

For i = 2 To 10

If Option1.Value = True Then

    If DATA(5, i, it) > 0 Then

        If DATA(5, i, it) > Max Then

            Max = DATA(5, i, it)

            max_i = i

        End If

    End If

Else

    If DATA(5, i, it) < 0 Then

        If DATA(5, i, it) < Max Then

            Max = DATA(5, i, it)

            max_i = i

        End If

    End If

End If

Next i

If max_i = 1 Then

     If Option1.Value = True Then

        If DATA(4, 1, it) > 0 Then

            Text1(max_i).BackColor = &HC0E0FF

            Text2(max_i).BackColor = &HC0E0FF

            Text3(max_i).BackColor = &HC0E0FF

            r = max_i

        Else

            r = 0

        End If

     Else

        If DATA(4, 1, it) < 0 Then

            Text1(max_i).BackColor = &HC0E0FF

            Text2(max_i).BackColor = &HC0E0FF

            Text3(max_i).BackColor = &HC0E0FF

            r = max_i

        Else

            r = 0

        End If

    End If

Else

    Text1(max_i).BackColor = &HC0E0FF

   Приложение№2. Продолжение

    Text2(max_i).BackColor = &HC0E0FF

    Text3(max_i).BackColor = &HC0E0FF

    r = max_i

End If

End Sub

 

Private Sub Calc_Q() 'расчёт столбца Q

For i = 1 To 3

If DATA(i, r, it) <> 0 Then

    Q(i, it) = DATA(i, 0, it) / DATA(i, r, it)

    Else

    Q(i, it) = Empty

End If

Text_Q(i).Text = Q(i, it)

Next i

End Sub

 

Private Sub Celevaya() 'формула расчета целевой строки

For i = 0 To 10

DATA(4, i, it) = Cb(1, it) * DATA(1, i, it) + Cb(2, it) * DATA(2, i, it) + Cb(3, it) * DATA(3, i, it)

DATA(5, i, it) = DATA(4, i, it) - Text_UP(i)

Next i

End Sub

 

Private Sub Find_Row() 'поиск главной строки

Dim Plus(1 To 3) As Double

n = 0

For i = 1 To 3

If Q(i, it) > 0 Then

Plus(i) = Q(i, it)

n = n + 1

Min = Plus(i)

Min_i = i

Else

Plus(i) = 0

End If

Next i

 

If n <> 0 Then

    For i = 1 To 3

        If Plus(i) <> 0 Then

             If Plus(i) < Min Then

                Min = Q(i, it)

                Min_i = i

             End If

        End If

    Next i

    s = Min_i

Приложение№2. Продолжение   

Select Case Min_i

    Case 1

      For i = 1 To 10

        If r = i Then

            Text1(i).BackColor = &H8080FF

            Else

            Text1(i).BackColor = &HC0E0FF

        End If

      Next i

     

    Case 2

      For i = 1 To 10

            If r = i Then

            Text2(i).BackColor = &H8080FF

            Else

            Text2(i).BackColor = &HC0E0FF

        End If

      Next i

     

    Case 3

      For i = 1 To 10

            If r = i Then

            Text3(i).BackColor = &H8080FF

            Else

            Text3(i).BackColor = &HC0E0FF

        End If

      Next i

    End Select

Else

    MsgBox "Решений нет, т.к Q отрицательны", vbExclamation, "Info"

    Finish = True

End If

End Sub

 

Private Sub ClearTexts() ‘очистка чисел в текстовых полях

For i = 0 To 7

Text1(i).Text = ""

Text2(i).Text = ""

Text3(i).Text = ""

Text4(i).Text = ""

Text_UP(i).Text = ""

Next i

Text_UP(0).Text = 0

For i = 1 To 3

Text_Baz(i) = 0

Next i

Text_X(1) = "A8"

Text_X(2) = "A9"

Text_X(3) = "A10"

 

Приложение№2. Продолжение   

it = 0

ReDim DATA(1 To 5, 11, 0)

ReDim Q(1 To 3, 0)

ReDim Cb(1 To 3, 0)

ReDim X(1 To 3, 0)

 

Text1(8).Text = "1"

Text1(9).Text = "0"

Text1(10).Text = "0"

 

 

Text2(8).Text = "0"

Text2(9).Text = "1"

Text2(10).Text = "0"

 

 

Text3(8).Text = "0"

Text3(9).Text = "0"

Text3(10).Text = "1"

 

For i = 1 To 3

Cb(i, it) = 0

Q(i, it) = 0

Next i

For i = 0 To 10

Text4(i).Text = ""

Text5(i).Text = ""

Next i

X(1, it) = "A8"

X(2, it) = "A9"

X(3, it) = "A10"

 

Text_X(1).Text = "A8"

Text_X(2).Text = "A9"

Text_X(3).Text = "A10"

 

Text_Baz(1).Text = "0"

Text_Baz(2).Text = "0"

Text_Baz(3).Text = "0"

 

Text_Q(1).Text = "0"

Text_Q(2).Text = "0"

Text_Q(3).Text = "0"

r = 0

s = 0

Label1.Caption = "Таблица: " & it

Text0(0).Text = "X" & it

tables = 0

Call Clear

End Sub

Приложение№2. Продолжение   

Private Sub Command4_Click() ‘очистка

Command1.Enabled = True

Command3.Enabled = True

Call ClearTexts

Call vvod

End Sub

 

Private Sub Command6_Click() ‘значения по умолчанию

Command1.Enabled = True

Command3.Enabled = True

Call Nach_dan

Call zapret_vvoda

End Sub

 

Private Sub Command7_Click() ‘выход

a = MsgBox("Вы действительно хотите выйти?", vbYesNo, "Exit")

If a = vbYes Then

Unload Me

End If

End Sub

 

Private Sub Form_Activate()

Option2.SetFocus

Text_UP(0).Visible = False

Call zapret_vvoda

End Sub

 

Private Sub Form_Load()

Call Nach_dan

End Sub

 

Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer) ‘переход по полям Tab

If KeyAscii = vbKeyReturn Then

SendKeys "{tab}"

KeyAscii = 0

End If

End Sub

 

Private Sub Text2_KeyPress(Index As Integer, KeyAscii As Integer) ‘переход по полям Tab

If KeyAscii = vbKeyReturn Then

SendKeys "{tab}"

KeyAscii = 0

End If

End Sub

 

Private Sub Text3_KeyPress(Index As Integer, KeyAscii As Integer) ‘переход по полям Tab

 

Приложение№2. Продолжение   

If KeyAscii = vbKeyReturn Then

SendKeys "{tab}"

KeyAscii = 0

End If

End Sub

 

Private Sub Text_UP_KeyPress(Index As Integer, KeyAscii As Integer) ‘переход по полям Tab

If KeyAscii = vbKeyReturn Then

SendKeys "{tab}"

KeyAscii = 0

End If

End Sub

 

Private Function Proverka() As Boolean 'функция проверки пустых полей

Dim result As Boolean

result = True

For i = 0 To 10

If Text1(i).Text = "" Then result = False

If Text2(i).Text = "" Then result = False

If Text3(i).Text = "" Then result = False

If Text_UP(i).Text = "" Then result = False

Next i

Proverka = (result)

End Function

 

Private Sub Nach_dan() 'процедура возврата начальных данных и параметров

' redim Перераспределяет область  памяти для хранения переменной  массива.

it = 0

ReDim DATA(1 To 5, 11, 0)

ReDim Q(1 To 3, 0)

ReDim Cb(1 To 3, 0)

ReDim X(1 To 3, 0)

'i-line j-row   s-строка  r-столбец

Text_UP(0).Text = "0"

Text_UP(1).Text = "1"

Text_UP(2).Text = "-5"

Text_UP(3).Text = "-6"

Text_UP(4).Text = "-4"

<p class="Body_0020Text_0020Indent_00202" style=" text-indent: 0pt; li

Информация о работе Линейное программирование