рдЧреЗрдо рдереНрдпреЛрд░реА: рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛

рдЧреЗрдо рдереНрдпреЛрд░реА рдПрдХ рдЧрдгрд┐рддреАрдп рдЕрдиреБрд╢рд╛рд╕рди рд╣реИ рдЬреЛ рдПрдХ рд▓рдХреНрд╖реНрдп рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдореЙрдбрд▓рд┐рдВрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рдВрдШрд░реНрд╖ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рдЪреБрдирдирд╛ рд╣реИред Habr├й рдкрд░ рдпрд╣ рд╡рд┐рд╖рдп рдкрд╣рд▓реЗ рд╣реА рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЬ рд╣рдо рдЗрд╕рдХреЗ рдХреБрдЫ рдкрд╣рд▓реБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ Kotlin рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЗрд╕рд▓рд┐рдП, рдПрдХ рд░рдгрдиреАрддрд┐ рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ рдЬреЛ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХрджрдо рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреА рд╣реИред рдЗрд╖реНрдЯрддрдо рдЦрд┐рд▓рд╛рдбрд╝реА рд░рдгрдиреАрддрд┐ рд╡рд╣ рд░рдгрдиреАрддрд┐ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдЦреЗрд▓ рдореЗрдВ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рд╕реНрдерд╛рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рдЕрдзрд┐рдХрддрдо рд▓рд╛рднред рдпрджрд┐ рдЦреЗрд▓ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд, рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд╛рд▓ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╖реНрдЯрддрдо рд░рдгрдиреАрддрд┐ рдЕрдзрд┐рдХрддрдо рдФрд╕рдд рдЬреАрдд рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред

рдЧреЗрдо рдереНрдпреЛрд░реА рдХрд╛ рдХрд╛рдо рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рддрдо рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ рд╣реИред рдореБрдЦреНрдп рдзрд╛рд░рдгрд╛, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╖реНрдЯрддрдо рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА (рдпрд╛ рд╡рд┐рд░реЛрдзреА) рдЦреБрдж рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдмреБрджреНрдзрд┐рдорд╛рди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЙрдЪрд┐рдд рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рдХреА рдЧрдгрдирд╛ рд╕рдВрдШрд░реНрд╖ рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдкрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЦреЗрд▓реЛрдВ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдиреАрдВрд╡ рдореЗрдВ рд░рдЦреА рдЧрдИ рд╣реИред

рдкреНрд░рдХреГрддрд┐ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рддрд┐рднрд╛рдЧреА рдЕрдкрдиреЗ рд▓рд╛рдн рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рддрд╛ рд╣реИред рдкреНрд░рдХреГрддрд┐ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдЧрдгрд┐рддреАрдп рдореЙрдбрд▓ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХреА рдкрд╕рдВрдж рдЙрджреНрджреЗрд╢реНрдп рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрднреЛрдХреНрддрд╛ рдорд╛рдВрдЧ, рдкреНрд░рдХреГрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдЖрджрд┐ред "рдкреНрд░рдХреГрддрд┐" рдПрдХ рдкреНрд░рддрд┐рдХреВрд▓ рдХреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХрд╛ рдкреАрдЫрд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╖реНрдЯрддрдо рд░рдгрдиреАрддрд┐ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдорд╛рдирджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рдХреГрддрд┐ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдореЗрдВ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдп рд╣реИрдВ:

  1. рдЬреЛрдЦрд┐рдо рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдЬрдм рд╕рдореНрднрд╛рд╡рд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдореНрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЬреНрдЮрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
  2. рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп, рдЬрдм рдкреНрд░рдХреГрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдЗрди рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдпрд╣рд╛рдБ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

рдЕрдм рд╣рдо рд╢реБрджреНрдз рд░рдгрдиреАрддрд┐рдпреЛрдВ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рдорд╛рдирджрдВрдбреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдкрджреНрдзрддрд┐ рд╕реЗ рдорд┐рд╢реНрд░рд┐рдд рд░рдгрдиреАрддрд┐рдпреЛрдВ рдореЗрдВ рдЦреЗрд▓ рдХреЛ рд╣рд▓ рдХрд░реЗрдВрдЧреЗред

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 ред

рдЕрдм рдЖрдк рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдЦреЗрд▓ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  1. рдиреАрдЪреЗ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ ╬▒ рдФрд░ рд╢реАрд░реНрд╖ ╬▓рдЦреЗрд▓ рдХреА рдХреАрдорддреЗрдВред рдЕрдЧрд░╬▒=╬▓ , рдлрд┐рд░ рд╢реБрджреНрдз рд░рдгрдиреАрддрд┐рдпреЛрдВ рдореЗрдВ рдЙрддреНрддрд░ рд▓рд┐рдЦреЗрдВ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЖрдЧреЗ рдирд┐рд░реНрдгрдп рдЬрд╛рд░реА рд░рдЦреЗрдВ
  2. рдкреНрд░рдореБрдЦ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рдореБрдЦ рдХреЙрд▓рдо рд╣рдЯрд╛рдПрдВред рдХрдИ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╖реНрдЯрддрдо рд░рдгрдиреАрддрд┐ рдореЗрдВ рдЙрдирдХреЗ рд╕реНрдерд╛рди рдкрд░, рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдХ 0 рд╣реЛрдВрдЧреЗ
  3. рд░реИрдЦрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреЗрдо рдХреЛ рд╣рд▓ рдХрд░реЗрдВ ред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╡рд░реНрдЧ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ

рдХрд╛ рд╕рдорд╛рдзрд╛рди
 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 рдХрд╛ рд▓рд┐рдВрдХ ред

рдореИрдВ рд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛!

Source: https://habr.com/ru/post/hi425609/


All Articles