PDA

View Full Version : حل یک مسئله و طراحی یک الگوریتم



sara_aryanfar
شنبه 02 آذر 1392, 21:59 عصر
با سلام مسئله ما اینه

500
500
500
500
300
300
200
200
200
200
200
200
100
100
100
100
100
10
10
2
2
2
2
2

داده های ما اعداد بالا هستن خب ما هر بار می خواهیم یه مقداری از این داده ها رو برداریم مثلا یه بار 5تا یه بار 3 تا حالا ما می خواهیم اعداد بزرگتر شانس حضور بیشتری داشته باشن نسبت به اعداد کوچتر در واقع درصد حضور این اعداد بزرگتر با توجه به عددش تعیین بشه و هرچه عدد بزرگتر شانسش بیشتر چطور می تونیم اینکار رو انجام بدیم

aliagamon
شنبه 02 آذر 1392, 22:17 عصر
اگه تعداد مثل حالت بالا کم باشه میتونید اون هایی که بالا تر هستند رو تکرار کنید به مقداری که میخواید تا شانسشون N درصد بره بالا ...
البته یه راه اصولی تر هم اینه که بیاین و به عدد های بالای N ضریب 3 به اعداد بین N و X ضریب 2 و به اعداد زیر X ضریب یک بدید (برای حالت 3 انتخاب) حالا باز اول یک رندم بین سری با ضریب 3 و یک بار یک رندم برای سری با ضریب 2 و 3 و یک باز هم برای سری با ضریب 1 2 3 اینطوری دفعات تکرار اعداد بالا و شانسشون بیشتر میشه

mehdy.programmer
شنبه 02 آذر 1392, 22:26 عصر
یه چند تا سوال...

تا چه حد می خوای شانس رو بالا ببری؟

اون عددهایی که تکرار شدن متمایز اند یا نه؟

داده ها همیشه ایناست یا نه؟

sara_aryanfar
شنبه 02 آذر 1392, 22:46 عصر
داده ها این تعداد نیستن خیلی بیشترن مثلا فرض کنید 500 تا ارزش داده ها هم همون اعداد هستش اعدادی که تکرار شدن داده متمایزی هستند اما ارزش اونا یکسان هست ممکنه هر عددی با هر تعداد تکرار در اونجا قرار بگبره بنابر این یه راه کار می خواد که شانس هر کدوم با توجه به ارزش خودش تعیین بشه مثلا داده هایی با مقدار 1000 فرضا 50 درصد شانس حضور در بین 3 رکوردی که می خواهیم انتخاب کنیم دارن و الی آخرمشکل من اینه چطور این شانس رو برای هر رکورد تعیین کنم و چطور انتخاب رو انجام دهم

mehdy.programmer
شنبه 02 آذر 1392, 23:00 عصر
خوب ولی جواب سوال اولمو ندادی! تا چه حد می خوای شانس رو بالا ببری؟ مثلا میشه شانس 500 رو 40 % یا 60% یا 90% در نظر گرفت!!!! تا چه حد میخوای شانس بالا بره؟ و اینکه اعداد زیادن یا نه؟ (برای اینکه از تکرار استفاده بشه یا نه)

sara_aryanfar
شنبه 02 آذر 1392, 23:13 عصر
شانس اعداد با اندازه اونا باید رابطه مستقیم داشته باشه تعداد اعداد زیاده

mehdy.programmer
شنبه 02 آذر 1392, 23:29 عصر
خوب این ایده ی منه! ببین بدردت میخوره یا نه؟

همه ی اعداد رو جمع کن بعد هر عدد رو تقسیم بر مجموع کل کن و عدد بدست اومده میشه شانس اون عدد


sum=n1+n2+n3+...
Cn1=n1/sum

sara_aryanfar
شنبه 02 آذر 1392, 23:59 عصر
خب اونوقت نحوه انتخاب چطوری هست یعنی فرض کن ما قرار هست 3 تا از اینا رو انتخاب کنیم از این شانس چطور استفاده کنیم؟

omidrajabitiz
یک شنبه 03 آذر 1392, 10:32 صبح
همانطور که mehdy.programmer گفتند باید عمل کنید.
این روش در الگوریتم ژنتیک به چرخ رولت معروف است.

روش انتخاب چرخ رولت: در اين روش فرض می‌شود افراد جمعيت روي يک چرخ رولت تصوير شده‌اند که به هر فرد فضايي متناسب با تابع برازندگی آن تخصيص داده شده است. مشابه با عمل چرخش چرخ رولت براي انتخاب تصادفي يک فضا، يک عدد تصادفي بين صفر و مجموع شايستگي تمامي افراد در نسل موجود توليد می‌شود. اگر افراد بر اساس ميزان برازندگی‌شان به طور صعودي مرتب شوند، اولين فردي که ميزان برازندگی تجمعی‌اش بزرگ‌تر يا مساوي عدد تصادفي توليد شده، باشد انتخاب می‌شود. مکانیزم این روش با یک مثال در شکل زیر آورده شده است. در این مثال در صورتي که عدد تصادفي انتخاب شده 46 باشد، کروموزوم شماره 3 انتخاب می‌شود.

موفق باشید.
البته روش ها انتخاب دیگه ای هم وجود داره که با سرچ می تونید پیدا کنید.

rahnema1
یک شنبه 03 آذر 1392, 12:40 عصر
با این کد شما می تونید عدد مورد نظر رو انتخاب کنید ابتدا


using System.Linq;


وسپس


int[] items = new int[] {500,500,500,500,300,300,200,200,200,200,200,200,1 00,100,100,100,100,10,10,2,2,2,2,2};
ulong sum=0;
var cumhistogram=items.GroupBy(i => i).OrderBy(i=>i.Key).Select(g => new {Item = g.Key,Count = sum+=(ulong)(g.Count()*g.Key)}).ToList();
Random rr = new Random(DateTime.Now.Millisecond);
ulong maxval=cumhistogram.Last().Count;

برای انتخاب یک عدد از میان آرایه با احتمالی که اشاره کردید از متغیر selected استفاده کنید:


int selected =cumhistogram.FirstOrDefault(c => c.Count>=(rr.NextDouble()*maxval)).Item;

mehdy.programmer
یک شنبه 03 آذر 1392, 13:03 عصر
خوب شما این اعداد رو داخل یه آرایه قرار بده و به اندازه شانسشون تکرارشون کن، مثلا شانس 300، 8 هست، توی آرایه 8 بار 300 رو بنویس و بعد به صورت تصادفی یه عدد رو از آرایه بخون! با تکرار شدن اعداد تو آرایه شانس اعمال میشه! فقط در مورد اینکه از اول مثلا چند تا 500 تکرار شده و متمایز هم هستن مطمئن نیستم درست جواب بده یا نه!؟ یعنی در اصل نمی دونم این روش به درد مسئله شما می خوره یا نه ؟!

aliagamon
یک شنبه 03 آذر 1392, 14:04 عصر
خوب شما این اعداد رو داخل یه آرایه قرار بده و به اندازه شانسشون تکرارشون کن، مثلا شانس 300، 8 هست، توی آرایه 8 بار 300 رو بنویس و بعد به صورت تصادفی یه عدد رو از آرایه بخون! با تکرار شدن اعداد تو آرایه شانس اعمال میشه! فقط در مورد اینکه از اول مثلا چند تا 500 تکرار شده و متمایز هم هستن مطمئن نیستم درست جواب بده یا نه!؟ یعنی در اصل نمی دونم این روش به درد مسئله شما می خوره یا نه ؟!
درسته این آسون ترین روشه و درواقع عمل هم میکنه اما اگه تعداد ورودی ها چند صد هزار تا یا حتی چند صد میلیون و میلیارد باشه و هرکدوم میانگین 5 بار تکرار بشه واقعا حجم کار میره بالا ....
همون روش ضریب احتمال خیلی بهتر عمل میکنه تو این موارد با یه ارایه دو بعدی کار راه میوفته
برای مثال
ضبیب 500 میشه 8 و ضریب 3 هم میشه 5 و ضریب 100 میشه 3 و ضریب 10 1 حالا با این روش به راحتی با توجه به تعداد رندوم ها محدوده ضریب تعریف کنیم مثلا برای 3 رندوم(مثاله) اول یه رندوم بین ضریب های بالای 6 و یک باز با ضریب های بلای 3 و یک بار هم بین همه ....
همچنین تو این روش میشه داده هارو غربال کرد و درواقع مثلا اگر دو 300 و هرکدوم ضریب 5 دارند میتونیم یکی رو حذف کرده و یک 300 با ضریب 10 نگه داریم تا شانس بالا بره ....

mehdy.programmer
یک شنبه 03 آذر 1392, 15:03 عصر
خوب درسته، برای داده های زیاد روش مناسبی نیست!

بسته به داده ها و نیاز مسئله، روش های مختلفی رو میشه پیاده سازی کرد.