محاسبه ELO در سی شارپ

ساخت وبلاگ

ELO

ELO یک سیستم رتبه بندی بازیکن است که ابتدا برای رتبه بندی شطرنج بازان مورد استفاده قرار میگرفت اما بعداً در بسیاری از ورزش های دیگر کاربردهای زیادی پیدا کرد.

به شکلی طراحی شده است که وقتی Underdogs در یک بازی برنده می شود ، برای پیروزی خود ” credit ” بیشتری به دست می آورند به عنوان مثال ، اگر مادوس کارلسن ، مادربزرگ شطرنج ، من را (یک بازیکن بدون رتبه) در شطرنج می زد ، واقعاً نباید بر رتبه او تأثیر بگذارد.

و برعکس اگر کسی با رتبه کم بتواند بازیکن شماره یک دنیا را بزند ، رتبه اش باید بالا برود.

ELO همچنین به گونه ای طراحی شده است که یک بازیکن برتر نمی تواند به طور مداوم با بازیکنانی که رتبه های پایین تری دارند بازی کند و به همین ترتیب سرعت خود را در رتبه بندی بالا ببرد.

این بدان معنا نیست که بازی های هماهنگی در جایی که “سبک” خاصی از بازی (بسته به ورزش / بازی) وجود داشته باشد ، به معنای این است که این کار ساده تر یا سخت تر از اجازه دادن به ELO آن ها است.

اما به این معنی است که بیش از کسی که در مسابقات انتخاب مطلوبی دارد برنده شد. به نظر می رسد که ELO باید یک سیستم پیچیده باشد ، اما واقعاً می تواند به دو معادله ساده تبدیل شود.

Expectation To Win Equation

معادله ” انتظار برای برنده شدن ” واقعاً بخشی از معادله ELO است ، اما ارزش تقسیم دارد زیرا به هر حال ممکن است بخواهید آن را به عنوان یک Number مستقل ببینید.

static double ExpectationToWin(int playerOneRating, int playerTwoRating)
{ return 1 / (1 + Math.Pow(10, (playerTwoRating - playerOneRating) / 400.0));
}

پس از گذراندن در دو رده بندی بازیکن ، ما احتمال برنده شدن بازیکن ۱ را مسابقه به دست می آوریم.

این به صورت اعشاری نمایش داده می شود (بنابراین نتیجه ۰.۵ به این معنی است که بازیکن ۱ شانس ۵۰٪ برای پیروزی در مسابقه را دارد).
برخی نمونه های ورودی و خروجی مانند:

امتیاز بازیکن ۱: ۱۵۰۰
امتیاز بازیکن ۲: ۱۵۰۰
انتظار برای برنده شدن بازیکن ۱: ۰.۵ (شانس پیروزی ۵۰٪)

امتیاز بازیکن ۱: ۱۷۰۰
امتیاز بازیکن ۲: ۱۳۰۰
انتظار برای برنده شدن بازیکن ۱: ۰.۹۰ (۹۰٪ شانس پیروزی)

ELO Rating Equation

قدم بعدی این است که ، با توجه به اینکه دو بازیکن با یک برنده و بازنده واضح مقابل یکدیگر رقابت می کنند ، رده بندی جدید ELO آنها چه خواهد بود؟ معادله برای آن کمی شبیه به این شکل است:

enum GameOutcome
{ Win = 1, Loss = 0
}
static void CalculateELO(ref int playerOneRating, ref int playerTwoRating, GameOutcome outcome)
{ int eloK = 32; int delta = (int)(eloK * ((int)outcome - ExpectationToWin(playerOneRating, playerTwoRating))); playerOneRating += delta; playerTwoRating -= delta;
}

بیایید کمی این را تجزیه کنیم

در رتبه بندی دو بازیکن خود قرار می گیریم و نتیجه همانطور میشود که بازیکن ۱ انتظار دارد وقتی در داخل ، از یک عدد ویژه به نام “K” استفاده می کنیم ، بعدا کمی بیشتر در مورد این شماره صحبت خواهیم کرد ، اما در حال حاضر فقط به عنوان آن فکر کنید.

سپس نتیجه را می گیریم (یا ۱ یا ۰) و نتیجه واقعی مورد انتظار بازی را منفی می کنیم.

سپس این دلتا را به رتبه بازیکن اضافه می کنیم و آن را از بازیکن دو جدا می کنیم.

از آنجا که ما از نتیجه مورد انتظار به عنوان بخشی از معادله استفاده می کنیم ، می توانیم کمترین کسری را برای پیروزی بیشتر از آنچه که برنده انتظار می رود پاداش دهیم. بیایید به چند نمونه واقعی نگاه کنیم:

بازیکن۱ ELO: 1700

بازیکن۲ ELO: 1300

نتیجه: بازیکن ۱ برنده می شود

بازیکن ۱ ELO جدید: ۱۷۰۲

بازیکن ۲ ELO جدید: ۱۲۹۸

ELO Shift: 2

بازیکن ۱ ELO: 1700

بازیکن ۲ ELO: 1300

نتیجه: بازیکن ۱ می بازد

بازیکن ۱ ELO جدید: ۱۶۷۱

بازیکن ۲ ELO جدید: ۱۳۲۹

ELO Shift: 29

بنابراین همانطور که می بینیم ، هنگامی که بازیکن ۱ برنده می شود ، آنها فقط ۲ امتیاز ELO کسب می کنند زیرا انتظار می رود در صدر جدول قرار بگیرند (در واقع انتظار می رود که ۹۰٪ از زمان به دست آورند).

با این حال وقتی آنها از دست بدهند ، ۲۹ امتیاز را به بازنده منتقل می کنند که یک تغییر بزرگ است.

این نشان دهنده پیروزی در بازی های underdog (کم فشار) است که اصلاً انتظار نمی رفت آنها برنده شوند.

Finding The Perfect “K”

بنابراین در روش محاسبه ما از یک ثابت به نام “K” استفاده می کنیم.

به زبان ساده می توانیم به این فکر کنیم که چگونه “سریع” ELO هر دست از بازی را تغییر می دهد.

تعداد کم (مانند ۱۰) بدین معنی است که ELO به سرعت در نوسان نتایج خواهد بود. ELO بالا (مانند ۳۲) به این معنی است که رتبه بندی ELO بسیار کندتر حرکت می کند.

به طور معمول این بدان معنی است که برای ورزش / بازی هایی که تعداد کم بازی در هر فصل دارند (یا در هر حرفه) ، ممکن است تعداد نسبتاً کم بخواهید تا نتایج به سرعت تغییر کند.

در ورزش هایی که احتمالاً صدها بازی در سال وجود دارد ، شما می خواهید یک ELO پایین تر را نشان دهد که انتظار می رود چند بازی را در اینجا یا آنجا از دست بدهید ، اما درکل باید باخت زیادی داشته باشید تا واقعا شروع به لغزش کنید.

سایر زمانها K می توانند براساس رتبه ELOبازیکنان یا میزان بازی هایی که قبلاً بازی کرده اند تغییر کنند.

به عنوان مثال در یک “فصل” جدید ، با چند بازی انجام شده ، رتبه K بالا به این معنی است که رده بندی ELO به شدت تغییر می کند ، و با ادامه فصل شما می توانید K را پایین بیاورید.

من چندان طرفدار این نیستم زیرا بیشتر اوقات در شروع فصل اهمیت بازی های برنده شده بیشتر است ، به این معنی است که به بازیکنان جدید در یک بازی K پایین تر داده میشود تا آنها بتوانند جای خود را پیدا کنند.

اگر متغیر K را بر اساس امتیاز ELO بازیکنان تغییر دهید، می توانید به بازیکنان درجه رده بندی پایین تر و متوسط ، ELO بالایی بدهید تا آنها بتوانند خود را سریع از خارج شدن از دور، دور کنند.

سپس K را پایین آورید تا به ELO بالاتر بروید تا نشان دهد که در صدر جدول رتبه بندی ، موارد باید کمی تثبیت شوند.

درنهایت ، K باید بین ۱۰ تا ۳۲ باشد.

آموزشی برنامه نویسی...
ما را در سایت آموزشی برنامه نویسی دنبال می کنید

برچسب : نویسنده : دانلودی source بازدید : 314 تاريخ : سه شنبه 12 فروردين 1399 ساعت: 8:11