критерии
алтернативи
|
Техни-ческа поддръжка
|
Поддръжка на бази данни
|
FTP достъп
|
SSH шел
|
Антивирусна защита
|
SPAM защита
|
Тами уеб
|
Съществе-но лошо
(ниско)
|
0
|
0
|
1
|
1
|
1
|
Креато ООД
|
Много лошо
(ниско)
|
0
|
0
|
1
|
1
|
1
|
Гото.бг ЕООД
|
Лошо
(ниско)
|
0
|
1
|
1
|
1
|
1
|
Ден България ЕООД
|
Изключи-
телно добро
(високо)
|
0
|
1
|
1
|
0
|
0
|
Bulhost
|
Съществе-но добро
(високо)
|
0
|
1
|
0
|
0
|
0
|
FCOLOR.BG – мега пак
|
Съществе-но добро
(високо)
|
1
|
1
|
1
|
0
|
0
|
FCOLOR.BG – миди пак
|
Съществе-но добро
(високо)
|
0
|
1
|
1
|
1
|
1
|
FCOLOR.BG – мини пак
|
Съществе-но добро
(високо)
|
1
|
1
|
1
|
1
|
1
|
ICD Soft
|
Средно
(Задоволи-
телно)
|
1
|
0
|
1
|
1
|
1
|
Хостинг ООД – персонален
|
Лошо
(ниско)
|
0
|
0
|
0
|
0
|
0
|
Хостинг ООД – малък бизнес
|
Лошо
(ниско)
|
1
|
0
|
1
|
0
|
0
|
Хостинг ООД – корпоративен
|
Лошо
(ниско)
|
0
|
1
|
0
|
0
|
0
|
Таблица. 1.
Методът ELECTRE изисква ЛВР да зададе допълнителна информация за всеки един от критериите. Информацията е следната:
Месечна цена
-
Тегло = 1
-
Вето праг – не използва вето праг
-
Праг на безразличие = 2
-
Праг на предпочитание = 5
-
Изчислителни единици на прага = “Абсолютни”
-
Единици = ” лв.”
Годишна цена
-
Тегло = 1
-
Вето праг – 90%
-
Праг на безразличие = 4%
-
Праг на предпочитание = 10%
-
Изчислителни единици на прага = “Процентни”
-
Единици = ” лв.”
Пространство
-
Тегло = 1
-
Вето праг – не използва вето праг
-
Праг на безразличие = 5%
-
Праг на предпочитание = 10%
-
Изчислителни единици на прага = “ Процентни”
-
Единици = ”MB”
Месечен трансфер
-
Тегло = 1
-
Вето праг – не използва вето праг
-
Праг на безразличие = 5%
-
Праг на предпочитание = 10%
-
Изчислителни единици на прага = “ Процентни”
-
Единици = ”MB”
Брой пощенски кутии
-
Тегло = 1
-
Вето праг = 1000
-
Праг на безразличие = 1
-
Праг на предпочитание = 5
-
Изчислителни единици на прага = “ Абсолютни”
-
Единици = ”бр.”
Надеждност
-
Тегло = 1
-
Вето праг – не използва вето праг
-
Праг на безразличие = 0
-
Праг на предпочитание = 2
-
Изчислителни единици на прага = “ Абсолютни”
-
Единици = ””
Техническа поддръжка
-
Тегло = 1
-
Вето праг – не използва вето праг
-
Праг на безразличие = 1
-
Праг на предпочитание = 2
-
Изчислителни единици на прага = “ Абсолютни”
-
Единици = ””
Поддръжка на бази данни
-
Тегло = 1
-
Вето праг – не използва вето праг
-
Праг на безразличие = 0
-
Праг на предпочитание = 0.5
-
Изчислителни единици на прага = “ Абсолютни”
-
Единици = ””
FTP достъп
-
Тегло = 1
-
Вето праг – не използва вето праг
-
Праг на безразличие = 0
-
Праг на предпочитание = 0.5
-
Изчислителни единици на прага = “ Абсолютни”
-
Единици = ””
SSH шел
-
Тегло = 1
-
Вето праг – не използва вето праг
-
Праг на безразличие = 0
-
Праг на предпочитание = 0.5
-
Изчислителни единици на прага = “ Абсолютни”
-
Единици = ””
Антивирусна защита
-
Тегло = 1
-
Вето праг – не използва вето праг
-
Праг на безразличие = 0
-
Праг на предпочитание = 0.5
-
Изчислителни единици на прага = “ Абсолютни”
-
Единици = ””
SPAM защита
-
Тегло = 1
-
Вето праг – не използва вето праг
-
Праг на безразличие = 0
-
Праг на предпочитание = 0.5
-
Изчислителни единици на прага = “ Абсолютни”
-
Единици = ””
Получените резултати са сортирани в низходящ ред:
Позиция
|
Алтернатива
|
Стойност
|
1.
|
Гото.бг ЕООД
|
11
|
2.
|
FCOLOR.BG – мини пак
|
10
|
3.
|
ICD Soft
|
10
|
4.
|
FCOLOR.BG – мега пак
|
9
|
5.
|
FCOLOR.BG – миди пак
|
9
|
6.
|
Ден България ЕООД
|
6
|
7.
|
Bulhost
|
6
|
8.
|
Хостинг ООД – малък бизнес
|
5
|
9.
|
Хостинг ООД – корпоративен
|
5
|
10.
|
Креато ООД
|
4
|
11.
|
Тами уеб
|
2
|
12.
|
Хостинг ООД – персонален
|
1
|
Таблица. 2
Следователно най-добър избор за доставчик на уеб хостинг е Гото.бг ЕООД.
Пример 2:
В компания ЕТ „Пападопулос – Константинос Пападопулос” текущите поръчки за изпълнение за направата на каменни изделия трябва да се подредят в опашка и да се изпълняват според резултатите в нея. Решаваната задача е за ранкиране на изпълнението на поръчки, решава се отново чрез метода ELECTRE ІІІ.
Алтернативите са с идентификационни номера:
-
Поръчка 518
-
Поръчка 685
-
Поръчка 686
-
Поръчка 713
Критериите, определящи подреждането в опашката на поръчките са:
-
Авансово плащане на поръчката (в %) – количествен критерий, който трябва да се максимизира.
-
Приоритет по срок – качествен критерий – трябва да се максимизира
-
Приоритет на клиента – качествен – трябва да се максимизира
-
Комбиниране на материали – количествен – тъй като за този критерий има само две възможности – наличност или отсъствие на еднакви материали за изпълнението на поръчките, има само две възможни стойности – 0 и 1. Критерият трябва да се максимизира.
Матрицата на алтернативите е следната:
критерий
алтернатива
|
Авансово плащане на поръчката
|
Приоритет по срок
|
Приоритет на клиента
|
Комбиниране на материали
|
Поръчка 518
|
10
|
Средно
(задоволително)
|
Изключително добро(високо)
|
0
|
Поръчка 685
|
54
|
Много добро
(високо)
|
Средно
(задоволително)
|
1
|
Поръчка 686
|
63
|
Изключително добро(високо)
|
Средно
(задоволително)
|
0
|
Поръчка 713
|
10
|
Средно
(задоволително)
|
Средно
(задоволително)
|
1
|
Таблица. 3
Методът ELECTRE изисква от ЛВР задаването на допълнителна информация за всеки от критериите. Информацията е следната:
Авансово плащане на поръчката
-
Тегло = 2
-
Вето праг – не използва вето праг
-
Праг на безразличие = 2
-
Праг на предпочитание = 5
-
Изчислителни единици на прага = “Процентни”
-
Единици = ” лв.”
Приоритет по срок
-
Тегло = 2
-
Вето праг – не използва вето праг
-
Праг на безразличие = 1
-
Праг на предпочитание = 2
-
Изчислителни единици на прага = “Абсолютни”
-
Единици = ””
Приоритет на клиента
-
Тегло = 1
-
Вето праг – не използва вето праг
-
Праг на безразличие = 1
-
Праг на предпочитание = 2
-
Изчислителни единици на прага = “ Абсолютни”
-
Единици = ””
Комбиниране на материали
-
Тегло = 1
-
Вето праг – не използва вето праг
-
Праг на безразличие = 0
-
Праг на предпочитание = 0.5
-
Изчислителни единици на прага = “ Абсолютни”
-
Единици = ””
От получения резултат се вижда, че поръчките следва да се изпълняват в следния ред:
Позиция
|
Алтернатива
|
Стойност
|
1.
|
Поръчка 685
|
4
|
2.
|
Поръчка 686
|
4
|
3.
|
Поръчка 518
|
2
|
4.
|
Поръчка 713
|
1
|
Таблица. 4
Заключение
Задачите на многокритериалния анализ намират широко приложение в практиката. Това е причината за разработването на различни софтуерни системи за подпомагане на решаването на тези задачи.
В дипломната работа се разглежда разработената в ИИТ-БАН софтуерна система за подпомагане на решаването на задачи на многокритериалния анализ MKA-2. В системата са включени четири различни метода, представители на трите групи известни досега методи.
Основната задача на дипломната работа е реализацията и внедряването на алгоритъм за вземане на решения по метода ELECTRE в софтуерната система MKA-2. Резултатите могат да бъдат обобщени както следва:
-
Направен е обзор и анализ на задачите, методите и системите на многокритериалния анализ;
-
Дадено е описание на методите от групата ELECTRE, като е направен аргументиран избор на най-подходящата за целта версия на метода;
-
Методът ELECTRE ІІІ е внедрен и тестван в съществуващата система за вземане на решения MKA-2.
-
Представен е готов софтуерен продукт, който чрез реализация на разработените научни теории да бъде приложим в практиката.
Системата MKA-2 е изследователска система с общо предназначение. Предстои разработката на софтуерната система MKA-WEB за работа в мрежова среда. Освен това на основата на системата MKA-2 за фирма ЕТ ”ПАПАДОПУЛОС – Константинос Пападопулос” е реализирана и проблемно-ориентирана софтуерна система MultiChoice-KP. Фирма ЕТ ”ПАПАДОПУЛОС – Константинос Пападопулос” е специализирана фирма за добив, обработка, доставка, монтаж, поддръжка и реставрация на скално-облицовъчни материали. Задачата й е да подобри планирането и управлението на дейността на фирмата чрез решаване на задачи за многокритериален анализ на инвестиции, заявки и поръчки.
Литература
1. Buchanan, J., Sheppard P., Vanderpooten D., (1999) Project Ranking Using ELECTRE ІІІ, 1-20,
2. Rogers, M., Bruen, M., Maystre L.,(1999) ELECTRE and Decision Support, Kluwer Academic Publishers Boston/Dordrecht/London, 23-85.
3. Brans, J., Mareschal B. (1990). The Promethee Methods for MCDM: the Promcale, Gaia and Bankadviser Software. Readings in Multiple Criteria Decision Aid (A. Carlos, C. Bana Costa, Eds.), Springer-Verlag, Berlin, 216-252.
4. Brans, J. P., B. Mareschal (1994). The PROMCALC & GAIA Decision Support System for Multicriteria Decision Aid. Decision Support System, 12, 297-310.
5. Craig, J., J. Webb (1998). Microsoft Visual Basic 6.0 Developer’s Workshop.
6. Dias, L. C., J. N. Climaco (2000). Additive Aggregation with Variable Interdependent Parameters: The VIP Analysis Software. Journal of Operational Research Society, 51, 1070-1082.
7. Eom, S. B., S. M. Lee, E. B. Kim, C. Somarajan (1998). A Survey of Decision Support System Applications (1988-1994). Journal of Operational Research Society, 49, 2, 109-120.
8. Farquhar, P. (1984). Utility Assessment Methods. Management Science, 30, 1283-1300.
9. Fishburn, P. C. (1970). Utility Theory for Decision Making. John Wiley & Sons, New York.
10. Gardiner, R., D. Vanderpooten (1997). Interactive Multiple Criteria Procedures: Some Reflection. Multicriteria Analysis (J. Climaco, Ed.), Springer, 290 – 301.
11. Hamalainen, R. P., H. Lauri (1993). HIPRE 3+Decision Support Software vs 3.13, User’s Guide. Systems Analysis Laboratory, Helsinki University of Technology.
12. Huang, C., K. Yoon (1981). Multiple Attribute Decision Making. Methods and Applications. Springer Verlag, Berlin.
13. Jaszkiewicz, A., R. Slowinski (1994). The Light Beam Search Over a Non-Dominated Surface of a Multiple-Objective Programming Problem. Mutiple Criteria Decision Making, (G. Tzeng, H. Wang, U. Wen, P. Yu, Eds.), Spinger-Verlag, 87-99.
14. Jaszkiewicz, A., R. Slowinski (1997). The LBS-Discrete Interactive Procedure for Multiple Criteria Analysis of Decision Problems. Multicriteria Analysis (J. Climaco, Ed.), Springer-Verlag, Berlin, 320-330.
15. Keeney, R., H. Raiffa (1976). Decisions with Multiple Objectives. John Wiley & Sons, New York.
16. Koksalan, M., M. H. Karwan, S. Zionts (1984). An Improved Method for Solving Multiple Criteria Problems Involving Discrete Alternatives. IEEE Transactions on Systems, Man and Cybernetics, 44, 24-34.
17. Korhonen, P. (1988). A Visual Reference Direction Approach to Solving Discrete Multiple Criteria Problems. European Journal of Operational Research, 34, 152-159.
18. Lotfi, V., T. J. Stewart, S. Zionts (1992). An Aspiration-Level Interactive Model for Multiple Criteria Decision Making. Computers and Operations Research, 19, 671-681.
19. Marcotte, O., R. Soland (1986). An Interactive Branch and Bound Algorithm for Multiple Criteria Optimization. Management Science, 32, 61-75.
20. Mustajoki, J., R. P. Hamalainen (2000). Web-HIPRE: Global Decision Support by Value Tree and AHP Analysis. INFOR, 38, 208-220.
21. Peterson, C. R. (1994). HIVIEW – Rate and Weight to Evaluate Options. OR/MS Today, April .
22. Wiestroffer, H., S. Narula (1997). The State of Multiple Criteria Decision Support Software. Annals of Operations Research, 72, 299-313.
23. Roy, B. (1990). The Outranking Approach and Foundations of ELECTRE Methods. Readings in Multiple Criteria Decision Aid (A. Carlos, C. Bana Costa, Eds.), Springer-Verlag, Berlin, 156-183.
24. Roy, B. (1991). The Outranking Approach and the Foundations of ELECTRE Methods. Theory and decision, 31, 49-73.
25. Saaty, T. S. (1990). The Analytic Hierarchy Process. RWS Publications, Pittsburgh, Pennsylvania.
26. Salo, A., R. P. Hamalainen (1995). Preference Programming Through Approximate Ratio Comparisons. European Journals of Operational Research, 82, 458-475.
27. Sprague, R. H., E. D. Garson (1982). Building Effective Decision Support System. Prentice-Hall, Englewood Cliffs, New Jersey.
28. Steuer, R. (1986). Multiple Criteria Optimization: Theory, Computation, and Applications. John Wiley & Sons, Inc., New York.
29. Sun, M., R. Steuer (1996). InterQuad: An Interactive Quad Free Based Procedure for Solving the Discrete Alternative Multiple Criteria Problem. European Journal of Operational Research, 89, 462-472.
30. Vassileva, M. (2001). An Optimizationally Motivated Interactive Method for Solving a Class of Discrete Multicriteria Choice Problems. Cybernetics and Information Technologies, 2, 63-70.
31. Vetschera, R. (1994). McView: An Integrated Graphical System to Support Multi-Attribute Decisions, Decision Support Systems, 11, 363-371.
32. Vincke, P. (1992). Multicriteria Decision-Aid. John Wiley & Sons, New York.
33. Wierzbicki, A. P. (1980). The Use of Reference Objectives in Multiobjective Optimization. Multiple Criteria Decision Making Theory and Applications (G. Fandel, T. Gal, Eds.), Springer-Verlag, Berlin, Heidelberg 468-486.
ПРИЛОЖЕНИЕ
Следва кратко описание и програмна реализация на някои основни форми на системата MKA-2. Пълната версия на системата е приложена в CD към дипломната работа.
MDIForm1
Системата МКА-2 е изградена на принципа на многодокументарния интерфейс (MDI). Главната форма (родителската форма) е MDIForm1. Тя има основна роля в управляващите функции на системата. Една от основните процедури е:
MDIForm_Load – изпълнява се при зареждане на главната форма MDIForm1. Установява кои от използваните в приложението форми ще бъдат визуализирани. Инициализира масива с подсказващи съобщения, извиквайки метода InitMesgArray на обекта G_Mesg. Показва формата Form – която е първата стъпка от попълването на данни за решаване на многокритериална задача и FrmSplash – начална анимация с логото на системата. По подразбиране езикът, който се зарежда е български. Проверява се дали програмата е била извикана с параметър и ако това е така, дали това е направено с валидно име на съществуващ “.mka файл” и дали в него са съхранени някакви стъпки. Ако подаденият параметър не е валиден “.mka файл”, се извежда съобщение за грешка.
Private Sub MDIForm_Load()
Dim param As String
Dim fResult As Integer
Dim ShowAtStartup As Boolean
AHPrezultFlag = False
OpenFlag = False
choose_option_from_menu = ""
AHPrezultVisible = False
Domination_ListVisible = False
frmOptionsVisible = False
Form1Visible = False
Form2Visible = False
Form3Visible = False
Form5Visible = False
Form6Visible = False
Form9Visible = False
Form10Visible = False
LanguageVisible = False
MethodsVisible = False
PrometheeVisible = False
ElectreVisible = False
frmTipVisible = False
frmMessVisible = False
GraphFormVisible = False
pbimVisible = False
SolveVisible = False
ValueVisible = False
IntervalVisible = False
PrinterVisible = False
RankCriteriaVisible = False
FormArrangingAltVisible = False
FormYes_No_ArrangingAltVisible = False
Form5ComboFlag = True
ArrAltFlatScrolFlag = True
ExitFlag = False
RemoveCritHaveElement = False
CheckDataIsPassed = False
ReDim RemoveCrit(0, 1)
ReDim RemOrEditCrit(0, 1)
ReDim RemoveAlt(0)
L = 101
EditIndex = -1
Lang = GetSetting(App.EXEName, "Options", "Language", "bg")
L = GetSetting(App.EXEName, "Options", "L", 101)
fResult = GetSystemMetrics(19) '19-mouse present
If fResult = 0 Then G_Mesg.errormsg 243 'G_Mesg.sysmsg 1, "You need a mouse to use this program", "Warning!"
If Screen.Height / Screen.TwipsPerPixelY < 768 Or Screen.Width / Screen.TwipsPerPixelX < 1024 Then G_Mesg.infomsg 248
G_Mesg.debugmsg CStr(Time) + ": MKA-2 is up and running"
there_is_no_dominant = 0
Form1.Show
ShowAtStartup = GetSetting(App.EXEName, "Options", "Show Tips at Startup", 1)
If ShowAtStartup <> 0 Then frmTip.Show
frmSplash.Show
G_Mesg.InitMesgArray
G_Mesg.LoadLanguage
MDIForm1Visible = True
ChangeLanguage_MDIForm1
param = Command
If Not (param = "") Then
If ReadGlobals(param) Then
G_FileName = param
MDIForm1.Caption = ProblemName + " (" + G_FileName + ")" '""""
G_Mesg.debugmsg "----File" + G_FileName + " loaded successful-----"
Form1.Show
Else
G_Mesg.sysmsg 16, "'" + dlg.FileName + "'" + LoadResString(L + 244), " MKA-2 Error Handler"
End If
End If
ChDir App.path
End Sub
Тъй като падащото меню на системата се намира в главната форма, то и процедурите, обработващи избора на елемент от менюто, се намират тук. По-важните от тях са:
mnuHint_Click – изпълнява се при избор на елемента Подсказки на менюто Преглед. Инвертира стойността на булевото свойство Checked на този елемент и ако новата му стойност е True, визуализира формата за подсказки FrmHints и установява стойност True на глобалната променлива ViewHint. В противен случай извършва обратното.
Private Sub mnuHint_Click()
mnuHint.Checked = Not mnuHint.Checked
If mnuHint.Checked Then
FrmHints.Show
ViewHint = True
Else
FrmHints.Hide
ViewHint = False
End If
End Sub
fNew_Click – изпълнява се при избор на елемента Нова задача на менюто Файл. Ако има несъхранени промени извежда предупредителен прозорец. Ако потребителят избере да запази промените, се извиква функцията fSave_Click. След това се реинициализира средата и някои глобални променливи за нова задача.
Private Sub FNew_Click()
SaveFrm.Show 1, MDIForm1
ResetAll
End Sub
fOpen_Click – изпълнява се при избор на елемента Отвори на менюто Файл. Извежда стандартния диалог за избор на файл на Windows и ако е избран валиден .mka файл то се изпълнява набора от операции, описани в MDIForm_Load.
Private Sub fOpen_Click()
dlg.CancelError = True
On Error Resume Next
dlg.DialogTitle = LoadResString(L + 245) '"Open File"
dlg.Filter = "MultiRank files|*.mka"
dlg.FileName = "*.mka"
dlg.ShowOpen
If dlg.FileName = "*.mka" Then Exit Sub
If ReadGlobals(dlg.FileName) Then
G_FileName = dlg.FileName
MDIForm1.Caption = ProblemName + " (" + G_FileName + ")" '""""
G_Mesg.debugmsg "----File" + G_FileName + " loaded successful-----"
'G_FileChanged = False
Form1.Show
Else
'G_Mesg.sysmsg 16, "'" + dlg.FileName + "'" + " is not a valid MultiChoice file!", "MultiChoice Error Handler"
G_Mesg.sysmsg 16, "'" + dlg.FileName + "'" + LoadResString(L + 244), "MultiRank Error Handler"
End If
End Sub
fSave_Click – изпълнява се при избор на елемента Съхрани на менюто Файл. Проверява дали глобалната променлива, съхраняваща името на файла на решаваната задача, е празна и, ако е така, извежда стандартния диалог за запис на файл на Windows. Съхранява задачата в посочения файл (или в съществуващия такъв, ако променливата, съхраняваща името не е празна) и установява флага за направени промени на False.
Private Sub FSave_Click()
ExitFlag = False
SaveFile
End Sub
mnuUserMan_Click – изпълнява се при избор на елемента Ръководство на потребителя на менюто Помощ. Зарежда файла с ръководството на потребителя в зависимост от установения език.
Private Sub mnuUserMan_Click()
Dim link
If Lang = "bg" Then
link = ShellExecute(hwnd, "Open", "MKA-2 Bul.chm", &O0, &O0, SW_MAXIMIZE)
Else
link = ShellExecute(hwnd, "Open", "MKA-2 Eng.chm", &O0, &O0, SW_MAXIMIZE)
End If
End Sub
FrmStep1
Форма, чрез която се въвежда описание на решавания проблем, алтернативите, критериите и техният тип (количествен, качествен, минимум максимум).
При зареждане на формата се извиква процедурата Form_Load, инициализира се променливата “Form1Visible = True”, вика се процедурата ChangeLanguage_Form1 за превод на формата на съответния език, който е зададен.
Private Sub Form_Load()
Form1Visible = True
ChangeLanguage_Form1
On_Crit = -1
Last_On_Crit = -1
NextBtn.Picture = MDIForm1.ImageList3.ListImages(4).Picture
End Sub
Целта на решаваната задача се задава в текстовото полето Text1.При промяна на текста в полето, се извиква процедурата Text1_Change.
Private Sub Text1_Change()
MDIForm1.Caption = "Solving " + Text1.Text
End Sub
В полето Text2 се въвежда името на критерия, процедурата Text2_KeyDown се извиква при настъпване на събитие “натиснат клавиш” на текстовото поле за въвеждане на критерии. Тя проверява дали натиснатият клавиш е ENTER и ако текстовото поле не е празно, извиква процедурата InsCritBtn_Click за добавяне на критерий в списъка с критерии.
Private Sub Text2_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn And Text2.Text <> "" Then InsCritBtn_Click
End Sub
Процедура InsCritBtn_Click се извиква при натискане на бутона InsCritBtn, обработва въведения в текстовото поле критерий и го проверява за грешки. Низът се проверява дали съдържа символите “(“ и ”:”. Извършва се проверка за коректност, дали дадения критерий вече не е въведен, ако някое от тях не е удовлетворено се извежда съобщение за грешка.
Private Sub InsCritBtn_Click()
Dim i, found As Integer
Dim Exist As Boolean
Dim Spl() As String
Dim MyStr, ForList As String
Dim EmptyOrNot As String
If Text2.Text <> "" Then
If Len(Text2.Text) > 30 Then
G_Mesg.errormsg 251
Exit Sub
End If
Text2.Text = Trim(Text2.Text)
If EditFlag = False Then
For i = 0 To List1.ListCount - 1
If List1.ListCount > 0 Then
Spl = Split(List1.list(i), "(")
MyStr = Spl(0)
Spl = Split(MyStr, ":")
MyStr = Spl(1)
Else
MyStr = ""
End If
If MyStr = Text2 Then Exist = True
Next
End If
found = InStr(Text2, ":")
If found <> 0 Then
G_Mesg.errormsg 96
Exit Sub
End If
found = InStr(Text2, "(")
If found <> 0 Then
G_Mesg.errormsg 97
Exit Sub
End If
If Exist Then
G_Mesg.errormsg 98
Exist = False
Exit Sub
End If
If On_Crit <> -1 Then Last_On_Crit = On_Crit
If Option3.Value = True Then
ForList = LoadResString(L + 102)
Else
ForList = LoadResString(L + 103)
End If
If EditFlag = False Then
If G_Crit_Number > 0 Then
If RemoveCritHaveElement = True Then
EmptyOrNot = RemoveCrit(UBound(RemoveCrit, 1) - 1, 1)
End If
End If
If EmptyOrNot <> "" Then
RemoveOrChangeCrit "Exist?", Text2.Text
End If
End If
If EditFlag = True Then
If Option1.Value = True Then
List1.RemoveItem EditIndex
List1.AddItem ForList + Text2 + LoadResString(L + 104), EditIndex
ElseIf Option2.Value = True Then
List1.RemoveItem EditIndex
List1.AddItem ForList + Text2 + LoadResString(L + 105), EditIndex
ElseIf Option5.Value = True Then
List1.RemoveItem EditIndex
List1.AddItem ForList + Text2 + LoadResString(L + 106), EditIndex
ElseIf Option6.Value = True Then
List1.RemoveItem EditIndex
List1.AddItem ForList + Text2 + LoadResString(L + 265), EditIndex
End If
EditFlag = False
Text2.Text = ""
Text2.SetFocus
Else
If Option1.Value = True Then
List1.AddItem ForList + Text2 + LoadResString(L + 104)
ElseIf Option2.Value = True Then
List1.AddItem ForList + Text2 + LoadResString(L + 105)
ElseIf Option5.Value = True Then
List1.AddItem ForList + Text2 + LoadResString(L + 106)
ElseIf Option6.Value = True Then
List1.AddItem ForList + Text2 + LoadResString(L + 265)
End If
Text2.Text = ""
Text2.SetFocus
End If
End If
MegaMatrixReady = False
MDIForm1.mMethods.Enabled = False
MDIForm1.mMegaMatrixView.Enabled = False
End Sub
Процедурата List1_DblClick се вика при двойно кликане върху списъка на критериите List1. Критерия, върху който е кликнато, се премахва от списъка и се връща за редакция в текстовото поле за въвеждане на критерии.
Private Sub List1_DblClick()
Dim i As Integer
If List1.ListIndex <= On_Crit Then
If CritType(List1.ListIndex) = "weight" Then
WeightCritCur = 0
For i = 0 To List1.ListIndex
If CritType(i) = "weight" Then
WeightCritCur = WeightCritCur + 1
End If
Next
End If
ViewCrit List1.ListIndex, True
CurCritNumber = List1.ListIndex
End If
End Sub
В полето Text3 се въвежда името на алтернативата, процедурата Text3_KeyDown се извиква при настъпване на събитие “натиснат клавиш” на текстовото поле за въвеждане на алтернативи. Тя проверява дали натиснатият клавиш е ENTER и ако текстовото поле не е празно, извиква процедурата InsAltBtn_Click за добавяне на алтернатива в списъка с алтернативите.
Private Sub Text3_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn And Text3.Text <> "" Then InsAltBtn_Click
End Sub
Процедурата InsAltBtn_Click се извиква при натискане на бутона InsAltBtn, обработва въведената в текстовото поле алтернатива и проверява дали вече съществува. При опит за повторно въвеждане на дадена алтернатива се извежда съобщение за грешка.
Private Sub InsAltBtn_Click()
If Text3.Text <> "" Then
If Len(Text3.Text) > 30 Then
G_Mesg.errormsg 252
Exit Sub
End If
Text3.Text = Trim(Text3.Text)
For i = 0 To List2.ListCount
If List2.list(i) = Text3 Then Exist = True
Next
If Exist Then
G_Mesg.errormsg 95
Exist = False
Exit Sub
End If
List2.AddItem Text3
Text3.Text = ""
Text3.SetFocus
End If
If On_Crit <> -1 Then Last_On_Crit = On_Crit
MegaMatrixReady = False
MDIForm1.mMethods.Enabled = False
MDIForm1.mMegaMatrixView.Enabled = False
End Sub
Процедурата List2_DblClick се вика при двойно кликане върху списъка на алтернативите List2, алтернативата върху която е кликнато, се премахва от списъка и се връща за редакция в текстовото поле за въвеждане на алтернативи.
Private Sub List2_DblClick()
Text3.Text = List2.Text
List2.RemoveItem (List2.ListIndex)
Text3.SetFocus
If On_Crit >= 0 Then
For i = 0 To G_Alt_Number - 1
If Text3.Text = G_Alt_Names(i) Then
RemoveAlt(UBound(RemoveAlt)) = i
ReDim Preserve RemoveAlt(UBound(RemoveAlt) + 1)
End If
Next
End If
If On_Crit <> -1 Then Last_On_Crit = On_Crit
MegaMatrixReady = False
MDIForm1.mMethods.Enabled = False
MDIForm1.mMegaMatrixView.Enabled = False
End Sub
След натискането на бутона NextBtn е налична достатъчна информация за инициализирането на някои от основните структури (глобални променливи и масиви).
Private Sub NextBtn_Click()
Dim i As Integer
Dim Exist As Boolean
Dim Spl() As String
Dim Spl1() As String
Dim TempCheck As Boolean
Dim EmptyOrNot As Variant
If Form5Visible = True Then
CheckData Form5, Form5.MSFlexGrid1
ElseIf Form6Visible = True Then
CheckData Form6, Form6.MSFlexGrid1
ElseIf FormArrangingAltVisible = True Then
CheckData ArrangingAlt, ArrangingAlt.MSFlexGrid1
End If
G_Qn_Number = 0
G_Ql_Number = 0
G_Rnk_Number = 0
G_Weight_Number = 0
ProblemName = Text1.Text
If MethodsVisible = True Then
Unload Methods
End If
If Domination_ListVisible = True Then
Unload Domination_List
End If
If (List1.ListCount = 0) Or (List2.ListCount = 0) Then
G_Mesg.errormsg 99
Exit Sub
End If
If (List2.ListCount < 2) Then
'wawedi powe4e ot edna alternativi
G_Mesg.errormsg 254
Exit Sub
End If
If (List1.ListCount < 2) Then
'wawedi powe4e ot edin kriterii
G_Mesg.errormsg 255
Exit Sub
End If
G_Crit_Number = List1.ListCount
G_Alt_Number = List2.ListCount
ReDim Preserve G_Crit_Names(List1.ListCount - 1)
ReDim Preserve CritType(List1.ListCount - 1)
ReDim Preserve MinMax(List1.ListCount - 1)
For i = 0 To List1.ListCount - 1
G_Mesg.debugmsg "Adding criterion #" + CStr(i + 1) + ": " + List1.list(i)
Spl1 = Split(List1.list(i), ":")
MinMax(i) = Spl1(0)
Spl = Split(Spl1(1), "(")
G_Crit_Names(i) = Spl(0)
If (Spl(1) = "quantitative)") Or (Spl(1) = "êîëè÷åñòâåí)") Then
CritType(i) = "qn"
G_Qn_Number = G_Qn_Number + 1
End If
If (Spl(1) = "qualitative)") Or (Spl(1) = "êà÷åñòâåí)") Then
CritType(i) = "ql"
G_Ql_Number = G_Ql_Number + 1
End If
If (Spl(1) = "arranged)") Or (Spl(1) = "ðàíæèðàù)") Then
CritType(i) = "rnk"
G_Rnk_Number = G_Rnk_Number + 1
End If
If (Spl(1) = "weight)") Or (Spl(1) = "òåãëîâåí)") Then
CritType(i) = "weight"
G_Weight_Number = G_Weight_Number + 1
End If
Next
G_Mesg.debugmsg "Min or Max for each criterion"
For i = 0 To G_Crit_Number - 1
G_Mesg.debugmsg MinMax(i)
Next
G_Mesg.debugmsg "CritType Vector"
For i = 0 To G_Crit_Number - 1
G_Mesg.debugmsg CritType(i)
Next
ReDim Preserve G_Alt_Names(List2.ListCount - 1)
For i = 0 To List2.ListCount - 1
G_Mesg.debugmsg "Adding alternative #" + CStr(i + 1) + ": " + List2.list(i)
G_Alt_Names(i) = List2.list(i)
Next
G_Mesg.debugmsg "Count of quantitative criteria: " + CStr(G_Qn_Number)
RelativeMatrix.InitMatrix G_Crit_Number, G_Crit_Number
RelativeMatrixAlt.InitMatrix G_Alt_Number, G_Alt_Number
MDIForm1.StatusBar1.Panels(1).Text = LoadResString(L + 84) + CStr(G_Crit_Number)
MDIForm1.StatusBar1.Panels(2).Text = LoadResString(L + 85) + CStr(G_Alt_Number)
GlobalsReady = True
ALLWeightCrit = -1
For i = 0 To G_Crit_Number - 1
If CritType(i) = "weight" Then
ALLWeightCrit = ALLWeightCrit + 1
End If
Next
WeightCritCur = 0
CurCritNumber = 0
If MegaMatrixReady = False And On_Crit = -1 Then
ReDim MegaMatrix(G_Crit_Number - 1, G_Alt_Number - 1)
End If
TempCheck = IsThereAnyChangeInTask
If (TempCheck = True) Then
ExitFlag = False
SaveFrm.Show 1, MDIForm1
ResizeMegaMatrix
If ALLWeightCrit >= 0 Then
AltCombi = (Factoriel(G_Alt_Number) / (2 * Factoriel(G_Alt_Number - 2)))
If ValFromScrolBarIsInit = True Then
EmptyOrNot = ValFromScrolBar(0, 0)
End If
If EmptyOrNot > 0 Then
ResizeDimensionValFromScrolBarMain
ResizeValFromScrolBar
Else
ReDim ValFromScrolBar(ALLWeightCrit, AltCombi - 1)
ValFromScrolBarIsInit = True
End If
End If
If On_Crit >= 0 Then
ViewCrit CurCritNumber, True 'za seldwashtia criterii ima we4e wawedena inf., 4etem ja ot MegaMatrix
Exit Sub
End If
ViewCrit CurCritNumber, MegaMatrixReady
Else
If On_Crit = -1 And WeightCritCur = 0 And ALLWeightCrit >= 0 Then
AltCombi = (Factoriel(G_Alt_Number) / (2 * Factoriel(G_Alt_Number - 2)))
ReDim ValFromScrolBar(ALLWeightCrit, AltCombi - 1)
InitPositionOfTheWeightCrit = False
ResizeDimensionValFromScrolBarMain
ValFromScrolBarIsInit = True
End If
If On_Crit >= 0 Then
ViewCrit CurCritNumber, True 'za seldwashtia criterii ima we4e wawedena inf., 4etem ja ot MegaMatrix
Exit Sub
End If
ViewCrit CurCritNumber, MegaMatrixReady
End If
EditIndex = -1
End Sub
FrmRelativeAlt
Това е форматаза въвеждане на стойностите на алтернативите по отношение на критерии, дефинирани като качествени . Съдържа етикет, показващ текущия критерий; падащ списък, съдържащ скала “много лошо-отлично” с 9 възможни стойности; таблица с две колони, от които едната фиксирана, съдържаща имената на алтернативите, а другата – съответната стойност на алтернативата по скалата. Формата съдържа, също така, вида бутоните – “Напред” и “Назад” за преминаване към следващия и към предходния критерий.
Процедурата LabelAttr надписва фиксираната първа колона на Grid-а с имената на алтернативите.
Public Sub LabelAttr()
Dim i As Integer
MSFlexGrid1.Clear
MSFlexGrid1.Col = 0
For i = 0 To MSFlexGrid1.Rows - 1
MSFlexGrid1.Row = i
MSFlexGrid1.CellAlignment = flexAlignLeftCenter
MSFlexGrid1.Text = G_Alt_Names(i)
Next
Resize MSFlexGrid1, Form5, G_Alt_Number - 1, 0
MSFlexGrid1.Col = 1
End Sub
Процедурата SetCaption установява надписа на етикета Label3, представляващ текущия критерий.
Public Sub SetCaption(St As String)
Form5.Label3.Caption = St
End Sub
Процедурата Combo2_Click обработва събитието “избран елемент от падащия списък”. На текущо избраната алтернатива от таблицата поставя във втората колона избраната от падащия списък стойност. Същата стойност се попълва и в буферния масив TempVals.
Private Sub Combo2_Click()
Dim currentRow As Integer
currentRow = MSFlexGrid1.Row
If Form5ComboFlag = True Then
MSFlexGrid1.Col = 1
MSFlexGrid1.Text = Combo2.Text
MegaMatrix(CurCritNumber, MSFlexGrid1.Row) = Combo2.ItemData(Combo2.ListIndex)
End If
Resize MSFlexGrid1, Form5, G_Alt_Number - 1, 0
MSFlexGrid1.SetFocus
MSFlexGrid1.Col = 1
MSFlexGrid1.Row = currentRow
End Sub
Процедурата Command1_Click обработва събитието “натиснат” за бутона “Напред”. Ако текущият критерий не е първи, се намалява стойността на променливата CurCritNumber с единица. Извиква се процедурата ViewCrit с параметри CurCritNumber и True, като вторият означава, че формата за предишния критерий трябва да бъде попълнена със стойности.
Private Sub Command1_Click()
Dim i As Integer
Dim TestStr As String
If CurCritNumber >= 0 Then
TestStr = ""
MSFlexGrid1.Col = 1
For i = 0 To MSFlexGrid1.Rows - 1
MSFlexGrid1.Row = i
TestStr = TestStr + MSFlexGrid1.Text
Next
If Len(TestStr) = 0 Then
On_Crit = On_Crit - 1
CheckDataIsPassed = True
End If
If CurCritNumber > 0 Then
CurCritNumber = CurCritNumber - 1
If CritType(CurCritNumber) = "weight" Then
WeightCritCur = WeightCritCur - 1
End If
ViewCrit CurCritNumber, True
Else
Unload Me
If Form1Visible = True Then
Form1.SetFocus
Else
Form1.Show
End If
End If
End If
End Sub
Процедурата Command2_Click обработва събитието “натиснат” за бутона “Назад”. Първо обхожда втората колона на таблицата и проверява дали няма непопълнени стойности. Ако има, генерира грешка, извиквайки метода errormsg на обекта “G_Mesg” и напуска процедурата. Ако всички стойности са попълнени, попълват се съответните стойности в масива MegaMatrix.
Private Sub Command2_Click()
Dim i As Integer
MSFlexGrid1.Col = 1
For i = 0 To MSFlexGrid1.Rows - 1
MSFlexGrid1.Row = i
If MSFlexGrid1.Text = "" Then
Error_InCurrentSel i, MSFlexGrid1
G_Mesg.errormsg 91 '"All info must be entered!"
Exit Sub
End If
Next
If CurCritNumber < G_Crit_Number - 1 Then
If RemOrEditCrit(0, 0) <> "" And (IsThisCriterionChangeOrRemove(CurCritNumber + 1)) = False And (IsThisCriterionSet(CurCritNumber + 1)) = False Then
On_Crit = On_Crit + 1
End If
If (CurCritNumber < On_Crit) Then '+ 1 Then
ViewCrit CurCritNumber + 1, True 'za seldwashtia criterii ima we4e wawedena inf., 4etem ja ot MegaMatrix
If On_Crit = CurCritNumber Then On_Crit = On_Crit + 1
CurCritNumber = CurCritNumber + 1
Else
ViewCrit CurCritNumber + 1, False
If On_Crit = CurCritNumber Then On_Crit = On_Crit + 1
CurCritNumber = CurCritNumber + 1
End If
Else
Unload Me
Methods.Show
MegaMatrixReady = True
MDIForm1.mMethods.Enabled = True
MDIForm1.mMegaMatrixView.Enabled = True
End If
End Sub
FrmMethods
Форма за избор на метод за решаване на задачата. При зареждане на формата се извиква процедурата Form_Load, инициализира се променливата MethodsVisible със стойност True. Чрез групата от четири радио-бутона Option1, Option2, Option3 и Option6 се определя метода, по който ще бъде решавана задачата. Групата от два радио бутона Option4 и Option5 се активира след избор на радио-бутон Option3.
Private Sub Form_Load()
Dim i As Integer
ReDim RemOrEditCrit(0, 1)
CenterForm Methods
Command1.Picture = MDIForm1.ImageList3.ListImages(6).Picture
there_is_no_dominant = 0
MethodsVisible = True
ChangeLanguage_Methods
CheckDominant2
G_Mesg.debugmsg "===-Dominant Vector-==="
For i = 0 To G_Alt_Number - 1
G_Mesg.debugmsg CStr(DominantVector(i))
If DominantVector(i) Then
Domination_List.List1.AddItem G_Alt_Names(i)
End If
If DominantVector(i) = False Then
there_is_no_dominant = there_is_no_dominant + 1
End If
Next
If Form3Visible = False And PrometheeVisible = False And ElectreVisible = False And pbimVisible = False And SolveVisible = False Then
Domination_List.Show
Else
If Domination_List.Visible = True Then
Unload Domination_List
End If
End If
End Sub
След натискане на бутона Command1 се извиква процедурата Command1_Click, която проверява стойността True/False на свойството Value на четирите контроли (Option1, Option2, Option3 и Option6).
Ако стойността на Option1.Value е True, се извиква форма FrmRelaticeAdd.
Ако стойността на Option2.Value е True, се извиква форма FrmPromethee. Извикват се процедурите Show и LabelAlt Crit, които са дефинирани във форма FrmPromethee.
Ако стойността на Option6.Value е True, се извиква форма Electre. Извикват се процедурите Show и LabelAlt Crit, дефинирани във форма Electre.
Ако стойността на Option3.Value е True, се проверява кой радио-бутон Option4 или Option5 е избран. Ако е Option4 е избран, се извиква форма Frmpbim, в противен случаи се извиква форма FrmSolve.
Private Sub Command1_Click()
Dim i, j As Integer
Dim mrow As String
Rezult = False
CloseAllWindows 0
G_Mesg.debugmsg "-===MegaMatrix===-"
For i = 0 To G_Alt_Number - 1
mrow = ""
For j = 0 To G_Crit_Number - 1
mrow = mrow + CStr(MegaMatrix(j, i)) + "|"
Next
G_Mesg.debugmsg mrow
Next
If Option1.Value = True Then
Form3.Show
Me.Hide
MDIForm1.StatusBar1.Panels(3).Text = LoadResString(L + 83) + " " + LoadResString(L + 80)
MDIForm1.StatusBar1.Panels(3).Width = TextWidth(LoadResString(L + 83) + LoadResString(L + 80)) * 1.4
Selected_Method = "AHP"
End If
If Option2.Value = True Then
Promethee.Show
Promethee.LabelAlt_Crit
Selected_Method = "Promethee"
MDIForm1.StatusBar1.Panels(3).Text = LoadResString(L + 83) + " " + LoadResString(L + 29)
MDIForm1.StatusBar1.Panels(3).Width = TextWidth(LoadResString(L + 83) + LoadResString(L + 29)) * 1.4
Me.Hide
End If
If Option6.Value = True Then
Electre.Show
Electre.LabelAlt_Crit
Selected_Method = "Electre"
MDIForm1.StatusBar1.Panels(3).Text = LoadResString(L + 83) + " " + LoadResString(L + 258)
MDIForm1.StatusBar1.Panels(3).Width = TextWidth(LoadResString(L + 83) + LoadResString(L + 258)) * 1.4
Me.Hide
End If
If Option3.Value = True Then
pbim.Copy_MegaMatrix_in_PbimMatrix
G_cur_step = -1
G_steps = -1
If Option4.Value = True Then
CurAlternative = ChooseAlternative
Me.Hide
MDIForm1.StatusBar1.Panels(3).Text = LoadResString(L + 83) + " " + LoadResString(L + 81)
Selected_Method = "Partition-Based Interactive Method"
MDIForm1.StatusBar1.Panels(3).Width = TextWidth(LoadResString(L + 83) + LoadResString(L + 81)) * 1.4
pbim.Show
Else
Me.Hide
FirstTime = True
CurAlternative = 0 ' tuka beshe 1
MDIForm1.StatusBar1.Panels(3).Text = LoadResString(L + 83) + " " + LoadResString(L + 81)
Selected_Method = "Partition-Based Interactive Method"
MDIForm1.StatusBar1.Panels(3).Width = TextWidth(LoadResString(L + 83) + LoadResString(L + 81)) * 1.4
Solve.Show
End If
End If
Unload Me
End Sub
Сподели с приятели: |