рдЧреЗрдо рдереНрдпреЛрд░реА рдПрдХ рдЧрдгрд┐рддреАрдп рдЕрдиреБрд╢рд╛рд╕рди рд╣реИ рдЬреЛ рдПрдХ рд▓рдХреНрд╖реНрдп рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдореЙрдбрд▓рд┐рдВрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рдВрдШрд░реНрд╖ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рдЪреБрдирдирд╛ рд╣реИред Habr├й рдкрд░ рдпрд╣ рд╡рд┐рд╖рдп рдкрд╣рд▓реЗ рд╣реА
рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЬ рд╣рдо рдЗрд╕рдХреЗ рдХреБрдЫ рдкрд╣рд▓реБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ Kotlin рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдЗрд╕рд▓рд┐рдП, рдПрдХ рд░рдгрдиреАрддрд┐ рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ рдЬреЛ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХрджрдо рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреА рд╣реИред рдЗрд╖реНрдЯрддрдо рдЦрд┐рд▓рд╛рдбрд╝реА рд░рдгрдиреАрддрд┐ рд╡рд╣ рд░рдгрдиреАрддрд┐ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдЦреЗрд▓ рдореЗрдВ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рд╕реНрдерд╛рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рдЕрдзрд┐рдХрддрдо рд▓рд╛рднред рдпрджрд┐ рдЦреЗрд▓ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд, рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд╛рд▓ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╖реНрдЯрддрдо рд░рдгрдиреАрддрд┐ рдЕрдзрд┐рдХрддрдо рдФрд╕рдд рдЬреАрдд рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред
рдЧреЗрдо рдереНрдпреЛрд░реА рдХрд╛ рдХрд╛рдо рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рддрдо рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ рд╣реИред рдореБрдЦреНрдп рдзрд╛рд░рдгрд╛, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╖реНрдЯрддрдо рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА (рдпрд╛ рд╡рд┐рд░реЛрдзреА) рдЦреБрдж рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдмреБрджреНрдзрд┐рдорд╛рди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЙрдЪрд┐рдд рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рдХреА рдЧрдгрдирд╛ рд╕рдВрдШрд░реНрд╖ рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдкрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЦреЗрд▓реЛрдВ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдиреАрдВрд╡ рдореЗрдВ рд░рдЦреА рдЧрдИ рд╣реИред
рдкреНрд░рдХреГрддрд┐ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рддрд┐рднрд╛рдЧреА рдЕрдкрдиреЗ рд▓рд╛рдн рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рддрд╛ рд╣реИред рдкреНрд░рдХреГрддрд┐ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдЧрдгрд┐рддреАрдп рдореЙрдбрд▓ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХреА рдкрд╕рдВрдж рдЙрджреНрджреЗрд╢реНрдп рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрднреЛрдХреНрддрд╛ рдорд╛рдВрдЧ, рдкреНрд░рдХреГрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдЖрджрд┐ред "рдкреНрд░рдХреГрддрд┐" рдПрдХ рдкреНрд░рддрд┐рдХреВрд▓ рдХреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХрд╛ рдкреАрдЫрд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╖реНрдЯрддрдо рд░рдгрдиреАрддрд┐ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдорд╛рдирджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рдХреГрддрд┐ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдореЗрдВ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдп рд╣реИрдВ:
- рдЬреЛрдЦрд┐рдо рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдЬрдм рд╕рдореНрднрд╛рд╡рд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдореНрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЬреНрдЮрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
- рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп, рдЬрдм рдкреНрд░рдХреГрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рдЗрди рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ
рдпрд╣рд╛рдБ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛
рд╣реИ ред
рдЕрдм рд╣рдо рд╢реБрджреНрдз рд░рдгрдиреАрддрд┐рдпреЛрдВ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рдорд╛рдирджрдВрдбреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдкрджреНрдзрддрд┐ рд╕реЗ рдорд┐рд╢реНрд░рд┐рдд рд░рдгрдиреАрддрд┐рдпреЛрдВ рдореЗрдВ рдЦреЗрд▓ рдХреЛ рд╣рд▓ рдХрд░реЗрдВрдЧреЗред
ogovorochkaрдореИрдВ рдЧреЗрдо рдереНрдпреЛрд░реА рдХрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдХрд╛рдо рдореЗрдВ рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдХреЛрдЯрд▓рд┐рди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдк рд▓реЗрдЦ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдпрд╛ рд╕рд▓рд╛рд╣ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдкреАрдПрдо рдХреЛ рдмрддрд╛рдПрдВред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдирджрдВрдбреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред рдХрд╛рд░реНрдп рдпрд╣ рд╣реИ: рдХрд┐рд╕рд╛рди рдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдЗрди рдлрд╕рд▓реЛрдВ рдХреА рдкреИрджрд╛рд╡рд╛рд░ рдХреЗ рд╕рд╛рде, рддреАрди рдлрд╕рд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЦреЗрдд рдХреЛ рдХрд┐рд╕ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдП, рдФрд░ рдЗрд╕рд▓рд┐рдП, рд▓рд╛рдн, рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЧрд░реНрдореА рдХреИрд╕реА рд╣реЛрдЧреА: рд╢рд╛рдВрдд рдФрд░ рдмрд░рд╕рд╛рдд, рд╕рд╛рдорд╛рдиреНрдп, рдпрд╛ рдЧрд░реНрдо рдФрд░ рд╢реБрд╖реНрдХред рдХрд┐рд╕рд╛рди рдиреЗ рдореМрд╕рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдлрд╕рд▓реЛрдВ рд╕реЗ 1 рд╣реЗрдХреНрдЯреЗрдпрд░ рддрдХ рд╢реБрджреНрдз рд▓рд╛рдн рдХреА рдЧрдгрдирд╛ рдХреАред рдЦреЗрд▓ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдЖрдЧреЗ рд╣рдо рдЗрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВрдЧреЗ:
рдпреВ 1 = ( 0 , 2 , 5 ) , рдпреВ 2 = ( 2 , 3 , 1 ) , рдпреВ 3 = ( 4 , 3 , - 1 )
рд╡рд╛рдВрдЫрд┐рдд рдЗрд╖реНрдЯрддрдо рд░рдгрдиреАрддрд┐ рджреНрд╡рд╛рд░рд╛ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИ
рдпреВ рдС рдк реН рдЯ ред рд╣рдо рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдФрд░ рдЬреЛрдЦрд┐рдо рдореЗрдВ рдмреЗрдп рдФрд░ рд▓рд╛рдкреНрд▓рд╛рд╕ рдорд╛рдирджрдВрдб рдХреЗ рд╕рд╛рдордиреЗ рд╡рд╛рд▓реНрдб рдорд╛рдирджрдВрдб, рдЖрд╢рд╛рд╡рд╛рдж, рдирд┐рд░рд╛рд╢рд╛рд╡рд╛рдж, рд╕реИрд╡реЗрдЬ рдФрд░ рд╣рд░реНрд╡рд┐рдЯреНрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреЗрд▓ рдХреЛ рд╣рд▓ рдХрд░реЗрдВрдЧреЗред
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЛрдЯрд▓рд┐рди рдкрд░ рд╣реЛрдВрдЧреЗред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдРрд╕реЗ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ рдЬреИрд╕реЗ рдЧрдореНрдмрд┐рдд (рд╕реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП), рдПрдХреНрд╕реЗрд▓рд░реЛрдб рдФрд░ рдкрд╛рдпрдирдлреЗрдЬ (рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП), рд▓реЗрдХрд┐рди рд╣рдо рдЕрдкрдиреА рдмрд╛рдЗрдХ рдХреА рд╕рд╡рд╛рд░реА рдХрд░реЗрдВрдЧреЗ, рдШреБрдЯрдиреЗ рдкрд░ рдЗрдХрдЯреНрдареЗ рд╣реЛрдВрдЧреЗ, рдмрд╕ рдереЛрдбрд╝рд╛ рд╕реНрдЯрд╛рдЗрд▓рд┐рд╢, рдлреИрд╢рдиреЗрдмрд▓ рдФрд░ рдкреЛрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреБрд╡рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ред
рдЦреЗрд▓ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрдИ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдХрд┐рд╕реА рдЦреЗрд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдпрд╛ рд╕реНрддрдВрдн рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХрдХреНрд╖рд╛ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ (рд╡рд┐рдХрд▓реНрдк рдпрд╛ рдкреНрд░рдХреГрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐) рдФрд░ рдЙрдирдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╛рдо рдХреА рд╕реВрдЪреА рд╢рд╛рдорд┐рд▓ рд╣реИред
key
рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рд╛рде рд╣реА рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдкреНрд░рднреБрддреНрд╡ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рддреБрд▓рдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЦреЗрд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкрдВрдХреНрддрд┐ рдпрд╛ рд╕реНрддрдВрдн import java.text.DecimalFormat import java.text.NumberFormat open class GameVector(name: String, values: List<Double>, key: Int = -1) : Comparable<GameVector> { val name: String val values: List<Double> val key: Int private val formatter:NumberFormat = DecimalFormat("#0.00") init { this.name = name; this.values = values; this.key = key; } public fun max(): Double? { return values.max(); } public fun min(): Double? { return values.min(); } override fun toString(): String{ return name + ": " + values .map { v -> formatter.format(v) } .reduce( {f1: String, f2: String -> "$f1 $f2"}) } override fun compareTo(other: GameVector): Int { var compare = 0 if (this.key == other.key){ return compare } var great = true for (i in 0..this.values.lastIndex){ great = great && this.values[i] >= other.values[i] } if (great){ compare = 1 }else{ var less = true for (i in 0..this.values.lastIndex){ less = less && this.values[i] <= other.values[i] } if (less){ compare = -1 } } return compare } }
рдЧреЗрдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рд╡рд┐рдХрд▓реНрдк рдФрд░ рдкреНрд░рдХреГрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рдореБрдЦ рд╕реЗрдЯ рдФрд░ рдЧреЗрдо рдХреА рд╢реБрджреНрдз рдХреАрдордд рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ред
рдЦреЗрд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ open class GameMatrix(matrix: List<List<Double>>, alternativeNames: List<String>, natureStateNames: List<String>) { val matrix: List<List<Double>> val alternativeNames: List<String> val natureStateNames: List<String> val alternatives: List<GameVector> val natureStates: List<GameVector> init { this.matrix = matrix; this.alternativeNames = alternativeNames this.natureStateNames = natureStateNames var alts: MutableList<GameVector> = mutableListOf() for (i in 0..matrix.lastIndex) { val currAlternative = alternativeNames[i] val gameVector = GameVector(currAlternative, matrix[i], i) alts.add(gameVector) } alternatives = alts.toList() var nss: MutableList<GameVector> = mutableListOf() val lastIndex = matrix[0].lastIndex // , for (j in 0..lastIndex) { val currState = natureStateNames[j] var states: MutableList<Double> = mutableListOf() for (i in 0..matrix.lastIndex) { states.add(matrix[i][j]) } val gameVector = GameVector(currState, states.toList(), j) nss.add(gameVector) } natureStates = nss.toList() } open fun change (i : Int, j : Int, value : Double) : GameMatrix{ var mml = this.matrix.toMutableList() var rowi = mml[i].toMutableList() rowi.set(j, value) mml.set(i, rowi) return GameMatrix(mml.toList(), alternativeNames, natureStateNames) } open fun changeAlternativeName (i : Int, value : String) : GameMatrix{ var list = alternativeNames.toMutableList() list.set(i, value) return GameMatrix(matrix, list.toList(), natureStateNames) } open fun changeNatureStateName (j : Int, value : String) : GameMatrix{ var list = natureStateNames.toMutableList() list.set(j, value) return GameMatrix(matrix, alternativeNames, list.toList()) } fun size() : Pair<Int, Int>{ return Pair(alternatives.size, natureStates.size) } override fun toString(): String { return " :\n" + natureStateNames.reduce { n1: String, n2: String -> "$n1;\n$n2" } + "\n :\n" + alternatives .map { a: GameVector -> a.toString() } .reduce { a1: String, a2: String -> "$a1;\n$a2" } } protected fun dominateSet(gvl: List<GameVector>, list: MutableList<String>, dvv: Int) : MutableSet<GameVector>{ var dSet: MutableSet<GameVector> = mutableSetOf() for (gv in gvl){ for (gvv in gvl){ if (!dSet.contains(gv) && !dSet.contains(gvv)) { if (gv.compareTo(gvv) == dvv) { dSet.add(gv) list.add("[$gvv] [$gv]") } } } } return dSet } open fun newMatrix(dCol: MutableSet<GameVector>, dRow: MutableSet<GameVector>) : GameMatrix{ var result: MutableList<MutableList<Double>> = mutableListOf() var ralternativeNames: MutableList<String> = mutableListOf() var rnatureStateNames: MutableList<String> = mutableListOf() val dIndex = dCol.map { c -> c.key }.toList() for (i in 0 .. natureStateNames.lastIndex){ if (!dIndex.contains(i)){ rnatureStateNames.add(natureStateNames[i]) } } for (gv in this.alternatives){ if (!dRow.contains(gv)){ var nr: MutableList<Double> = mutableListOf() for (i in 0 .. gv.values.lastIndex){ if (!dIndex.contains(i)){ nr.add(gv.values[i]) } } result.add(nr) ralternativeNames.add(gv.name) } } val rlist = result.map { r -> r.toList() }.toList() return GameMatrix(rlist, ralternativeNames.toList(), rnatureStateNames.toList()) } fun dominateMatrix(): Pair<GameMatrix, List<String>>{ var list: MutableList<String> = mutableListOf() var dCol: MutableSet<GameVector> = dominateSet(this.natureStates, list, 1) var dRow: MutableSet<GameVector> = dominateSet(this.alternatives, list, -1) val newMatrix = newMatrix(dCol, dRow) var ddgm = Pair(newMatrix, list.toList()) val ret = iterate(ddgm, list) return ret; } protected fun iterate(ddgm: Pair<GameMatrix, List<String>>, list: MutableList<String>) : Pair<GameMatrix, List<String>>{ var dgm = this var lddgm = ddgm while (dgm.size() != lddgm.first.size()){ dgm = lddgm.first list.addAll(lddgm.second) lddgm = dgm.dominateMatrix() } return Pair(dgm,list.toList().distinct()) } fun minClearPrice(): Double{ val map: List<Double> = this.alternatives.map { a -> a?.min() ?: 0.0 } return map?.max() ?: 0.0 } fun maxClearPrice(): Double{ val map: List<Double> = this.natureStates.map { a -> a?.max() ?: 0.0 } return map?.min() ?: 0.0 } fun existsClearStrategy() : Boolean{ return minClearPrice() >= maxClearPrice() } }
рд╣рдо рдЙрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ
рдорд╛рдкрджрдВрдб interface ICriteria { fun optimum(): List<GameVector> }
рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХреЗ рддрд╣рдд рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛
рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХреЗ рдЪреЗрд╣рд░реЗ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдПрдХ рдЙрдЪрд┐рдд рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рд╡рд╛рд▓реНрдб рдХреА рдХрд╕реМрдЯреА
рд╡рд╛рд▓реНрдб рдорд╛рдирджрдВрдб рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рддрд╛ рд╣реИ:
u o p t = m a x i m i n j [ U ]
рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЦрд┐рд▓рд╛рдл рдХрд╕реМрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреА рд░рдгрдиреАрддрд┐ рдХреА рдХреАрдордд рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рдВрднрд╡ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдЕрд╡рд╕рд░ рдХрд╛ рдиреБрдХрд╕рд╛рди рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП
рдпреВ 1 = ( 0 , 2 , 5 ) , рдпреВ 2 = ( 2 , 3 , 1 ) , рдпреВ 3 = ( 4 , 3 , - 1 ) рдЪрдврд╝рд╛рд╡ рдХреЛ рдЦреЛрдЬреЗрдВ рдФрд░ рдЕрдЧрд▓реЗ рддреАрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рдПрд╕ = ( 0 , 1 , - 1 ) ред рд╕рдВрдХреЗрддрд┐рдд рдЯреНрд░рд┐рдкрд▓ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп 1 рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП, рд╡рд╛рд▓реНрдб рдорд╛рдирджрдВрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЬреАрддрдиреЗ рдХреА рд░рдгрдиреАрддрд┐ рд░рдгрдиреАрддрд┐ рд╣реИ
U2=(2,3,1) рд░реЛрдкрдг рд╕рдВрд╕реНрдХреГрддрд┐ рдХреЗ рдЕрдиреБрд░реВрдк реиред
рд╡рд╛рд▓реНрдб рдорд╛рдирджрдВрдб рдХрд╛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд░рд▓ рд╣реИ:
class WaldCriteria(gameMatrix : GameMatrix) : ICriteria { val gameMatrix: GameMatrix init{ this.gameMatrix = gameMatrix } override fun optimum(): List<GameVector> { val mins = gameMatrix.alternatives.map { a -> Pair(a, a.min()) } val max = mins.maxWith( Comparator { o1, o2 -> o1.second!!.compareTo(o2.second!!)}) return mins .filter { m -> m.second == max!!.second } .map { m -> m.first } } }
рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реА рдмрд╛рд░ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рд╕рдорд╛рдзрд╛рди рдкрд░реАрдХреНрд╖рдг рдХреА рддрд░рд╣ рдХреИрд╕реЗ рджрд┐рдЦреЗрдЧрд╛:
рдХрд╕реМрдЯреА private fun matrix(): GameMatrix { val alternativeNames: List<String> = listOf(" 1", " 2", " 3") val natureStateNames: List<String> = listOf(" ", "", " ") val matrix: List<List<Double>> = listOf( listOf(0.0, 2.0, 5.0), listOf(2.0, 3.0, 1.0), listOf(4.0, 3.0, -1.0) ) val gm = GameMatrix(matrix, alternativeNames, natureStateNames) return gm; } } private fun testCriteria(gameMatrix: GameMatrix, criteria: ICriteria, name: String){ println(gameMatrix.toString()) val optimum = criteria.optimum() println("$name. : ") optimum.forEach { o -> println(o.toString()) } } @Test fun testWaldCriteria() { val matrix = matrix(); val criteria = WaldCriteria(matrix) testCriteria(matrix, criteria, " ") }
рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЕрдиреНрдп рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП, рдЕрдВрддрд░ рдХреЗрд╡рд▓
criteria
рд╡рд╕реНрддреБ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╣реЛрдЧрд╛ред
рдЖрд╢рд╛рд╡рд╛рдж рдХреА рдХрд╕реМрдЯреА
рдПрдХ рдЖрд╢рд╛рд╡рд╛рджреА рдХреА рдХрд╕реМрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЦрд┐рд▓рд╛рдбрд╝реА рдПрдХ рдРрд╕рд╛ рд╕рдорд╛рдзрд╛рди рдЪреБрдирддрд╛ рд╣реИ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЖрд╢рд╛рд╡рд╛рджреА рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЦреЗрд▓ рдХреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрдВрдЧреА:
uрдСрдкреНрдЯ=рдореИрдХреНрд╕iрдореИрдХреНрд╕рдЬреЗ[рдпреВ]
рдПрдХ рдЖрд╢рд╛рд╡рд╛рджреА рдХреА рд░рдгрдиреАрддрд┐ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдо рдкреИрджрд╛ рдХрд░ рд╕рдХрддреА рд╣реИ рдЬрдм рдЕрдзрд┐рдХрддрдо рдЖрдкреВрд░реНрддрд┐ рдиреНрдпреВрдирддрдо рдорд╛рдВрдЧ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддреА рд╣реИ - рдХрдВрдкрдиреА рдХреЛ рдХрдИ рдЧреБрдирд╛ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп рдиреБрдХрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реА рд╕рдордп, рдЖрд╢рд╛рд╡рд╛рджреА рдХреА рд░рдгрдиреАрддрд┐ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрд░реНрде рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрд╕рдВрддреБрд╖реНрдЯ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рджреЗрдЦрднрд╛рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рдВрдЧ рд╣рдореЗрд╢рд╛ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЕрдзрд┐рдХрддрдо рдорд╛рдВрдЧ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрд╢рд╛рд╡рд╛рджреА рдХреА рд░рдгрдиреАрддрд┐ рдЖрдкрдХреЛ рдЕрдзрд┐рдХрддрдо рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рдЦреЛрдП рд╣реБрдП рдореБрдирд╛рдлреЗ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд╕реЗ рдХреБрдЫ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдлрд╛рдпрджреЗ рдорд┐рд▓рддреЗ рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП
U1=(0,2,5),U2=(2,3,1),U3=(4,3,тИТ1) рдЦреЛрдЬреЗрдВ, рдЕрдзрд┐рдХрддрдо рдЦреЛрдЬреЗрдВ рдФрд░ рдЕрдЧрд▓реЗ рддреАрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
S=(5,3,4) ред рд╕рдВрдХреЗрддрд┐рдд рдЯреНрд░рд┐рдкрд▓ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп 5 рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП, рдЖрд╢рд╛рд╡рд╛рдж рдХреА рдХрд╕реМрдЯреА рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд░рдгрдиреАрддрд┐ рдореЗрдВ рдЬреАрдд рдХреА рд░рдгрдиреАрддрд┐ рд╣реИ
U1=(0.2.5) рд░реЛрдкрдг рд╕рдВрд╕реНрдХреГрддрд┐ рдХреЗ рдЕрдиреБрд░реВрдк 1ред
рдЖрд╢рд╛рд╡рд╛рдж рдХреА рдХрд╕реМрдЯреА рдкрд░ рдЕрдорд▓ рдХрд░рдирд╛ рд╡рд╛рд▓реНрдб рдХреА рдХрд╕реМрдЯреА рд╕реЗ рд▓рдЧрднрдЧ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ:
class WaldCriteria(gameMatrix : GameMatrix) : ICriteria { val gameMatrix: GameMatrix init{ this.gameMatrix = gameMatrix } override fun optimum(): List<GameVector> { val mins = gameMatrix.alternatives.map { a -> Pair(a, a.min()) } val max = mins.maxWith( Comparator { o1, o2 -> o1.second!!.compareTo(o2.second!!)}) return mins .filter { m -> m.second == max!!.second } .map { m -> m.first } } }
рдирд┐рд░рд╛рд╢рд╛рд╡рд╛рдж рдХрд╛ рдорд╛рдирджрдВрдб
рдпрд╣ рдорд╛рдирджрдВрдб рдЕрдкрдиреЗ рдиреНрдпреВрдирддрдо рд╕рдВрднрд╡ рддрддреНрд╡реЛрдВ рд╕реЗ рдЦреЗрд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рддрддреНрд╡ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ:
uopt=miniminj[U]
рдирд┐рд░рд╛рд╢рд╛рд╡рд╛рдж рдХреА рдХрд╕реМрдЯреА рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдирд┐рд░реНрдгрдп рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреВрд▓ рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдирджрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдирд┐рд░реНрдгрдп рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдиреБрдХрд╕рд╛рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╡рд╣ рдиреНрдпреВрдирддрдо рд▓рд╛рднрдкреНрд░рджрддрд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рдЪреБрдирдХрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдЬреЛрдЦрд┐рдореЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП
U1=(0,2,5),U2=(2,3,1),U3=(4,3,тИТ1) рдЦреЛрдЬреЗрдВ, рдиреНрдпреВрдирддрдо рдЦреЛрдЬреЗрдВ рдФрд░ рдЕрдЧрд▓реЗ рддреАрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
S=(0,1,тИТ1) ред рд╕рдВрдХреЗрддрд┐рдд рдЯреНрд░рд┐рдкрд▓ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдореВрд▓реНрдп -1 рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП, рдирд┐рд░рд╛рд╢рд╛рд╡рд╛рдж рдХреА рдХрд╕реМрдЯреА рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЬреАрддрдиреЗ рдХреА рд░рдгрдиреАрддрд┐ рд░рдгрдиреАрддрд┐ рд╣реИ
U3=(4.3,тИТ1) рд░реЛрдкрдг рд╕рдВрд╕реНрдХреГрддрд┐ 3 рдХреЗ рдЕрдиреБрд░реВрдкред
рд╡рд╛рд▓реНрдб рдХреЗ рдорд╛рдирджрдВрдб рдФрд░ рдЖрд╢рд╛рд╡рд╛рдж рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдирд┐рд░рд╛рд╢рд╛рд╡рд╛рдж рдорд╛рдирджрдВрдб рдХрд╛ рд╡рд░реНрдЧ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:
class PessimismCriteria(gameMatrix : GameMatrix) : ICriteria { val gameMatrix: GameMatrix init{ this.gameMatrix = gameMatrix } override fun optimum(): List<GameVector> { val mins = gameMatrix.alternatives.map { a -> Pair(a, a.min()) } val min = mins.minWith( Comparator { o1, o2 -> o1.second!!.compareTo(o2.second!!)}) return mins .filter { m -> m.second == min!!.second } .map { m -> m.first } } }
рд╕реИрд╡реЗрдЬ рдорд╛рдирджрдВрдб
рд╕реИрд╡реЗрдЬ рдХреА рдХрд╕реМрдЯреА (рдПрдХ рдирд┐рд░рд╛рд╢рд╛рд╡рд╛рджреА рдирд┐рд░рд╛рд╢рд╛рд╡рд╛рджреА рдХреА рдХрд╕реМрдЯреА) рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдЦреЛрдпрд╛ рд╣реБрдЖ рдореБрдирд╛рдлрд╛ рдХрдо рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЦреЛрдП рд╣реБрдП рдореБрдирд╛рдлреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдЕрдлрд╕реЛрд╕ рдиреНрдпреВрдирддрдо рд╣реИ:
uopt=minimaxj[S]si,j=(max startbmatrixu1,ju2,j)ред..un,j рдЕрдВрддbmatrixтИТui,j)
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрд╕ рдкрдЫрддрд╛рд╡рд╛ рдХрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИред
рд╕реИрд╡реЗрдЬ рдорд╛рдирджрдВрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрд╖реНрдЯрддрдо рд╕рдорд╛рдзрд╛рди рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдкрд╛рдП рдЧрдП рдкрдЫрддрд╛рд╡рд╛ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдЦреЗрдж рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╕рдорд╛рдзрд╛рди рдЗрд╖реНрдЯрддрдо рд╣реЛрдЧрд╛ред
рдкреНрд░рд╛рдкреНрдд рд╕рдорд╛рдзрд╛рди рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝реА рдирд┐рд░рд╛рд╢рд╛ рдХреА рдЧрд╛рд░рдВрдЯреАрдХреГрдд рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рдЕрдиреНрдп рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╛рд╡рд┐рдд рдЬреАрдд рдореЗрдВ рдЧрд╛рд░рдВрдЯреАрдХреГрдд рдХрдореА рд╢рд╛рдорд┐рд▓ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП
U1=(0,2,5),U2=(2,3,1),U3=(4,3,тИТ1) рдкрдЫрддрд╛рд╡рд╛ рдХрд╛ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛рдУ:

рддреАрди рдЕрдзрд┐рдХрддрдо рдкрдЫрддрд╛рд╡рд╛
S=(4,4,6) ред рдЗрди рдЬреЛрдЦрд┐рдореЛрдВ рдХрд╛ рдиреНрдпреВрдирддрдо рдореВрд▓реНрдп 4 рдХрд╛ рдореВрд▓реНрдп рд╣реЛрдЧрд╛, рдЬреЛ рд░рдгрдиреАрддрд┐рдпреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ
U1 рдФрд░
U2 ред
рд╕реИрд╡реЗрдЬ рдкрд░реАрдХреНрд╖рдг рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ:
class SavageCriteria(gameMatrix: GameMatrix) : ICriteria { val gameMatrix: GameMatrix init { this.gameMatrix = gameMatrix } fun GameMatrix.risk(): List<Pair<GameVector, Double?>> { val maxStates = this.natureStates.map { n -> Pair(n, n.values.max()) } .map { n -> n.first.key to n.second }.toMap() var am: MutableList<Pair<GameVector, List<Double>>> = mutableListOf() for (a in this.alternatives) { var v: MutableList<Double> = mutableListOf() for (i in 0..a.values.lastIndex) { val mn = maxStates.get(i) v.add(mn!! - a.values[i]) } am.add(Pair(a, v.toList())) } return am.map { m -> Pair(m.first, m.second.max()) } } override fun optimum(): List<GameVector> { val risk = gameMatrix.risk() val minRisk = risk.minWith(Comparator { o1, o2 -> o1.second!!.compareTo(o2.second!!) }) return risk .filter { r -> r.second == minRisk!!.second } .map { m -> m.first } } }
рд╣реБрд░рд╡рд┐рдЯреНрдЬрд╝ рдХрд╕реМрдЯреА
рд╣рд░реНрд╡рд┐рддреНрдЬ рдорд╛рдирджрдВрдб рдЪрд░рдо рдирд┐рд░рд╛рд╢рд╛рд╡рд╛рдж рдФрд░ рдкреВрд░реНрдг рдЖрд╢рд╛рд╡рд╛рдж рдХреЗ рдмреАрдЪ рдПрдХ рд╡рд┐рдирд┐рдпрдорд┐рдд рд╕рдордЭреМрддрд╛ рд╣реИ:
uрдСрдкреНрдЯ=рдЕрдзрд┐рдХрддрдо( gamma├ЧA(k)+A(0)├Ч(1тИТ Gamma))
A (0) рдЪрд░рдо рдирд┐рд░рд╛рд╢рд╛рд╡рд╛рджреА рдХреА рд░рдгрдиреАрддрд┐ рд╣реИ, A (k) рдкреВрд░реНрдг рдЖрд╢рд╛рд╡рд╛рджреА рдХреА рд░рдгрдиреАрддрд┐ рд╣реИ,
рдЧрд╛рдорд╛=1 - рд╡рдЬрди рдЧреБрдгрд╛рдВрдХ рдХрд╛ рд╕реЗрдЯ рдорд╛рди:
0 leq gamma leq1 ;
Gamma=0 - рдЕрддреНрдпрдзрд┐рдХ рдирд┐рд░рд╛рд╢рд╛рд╡рд╛рдж,
рдЧрд╛рдорд╛=1 - рдкреВрд░реНрдг рдЖрд╢рд╛рд╡рд╛рджред
рдЕрд╕рддрдд рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреА рдПрдХ рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде, рд╡рдЬрди рдЧреБрдгрд╛рдВрдХ рдХрд╛ рд╡рд╛рдВрдЫрд┐рдд рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛
рдЧрд╛рдорд╛ , рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдирд┐рдХрдЯрддрдо рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдЧреЛрд▓ рдХрд░реЗрдВ, рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдП рдЧрдП рд╡рд┐рд╡реЗрдХ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдПред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП
рдпреВ 1 = ( 0 , 2 , 5 ) , рдпреВ 2 = ( 2 , 3 , 1 ) , рдпреВ 3 = ( 4 , 3 , - 1 ) ред рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╢рд╛рд╡рд╛рдж рдЧреБрдгрд╛рдВрдХ
G a m m a = $ 0ред ред рдЕрдм рдПрдХ рдЯреЗрдмрд▓ рдмрдирд╛рдПрдВ:

рдЧрдгрдирд╛ рдХреА рдЧрдИ рдПрдЪ рд╕реЗ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп 3 рд╣реЛрдЧрд╛, рдЬреЛ рд░рдгрдиреАрддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ
рдпреВ рез ред
рд╣рд░реНрд╡рд┐рддреНрдЬ рдХреА рдХрд╕реМрдЯреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рдЪрдордХрджрд╛рд░ рд╣реИ:
class HurwitzCriteria(gameMatrix: GameMatrix, optimisticKoef: Double) : ICriteria { val gameMatrix: GameMatrix val optimisticKoef: Double init { this.gameMatrix = gameMatrix this.optimisticKoef = optimisticKoef } inner class HurwitzParam(xmax: Double, xmin: Double, optXmax: Double){ val xmax: Double val xmin: Double val optXmax: Double val value: Double init{ this.xmax = xmax this.xmin = xmin this.optXmax = optXmax value = xmax * optXmax + xmin * (1 - optXmax) } } fun GameMatrix.getHurwitzParams(): List<Pair<GameVector, HurwitzParam>> { return this.alternatives.map { a -> Pair(a, HurwitzParam(a.max()!!, a.min()!!, optimisticKoef)) } } override fun optimum(): List<GameVector> { val hpar = gameMatrix.getHurwitzParams() val maxHurw = hpar.maxWith(Comparator { o1, o2 -> o1.second.value.compareTo(o2.second.value) }) return hpar .filter { r -> r.second == maxHurw!!.second } .map { m -> m.first } } }
рдЬреЛрдЦрд┐рдо рд▓реЗрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп
рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреА рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛрдЦрд┐рдо рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рдорд╛рдирджрдВрдбреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд░реНрддреЛрдВ рдХреЗ рдЕрдзреАрди:
- рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЬрд╛рдирдХрд╛рд░реА рдХреА рдХрдореА;
- рд╕рдВрднрд╛рд╡реНрдпрддрд╛ рд╡рд┐рддрд░рдг рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐;
- рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрдгрдп рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдпрд╛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдЬреНрдЮрд╛рдиред
рдпрджрд┐ рдХреЛрдИ рдирд┐рд░реНрдгрдп рдЬреЛрдЦрд┐рдо рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд┐рд░реНрдгрдпреЛрдВ рдХреА рд▓рд╛рдЧрдд рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд┐рддрд░рдг рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдирд┐рд░реНрдгрдп рдЕрдкреЗрдХреНрд╖рд┐рдд рдореВрд▓реНрдп рдорд╛рдирджрдВрдб рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд▓рд╛рдн рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рдиреЗ рдпрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд▓рд╛рдЧрддреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред
рдЕрдкреЗрдХреНрд╖рд┐рдд рдореВрд▓реНрдп рдХрд╛ рдорд╛рдирджрдВрдб рдпрд╛ рддреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд (рдФрд╕рдд) рд▓рд╛рдн рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд▓рд╛рдЧрдд рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╕реЗ рдЬреБрдбрд╝рд╛ рд▓рд╛рдн (рд▓рд╛рдЧрдд) рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд░ рд╣реИред
рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕реВрддреНрд░реАрдХрд░рдг рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдЪреБрдирддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдШрдЯрдирд╛рдПрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдЗрди рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬреНрдЮрд╛рди рд╣реИ рдФрд░ рд╡рд╣ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдмрд╕реЗ рд▓рд╛рднрджрд╛рдпрдХ рд╕рдВрдпреЛрдЬрди рдФрд░ рдЕрдиреБрдХреНрд░рдо рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рджреЗрдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЧреЗрдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░рддреЗ рд╣реИрдВ:

рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреЗрдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдереЛрдбрд╝рд╛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд╕рдЪ рд╣реИ, рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдУрд╣ рдареАрдХ рд╣реИред
рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ open class ProbabilityGameMatrix(matrix: List<List<Double>>, alternativeNames: List<String>, natureStateNames: List<String>, probabilities: List<Double>) : GameMatrix(matrix, alternativeNames, natureStateNames) { val probabilities: List<Double> init { this.probabilities = probabilities; } override fun change (i : Int, j : Int, value : Double) : GameMatrix{ val cm = super.change(i, j, value) return ProbabilityGameMatrix(cm.matrix, cm.alternativeNames, cm.natureStateNames, probabilities) } override fun changeAlternativeName (i : Int, value : String) : GameMatrix{ val cm = super.changeAlternativeName(i, value) return ProbabilityGameMatrix(cm.matrix, cm.alternativeNames, cm.natureStateNames, probabilities) } override fun changeNatureStateName (j : Int, value : String) : GameMatrix{ val cm = super.changeNatureStateName(j, value) return ProbabilityGameMatrix(cm.matrix, cm.alternativeNames, cm.natureStateNames, probabilities) } fun changeProbability (j : Int, value : Double) : GameMatrix{ var list = probabilities.toMutableList() list.set(j, value) return ProbabilityGameMatrix(matrix, alternativeNames, natureStateNames, list.toList()) } override fun toString(): String { var s = "" val formatter: NumberFormat = DecimalFormat("#0.00") for (i in 0 .. natureStateNames.lastIndex){ s += natureStateNames[i] + " = " + formatter.format(probabilities[i]) + "\n" } return " :\n" + s + " :\n" + alternatives .map { a: GameVector -> a.toString() } .reduce { a1: String, a2: String -> "$a1;\n$a2" } } override fun newMatrix(dCol: MutableSet<GameVector>, dRow: MutableSet<GameVector>) : GameMatrix{ var result: MutableList<MutableList<Double>> = mutableListOf() var ralternativeNames: MutableList<String> = mutableListOf() var rnatureStateNames: MutableList<String> = mutableListOf() var rprobailities: MutableList<Double> = mutableListOf() val dIndex = dCol.map { c -> c.key }.toList() for (i in 0 .. natureStateNames.lastIndex){ if (!dIndex.contains(i)){ rnatureStateNames.add(natureStateNames[i]) } } for (i in 0 .. probabilities.lastIndex){ if (!dIndex.contains(i)){ rprobailities.add(probabilities[i]) } } for (gv in this.alternatives){ if (!dRow.contains(gv)){ var nr: MutableList<Double> = mutableListOf() for (i in 0 .. gv.values.lastIndex){ if (!dIndex.contains(i)){ nr.add(gv.values[i]) } } result.add(nr) ralternativeNames.add(gv.name) } } val rlist = result.map { r -> r.toList() }.toList() return ProbabilityGameMatrix(rlist, ralternativeNames.toList(), rnatureStateNames.toList(), rprobailities.toList()) } } }
рдорд╛рдирджрдВрдб
рдмреЗрдпрд╕ рдорд╛рдирджрдВрдб (рдЕрдкреЗрдХреНрд╖рд╛ рдорд╛рдирджрдВрдб) рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рдгрдиреАрддрд┐ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдЦрд┐рдо рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдЖрдк рдореИрдВ рдЗрд╕реА рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд░ рдХреА рдЧрдгрд┐рддреАрдп рдЕрдкреЗрдХреНрд╖рд╛ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдирд┐рдпрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╖реНрдЯрддрдо рдЦрд┐рд▓рд╛рдбрд╝реА рд░рдгрдиреАрддрд┐
рдпреВ рдС рдк реН рдЯ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
u_ {opt} = max_ {1 \ leq i \ leq n} M (u_ {i}) \\ M (u_ {i}) = max_ {1 \ leq i \ leq n} \ sum_ / j = 1} ^ m u_ {i, j} \ cdot y_ {j} ^ 0
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд░рдгрдиреАрддрд┐ рдЕрдХреНрд╖рдорддрд╛ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ
ui рдЬреЛрдЦрд┐рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЗрдпрд╕ рдХреА рдХрд╕реМрдЯреА рдЖрдИ-рд╡реЗрдВ рдкрдВрдХреНрддрд┐ рдХреЗ рдЬреЛрдЦрд┐рдореЛрдВ рдХрд╛ рдФрд╕рдд рдореВрд▓реНрдп (рдЙрдореНрдореАрдж) рд╣реИ
рдпреВ рдЬрд┐рдирдХреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдБ рдкреНрд░рдХреГрддрд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИрдВред рдлрд┐рд░ рдЬреЛрдЦрд┐рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЗрдпрд╕ рдорд╛рдирджрдВрдб рджреНрд╡рд╛рд░рд╛ рд╢реБрджреНрдз рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдЗрд╖реНрдЯрддрдо рд░рдгрдиреАрддрд┐ рд╣реИ
uрдСрдкреНрдЯ рдиреНрдпреВрдирддрдо рдЕрдХреНрд╖рдорддрд╛, рдпрд╛рдиреА рдиреНрдпреВрдирддрдо рдФрд╕рдд рдЬреЛрдЦрд┐рдоред рдмрд╛рдпреЗрд╕рд┐рдпрди рдорд╛рдирджрдВрдб рдЬреЛрдЦрд┐рдо рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдФрд░ рдЬреЛрдЦрд┐рдо рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рдорд╛рди рд╣реИ, рдЕрд░реНрдерд╛рддред рдЕрдЧрд░ рд░рдгрдиреАрддрд┐
uрдСрдкреНрдЯ рдЬреАрдд рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдмреЗрдпрд╕ рдХрд╕реМрдЯреА рджреНрд╡рд╛рд░рд╛ рдЗрд╖реНрдЯрддрдо рд╣реИ, рддреЛ рдЬреЛрдЦрд┐рдореЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдмреЗрдпрд╕ рдХрд╕реМрдЯреА рджреНрд╡рд╛рд░рд╛ рдЗрд╖реНрдЯрддрдо рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред
рдЖрдЗрдП рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВ рдФрд░ рдЧрдгрд┐рддреАрдп рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ:
M1=0 cdot0.2+2 cdot0.5+5 cdot0.3=2.5;M2=2 cdot0.2+3 cdot0.5+1 cdot0.3=2.2;M4=0 cdot0.2+3 cdot0.5+(тИТ1) cdot0.3.3тИТ2.0;
рдЕрдзрд┐рдХрддрдо рдЧрдгрд┐рддреАрдп рдЕрдкреЗрдХреНрд╖рд╛ рд╣реИ
M1 рдЗрд╕рд▓рд┐рдП, рдПрдХ рдЬреАрдд рдХреА рд░рдгрдиреАрддрд┐ рдПрдХ рд░рдгрдиреАрддрд┐ рд╣реИ
U1 ред
рдмреЗрдпрд╕ рдорд╛рдирджрдВрдб рдХрд╛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
class BayesCriteria(gameMatrix: ProbabilityGameMatrix) : ICriteria { val gameMatrix: ProbabilityGameMatrix init { this.gameMatrix = gameMatrix } fun ProbabilityGameMatrix.bayesProbability(): List<Pair<GameVector, Double?>> { var am: MutableList<Pair<GameVector, Double>> = mutableListOf() for (a in this.alternatives) { var alprob: Double = 0.0 for (i in 0..a.values.lastIndex) { alprob += a.values[i] * this.probabilities[i] } am.add(Pair(a, alprob)) } return am.toList(); } override fun optimum(): List<GameVector> { val risk = gameMatrix.bayesProbability() val maxBayes = risk.maxWith(Comparator { o1, o2 -> o1.second!!.compareTo(o2.second!!) }) return risk .filter { r -> r.second == maxBayes!!.second } .map { m -> m.first } } }
рд▓рд╛рдкреНрд▓рд╛рд╕ рдорд╛рдирджрдВрдб
рд▓рд╛рдкреНрд▓рд╛рд╕ рдорд╛рдирджрдВрдб рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рдЧрдгрд┐рддреАрдп рдЕрдкреЗрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдЕрдзрд┐рдХрддрдордХрд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ рдЬрдм рдорд╛рдВрдЧ рдХреЗ рд╕реНрддрд░ рдХреА рд╕рдорд╛рди рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдзрд╛рд░рдгрд╛ рдорд╛рдиреНрдп рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреА рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд▓рд╛рдкреНрд▓рд╛рд╕ рдорд╛рдирджрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЕрдкреЗрдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рдЗрд╖реНрдЯрддрдо рдорд╛рдирджрдВрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
uopt=max[ overlineU] overlineU= startbmatrix overlineu1 overlineu2ред.. overlineun endbmatrix, overlineui= frac1n sumnj=1ui,j
рд▓рд╛рдкреНрд▓рд╛рд╕ рдорд╛рдирджрдВрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд░рдгрдиреАрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдорд╛рдзреНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ:
overlineu1= frac13 cdot(0+2+5)=2.3 overlineu2= frac13 cdot(2+3+1)=2.0 рдУрд╡рд░рд▓рд╛рдЗрдиu3= frac13 cdot(4+3тИТ1)=$2.
рддреЛ рдЬреАрддрдиреЗ рдХреА рд░рдгрдиреАрддрд┐ рд░рдгрдиреАрддрд┐ рд╣реИ
U1 ред
рд▓рд╛рдкреНрд▓рд╛рд╕ рдорд╛рдирджрдВрдб рдХрд╛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
class LaplaceCriteria(gameMatrix: GameMatrix) : ICriteria { val gameMatrix: GameMatrix init { this.gameMatrix = gameMatrix } fun GameMatrix.arithemicMean(): List<Pair<GameVector, Double>> { return this.alternatives.map { m -> Pair(m, m.values.average()) } } override fun optimum(): List<GameVector> { val risk = gameMatrix.arithemicMean() val maxBayes = risk.maxWith(Comparator { o1, o2 -> o1.second.compareTo(o2.second) }) return risk .filter { r -> r.second == maxBayes!!.second } .map { m -> m.first } } }
рдорд┐рд╢реНрд░рд┐рдд рд░рдгрдиреАрддрд┐ред рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╡рд┐рдзрд┐
рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдорд┐рд╢реНрд░рд┐рдд рд░рдгрдиреАрддрд┐рдпреЛрдВ рдореЗрдВ рдЧреЗрдо рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред
рдПрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЦреЗрд▓ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВредрд░рдгрдиреАрддрд┐Ui рд░рдгрдиреАрддрд┐ рдкрд░ рд╣рд╛рд╡реА рд╣реИ UiтИТ1 рдЕрдЧрд░ рд╕рдм u1..nтИИUiтЙеu1..nтИИUiтИТ1 ред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдХрд┐рд╕реА рднреБрдЧрддрд╛рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рднреА рддрддреНрд╡ рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рддрддреНрд╡реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдмрд░рд╛рдмрд░ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рджреВрд╕рд░реА рдкрд░ рд╣рд╛рд╡реА рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░рдореБрдЦ рдкрдВрдХреНрддрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рднреА рдХрд┐ рдпрджрд┐ рднреБрдЧрддрд╛рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдХреБрдЫ рдХреЙрд▓рдо рдореЗрдВ рд╕рднреА рддрддреНрд╡ рджреВрд╕рд░реЗ рдХреЙрд▓рдо рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рддрддреНрд╡реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдпрд╛ рдмрд░рд╛рдмрд░ рд╣реИрдВ, рддреЛ рдкрд╣рд▓рд╛ рдХреЙрд▓рдо рджреВрд╕рд░реЗ рдкрд░ рд╣рд╛рд╡реА рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░рдореБрдЦ рдХреЙрд▓рдо рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИредрдЦреЗрд▓ рдХрд╛ рд╕рдмрд╕реЗ рдХрдо рдореВрд▓реНрдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ╬▒=maximinjuij ред
рдЦреЗрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдореВрд▓реНрдп рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ╬▓=minjmaxiuij ред
рдЕрдм рдЖрдк рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдЦреЗрд▓ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:- рдиреАрдЪреЗ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ ╬▒ рдФрд░ рд╢реАрд░реНрд╖ ╬▓рдЦреЗрд▓ рдХреА рдХреАрдорддреЗрдВред рдЕрдЧрд░╬▒=╬▓ , рдлрд┐рд░ рд╢реБрджреНрдз рд░рдгрдиреАрддрд┐рдпреЛрдВ рдореЗрдВ рдЙрддреНрддрд░ рд▓рд┐рдЦреЗрдВ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЖрдЧреЗ рдирд┐рд░реНрдгрдп рдЬрд╛рд░реА рд░рдЦреЗрдВ
- рдкреНрд░рдореБрдЦ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рдореБрдЦ рдХреЙрд▓рдо рд╣рдЯрд╛рдПрдВред рдХрдИ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╖реНрдЯрддрдо рд░рдгрдиреАрддрд┐ рдореЗрдВ рдЙрдирдХреЗ рд╕реНрдерд╛рди рдкрд░, рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдХ 0 рд╣реЛрдВрдЧреЗ
- рд░реИрдЦрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреЗрдо рдХреЛ рд╣рд▓ рдХрд░реЗрдВ ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╡рд░реНрдЧ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИрдХрд╛ рд╕рдорд╛рдзрд╛рди class Solve(gamePriceObr: Double, solutions: List<Double>, names: List<String>) { val gamePrice: Double val gamePriceObr: Double val solutions: List<Double> val names: List<String> private val formatter: NumberFormat = DecimalFormat("#0.00") init{ this.gamePrice = 1 / gamePriceObr this.gamePriceObr = gamePriceObr; this.solutions = solutions this.names = names } override fun toString(): String{ var s = " : " + formatter.format(gamePrice) + "\n" for (i in 0..solutions.lastIndex){ s += "$i) " + names[i] + " = " + formatter.format(solutions[i] / gamePriceObr) + "\n" } return s } fun itersect(matrix: GameMatrix): String{ var s = " : " + formatter.format(gamePrice) + "\n" for (j in 0..matrix.alternativeNames.lastIndex) { var f = false val a = matrix.alternativeNames[j] for (i in 0..solutions.lastIndex) { if (a.equals(names[i])) { s += "$j) " + names[i] + " = " + formatter.format(solutions[i] / gamePriceObr) + "\n" f = true break } } if (!f){ s += "$j) " + a + " = 0\n" } } return s } }
рдФрд░ рд╡рд╣ рд╡рд░реНрдЧ рдЬреЛ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдореБрдЭреЗ рдЧрдгрд┐рдд рдХреА рд╕рдордЭ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрд╛рдЪреЗ рдХреЙрдордиреНрд╕ рдорда рд╕реЗ рддреИрдпрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛рд╕реЙрд▓реНрд╡рд░ open class Solver (gameMatrix: GameMatrix) { val gameMatrix: GameMatrix init{ this.gameMatrix = gameMatrix } fun solve(): Solve{ val goalf: List<Double> = gameMatrix.alternatives.map { a -> 1.0 } val f = LinearObjectiveFunction(goalf.toDoubleArray(), 0.0) val constraints = ArrayList<LinearConstraint>() for (alt in gameMatrix.alternatives){ constraints.add(LinearConstraint(alt.values.toDoubleArray(), Relationship.LEQ, 1.0)) } val solution = SimplexSolver().optimize(f, LinearConstraintSet(constraints), GoalType.MAXIMIZE, NonNegativeConstraint(true)) val sl: List<Double> = solution.getPoint().toList() val solve = Solve(solution.getValue(), sl, gameMatrix.alternativeNames) return solve } }
рдЕрдм рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдФрд░ рдЧреЗрдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рд▓реЗрддреЗ рд╣реИрдВ:(248562463254)
рдЗрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдПрдХ рдкреНрд░рдореБрдЦ рд╕реЗрдЯ рд╣реИ:(2462)
рдирд┐рд░реНрдгрдп val alternativeNames: List<String> = listOf(" 1", " 2", " 3") val natureStateNames: List<String> = listOf(" ", "", " ", "") val matrix: List<List<Double>> = listOf( listOf(2.0, 4.0, 8.0, 5.0), listOf(6.0, 2.0, 4.0, 6.0), listOf(3.0, 2.0, 5.0, 4.0) ) val gm = GameMatrix(matrix, alternativeNames, natureStateNames) val (dgm, list) = gm.dominateMatrix() println(dgm.toString()) println(list.reduce({s1, s2 -> s1 + "\n" + s2})) println() val s: Solver = Solver(dgm) val solve = s.solve() println(solve)
рдЦреЗрд▓ рд╕рдорд╛рдзрд╛рди (0,33;0,67;0) 3.33 рдХреЗ рдЦреЗрд▓ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рдердПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рдХреГрддрд┐ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп, GitHub рдХрд╛ рд▓рд┐рдВрдХ редрдореИрдВ рд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛!