Смекни!
smekni.com

Нахождение критического пути табличным методом (стр. 2 из 4)

После нажатия на кнопку «ОК» откроется меню решения

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


Произведя расчёт получим итоговую таблицу:

Можно осуществить обратный перевод единиц времени.

Эта задача была решена ранее без использования ЭВМ и имела решение:

Виды работ Продол-житель-ность Время раннего начала Время раннего конца Время позднего начала Время позднего конца Полный резерв
1-2 2 0 2 6 8 6
1-4 1 0 1 1 3 2
1-5 4 0 4 0 4 0
2-3 3 2 5 8 11 6
4-3 5 1 6 6 11 4
4-6 3 1 4 3 6 2
4-7 1 1 2 4 5 3
4-9 3 1 4 8 11 7
5-6 2 4 6 4 6 0
6-10 5 6 11 6 11 0
7-8 6 2 8 5 11 3
7-9 2 2 4 9 11 7

Критический путь: 1-5-6-10

Результаты вычислений вручную и на ЭВМ совпадают.

5.Описание интерфейса и руководство пользователя

При запуске Excel файла появляется стартовое окно, на котором располагаются 2 кнопки:

«Начать работу» при нажатии на эту кнопку вызывается окно ввода начальных данных.

«Выход» при нажатии на эту кнопку происходит закрытие программы и Excel.

В окне ввода начальных данных пользователь задает число этапов работ (число должно быть целым в диапазоне от 3 до 254)

В форме находятся 4 кнопки и флажок

· «ОК» - формирование таблицы исходных данных и включение режима заполнения таблицы.

· «Отмена» - закрытие формы

· «Справка» - вызов справки о программе

· «Пропустить» - переход к форме решения

· «Включить подсказки» - включение поясняющих окон.

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

На котором располагаются 3 кнопки:

· «Определение критического пути» - расчёт критического пути и сопутствующих данных и вывод результатов на экран.

· «Возврат к вводу начальных данных» - открытие окна ввода начальных данных и листа ввода.

· «Перевод единиц времени» - открытие окна перевода единиц времени в котором нужно выбрать текущие единицы времени и нажать кнопку «ОК», затем выбрать требуемые единицы времени и нажать кнопку «ОК».

Заключение

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


Литература

1. Беляев С.П. Курс лекций по «Исследованию операций».

2. Кузменко В.Г, Программирование на Microsoft Visual BasicforApplications 2003 /Москва изд. Бином; 2004г. – 880 с.: ил.


Листинг программы

Форма About (справка о программе)

Private Sub UserForm_Terminate()

Hide

InsForm.Show

End Sub

Форма HelpForm1 (помощь в заполнении таблицы)

Private Sub CommandButton1_Click()

Hide

OKForm.StartUpPosition = 0

OKForm.Top = 450

OKForm.Left = 580

OKForm.Show

End Sub

Private Sub CommandButton2_Click()

Hide

InsForm.Show

End Sub

Private Sub UserForm_Terminate()

Hide

InsForm.Show

End Sub

Форма HelpForm2 (помощь в понимании результатов вычислений)

Private Sub CommandButton1_Click()

check = True

Hide

SolForm.StartUpPosition = 0

SolForm.Top = 350

SolForm.Left = 480

SolForm.Show

End Sub

Private Sub CommandButton2_Click()

check = False

Hide

SolForm.StartUpPosition = 0

SolForm.Top = 350

SolForm.Left = 480

SolForm.Show

End Sub

Форма HelpForm3 (помощь в переводе единиц времени)

Private Sub CommandButton1_Click()

check = True

Hide

SolForm.StartUpPosition = 0

SolForm.Top = 350

SolForm.Left = 480

SolForm.Show

End Sub

Private Sub CommandButton2_Click()

check = False

Hide

SolForm.StartUpPosition = 0

SolForm.Top = 350

SolForm.Left = 480

SolForm.Show

End Sub

Форма InsForm (ввод количества этапов работ, проверка формата листа, проверка правильности ввода, вызов справки, выход из программы, переход к расчётной форме)

'Проверка правильности ввода

PrivateSubCommandButton1_Click()

Dim Answer As String

Application.ScreenUpdating = False

If iget.Value = "" Then

MsgBox "Введитеколичествоэтапов", vbCritical + vbOKOnly, "Ошибкаввода"

Exit Sub

End If

If Not (IsNumeric(iget.Value)) Then

MsgBox "Количество этапов работы должно быть числом", vbCritical + vbOKOnly, "Ошибка ввода"

Exit Sub

End If

If iget.Value < 3 Then

MsgBox "Количество этапов работы должно быть не менее 3", vbCritical + vbOKOnly, "Ошибка ввода"

Exit Sub

End If

If iget.Value > 254 Then

MsgBox "Количество этапов работы должно быть не более 222", vbCritical + vbOKOnly, "Ошибка ввода"

Exit Sub

End If

n = Fix(iget.Value)

'Проверка листа на наличие информации

For i = 1 To 254

For j = 1 To 254

If Not ActiveSheet.Cells(i, j).Value = "" Then

Answer = MsgBox("Лист содержит информацию! При продолжении она будет уничтожена! Продолжить?", vbCritical + vbOKCancel, "Предупреждение")

End If

If Answer = vbCancel Then

i = 254

j = 254

Exit Sub

End If

If Answer = vbOK Then

i = 254

j = 254

End If

Next j

Next i

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

Range("A1:IV254").Select

Selection.Clear

InsData

Application.ScreenUpdating = True

Hide

If help.Value = True Then

hlp = True

HelpForm1.Show

Else

hlp = False

OKForm.StartUpPosition = 0

OKForm.Top = 450

OKForm.Left = 580

OKForm.Show

End If

End Sub

Private Sub CommandButton2_Click()

Hide

STF.Show

End Sub

Private Sub CommandButton3_Click()

Hide

About.Show

End Sub

Public Sub Start()

iget.Value = n

End Sub

Private Sub CommandButton4_Click()

Dim flag As Boolean

Hide

SolForm.StartUpPosition = 0

SolForm.Top = 350

SolForm.Left = 480

SolForm.Show

flag = True

n = 1

If Not ActiveSheet.Cells(1, 1).Value = "№" Then

MsgBox "Лист не отформатирован для расчёта, воспользуйтесь окном ввода данных", vbCritical + vbOKOnly, "Ошибка"

Hide

InsForm.Show

Exit Sub

End If

Do While flag

n = n + 1

If ActiveSheet.Cells(n, 1).Value = "" Then

flag = False

End If

If ActiveSheet.Cells(n, 1).Value = n - 1 Then

flag = True

Else: flag = False

End If

Loop

n = n - 2

For i = 2 To n

If Not ActiveSheet.Cells(1, i).Value = i - 1 Then

MsgBox "Лист не отформатирован для расчёта, воспользуйтесь окном ввода данных", vbCritical + vbOKOnly, "Ошибка"

Hide

InsForm.Show

Exit Sub

End If

Next i

End Sub

Private Sub SpinButton1_SpinUp()

If iget.Value <= 222 Then

iget.Value = iget.Value + 1

Else

Exit Sub

End If

End Sub

Private Sub SpinButton1_SpinDown()

If iget.Value >= 4 Then

iget.Value = iget.Value - 1

Else

Exit Sub

End If

End Sub

Private Sub UserForm_Initialize()

iget.Value = 10

Sheets("Data").Select

End Sub

Private Sub UserForm_Terminate()

Hide

STF.Show

End Sub

Форма OKForm (подтверждение окончания ввода начальных данных)

Private Sub CommandButton1_Click()

SolForm.StartUpPosition = 0

SolForm.Top = 350

SolForm.Left = 480

Hide

SolForm.Show

End Sub

Private Sub UserForm_Terminate()

Hide

SolForm.StartUpPosition = 0

SolForm.Top = 350

SolForm.Left = 480

SolForm.Show

End Sub

Форма Perevod1 (запоминание текущих единиц времени)

'Запоминание текущих единиц времени

Private Sub CommandButton1_Click()

If Minutes.Value = True Then

edin = 1

End If

If Chas.Value = True Then

edin = 2

End If

If Sutki.Value = True Then

edin = 3

End If

If Nedeli.Value = True Then

edin = 4

End If

If Mes.Value = True Then

edin = 5

End If

If Godi.Value = True Then

edin = 6

End If

Hide

Perevod2.Show

End Sub

Private Sub UserForm_Terminate()

Hide

SolForm.StartUpPosition = 0

SolForm.Top = 350

SolForm.Left = 480

SolForm.Show

End Sub

Форма Perevod2 (перевод единиц времени, возврат к расчётной форме)

'Переводединицвремени

Private Sub CommandButton1_Click()

Hide

SolForm.Show

If ActiveSheet.Cells(1, 1).Value = "№" Then

If edin = 1 Then

If Minutes.Value = True Then

Exit Sub

End If

If Chas.Value = True Then

For i = 2 To n + 1

For j = 2 To n + 1

If Not ActiveSheet.Cells(i, j).Value = "" Then

ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 60

End If

Next j

Next i

End If

If Sutki.Value = True Then

For i = 2 To n + 1

For j = 2 To n + 1

If Not ActiveSheet.Cells(i, j).Value = "" Then

ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 1440

End If

Next j

Next i

End If

If Nedeli.Value = True Then

For i = 2 To n + 1

For j = 2 To n + 1

If Not ActiveSheet.Cells(i, j).Value = "" Then

ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 10080

End If

Next j

Next i

End If

If Mes.Value = True Then

MsgBox "Точный перевод невозможен. Попробуйте другой вариант", vbCritical + vbOKOnly, "Ошибка ввода"

End If

If Godi.Value = True Then

For i = 2 To n + 1

For j = 2 To n + 1

If Not ActiveSheet.Cells(i, j).Value = "" Then

ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 525600

End If

Next j

Next i

End If

End If

If edin = 2 Then

If Minutes.Value = True Then

For i = 2 To n + 1

For j = 2 To n + 1

If Not ActiveSheet.Cells(i, j).Value = "" Then

ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value * 60

End If

Next j

Next i

End If

If Chas.Value = True Then

Exit Sub

End If

If Sutki.Value = True Then

For i = 2 To n + 1

For j = 2 To n + 1

If Not ActiveSheet.Cells(i, j).Value = "" Then

ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 24

End If

Next j

Next i

End If

If Nedeli.Value = True Then

For i = 2 To n + 1

For j = 2 To n + 1

If Not ActiveSheet.Cells(i, j).Value = "" Then

ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 168

End If

Next j

Next i

End If

If Mes.Value = True Then

MsgBox "Точный перевод невозможен. Попробуйте другой вариант", vbCritical + vbOKOnly, "Ошибка ввода"

End If

If Godi.Value = True Then

For i = 2 To n + 1

For j = 2 To n + 1

If Not ActiveSheet.Cells(i, j).Value = "" Then

ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 8760

End If

Next j

Next i

End If

End If

If edin = 3 Then

If Minutes.Value = True Then

For i = 2 To n + 1

For j = 2 To n + 1

If Not ActiveSheet.Cells(i, j).Value = "" Then

ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value * 1440

End If

Next j

Next i

End If

If Chas.Value = True Then

For i = 2 To n + 1

For j = 2 To n + 1

If Not ActiveSheet.Cells(i, j).Value = "" Then

ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value * 24

End If

Next j

Next i

End If

If Sutki.Value = True Then

Exit Sub

End If

If Nedeli.Value = True Then

For i = 2 To n + 1

For j = 2 To n + 1

If Not ActiveSheet.Cells(i, j).Value = "" Then

ActiveSheet.Cells(i, j).Value = ActiveSheet.Cells(i, j).Value / 7

End If

Next j

Next i

End If

If Mes.Value = True Then

MsgBox "Точный перевод невозможен. Попробуйте другой вариант", vbCritical + vbOKOnly, "Ошибка ввода"

End If

If Godi.Value = True Then

For i = 2 To n + 1

For j = 2 To n + 1