Algorithm design & data structure
6.63K subscribers
950 photos
142 videos
175 files
545 links
این کانال برای تمامی علاقه‌مندان به کامپیوتر، مخصوصاً حوزه ساختمان داده‌ها و الگوریتم‌ها، مفید می باشد. آشنایی با ریاضیات مقدماتی، برنامه‌نویسی مقدماتی و پیشرفته و همچنین شی‌گرایی می‌تواند در درک بهتر مفاهیم این درس کمک‌ کند.

👨‍💻Admin👉 @Se_mohamad
Download Telegram
یادگیری تقویتی(Reinforcement learning):
یادگیری تقویتی یکی از رویکردهای مهم در علوم هوش مصنوعی و روانشناسی است که بر روی رفتارهای انسانی و ماشینی تأثیرگذار است. در اینجا، توضیحی جامع در مورد یادگیری تقویتی ارائه خواهم داد:

1️⃣. تعریف اصطلاحی:
یادگیری تقویتی یک فرآیند یادگیری است که در آن یک عامل (مانند یک ربات، یک نرم‌افزار کامپیوتری یا حتی انسان) با محیط ارتباط برقرار کرده و از طریق انجام اعمال مختلف و دریافت بازخورد، سعی در یادگیری رفتارهایی دارد که منجر به بیشینه‌سازی پاداش (یا کاهش مجازات) می‌شود.

2️⃣. عوامل اصلی:
🔸- عامل: شخص یا سیستمی که در محیط عمل می‌کند و با آن تعامل دارد.
🔸- محیط: هر محیطی که عامل در آن فعالیت می‌کند، می‌تواند محیط فیزیکی و یا محیط مجازی (مانند شبیه‌سازی‌های کامپیوتری) باشد.
🔸 - عمل: اعمالی که عامل انجام می‌دهد.
🔸 - پاداش: این ممکن است یک پادازش مثبت (مثل پادازش مالی یا امتیاز) یا پاداش منفی (مثل مجازات) باشد که به عامل بر اساس اعمالش تعلق می‌گیرد.

3️⃣. الگوریتم‌ها و مدل‌ها:
- الگوریتم‌های یادگیری تقویتی متنوعی وجود دارند، از جمله Q-learning، Deep Q-Networks (DQN)، Policy Gradient، Actor-Critic، و موارد دیگر.
- این الگوریتم‌ها ممکن است بر پایه مدلی از محیط که به عامل ارائه می‌شود عمل کنند. مدل محیط می‌تواند deterministic یا stochastic باشد، به این معنا که نتیجه هر عمل برای ورودی‌های مشخصی ثابت باشد یا احتمالی.

4️⃣. مفاهیم اصلی:
🔹- سیاست (Policy): راهنمایی که عامل را به انتخاب اعمال در محیط هدایت می‌کند.
🔹- ارزش (Value): میزان پاداز کلی که عامل می‌تواند در طول زمان کسب کند.
🔹- تابع پاداش (Reward Function): تابعی که پاداش را بر اساس وضعیت فعلی محیط و عمل انجام شده توسط عامل محاسبه می‌کند.
🔹- تابع ارزش (Value Function): تخمینی از ارزش هر وضعیت یا جفت وضعیت و عمل در محیط.
🔹- فرآیند تصمیم‌گیری مارکوف (MDP): یک مدل ریاضی برای توصیف یک محیط تصمیم‌گیری است که شامل وضعیت‌ها، عمل‌ها، پاداز‌ها و احتمالات انتقال بین وضعیت‌ها می‌شود.

5️⃣. کاربردها:
- یادگیری تقویتی در زمینه‌های مختلفی مانند رباتیک، بازی‌های کامپیوتری، مدیریت منابع، سیستم‌های توصیه‌گر، اتوماسیون صنعتی و موارد دیگر مورد استفاده قرار می‌گیرد.

با توجه به پیچیدگی و چالش‌های مختلف موجود در یادگیری تقویتی، این زمینه همچنان موضوع تحقیقات فراوانی در علوم هوش مصنوعی و مهندسی رایانه است و پتانسیل‌های بسیاری برای توسعه فناوری‌های جدید دارد.

📣👨‍💻 @AlgorithmDesign_DataStructuer
👍2
درج در پشته
📣👨‍💻 @AlgorithmDesign_DataStructuer
👨‍💻1
برنامه زیر به ازای m=4 , n=5 کدام گزینه خواهد شد؟
def f(m,n):
if m<=1 or m==n:
return 1
else:
return f(m-1,n)+f(m,n-1)
گزینه صحیح را انتخاب کنید؟
Anonymous Quiz
13%
4
35%
8
31%
9
22%
2
عید همگی مبارک✌🏻🤩🥳

با لطف خداوند 🤲سال جدید فرا رسیده است، زمانی که در افق آسمان زندگی، نور و امید دیگر باران می‌بارد. امروز به زمینهای دلتنگی و انتظار، شادی و نوید می‌آوریم.

سال جدید فرصتی است برای بازسازی رویاها، آغاز دوباره ماجراهای جدید، و تکریم لحظات گذشته. با وجود تمام چالش‌ها و دشواری‌هایی که پشت سر گذاشتیم، همچنان باور داریم که زندگی می‌تواند پر از زیبایی و معنا باشد.

از اعماق قلب💜، آرزو دارم که سال جدید برای شما پر از لحظات شادی، آرامش و موفقیت باشد🌙امیدوارم در این سال، هر روزتان به روشنی نور خورشید☀️ و دلگرمی اندیشه‌های خوب بخشیده شود.

با آرزوی بهترین‌ها برای شما در سال جدید😉🌺
🎉12😍3👍2
مثالی از به دست آوردن درخت الگوریتم هافمن

📣👨‍💻 @AlgorithmDesign_DataStructuer
👍3
کدام مورد بیانگر هزینه الگوریتم برناما نویسی پویا برای مسئله فروشنده دوره گرد است؟
Anonymous Quiz
22%
n^n , n^2
19%
n^2
42%
n^2 log n
16%
n log n
🤔4
رایج ترین زمان های اجرای O بزرگ

📣👨‍💻 @AlgorithmDesign_DataStructuer
تابع Hash یک کلید را به عنوان ورودی می گیرد و یک مقدار عددی منحصر به فرد به نام کد Hash تولید می کند که به عنوان یک شاخص برای یک عنصر داده خاص عمل می کند. این فرآیند نگاشت قطعی است، به این معنی که یک کلید همیشه به همان شاخص Hash می شود و جستجو و بازیابی سریع مقادیر را تسهیل می کند.

ما از جداول Hash برای نگاشت سریع کلیدها به مکان های خاص در آرایه استفاده می کنیم. هدف تابع Hash توزیع مناسب کلیدها در بین شاخص‌های آرایه، به حداقل رساندن برخوردها (موقعیت‌هایی که چندین کلید به یک شاخص نگاشت می‌شوند) است.

جداول Hash در سناریوهایی که به ذخیره سازی و بازیابی کارآمد جفت های کلید-مقدار مورد نیاز است - برای مثال، سیستم های حافظه پنهان، رایج هستند. علاوه بر این، ما از جداول Hash در وظایف پردازش داده ها مانند نمایه سازی و حذف مجدد استفاده می کنیم.

📣👨‍💻 @AlgorithmDesign_DataStructuer
👍1
در صورتی که گراف خلوت باشد کدام یک از الگوریتم های زیر سریع تر درخت پوشای کمینه را پیدا میکند؟
Anonymous Quiz
34%
الگوریتم کراسکل
38%
الگوریتم پریم
11%
الگوریتم فلوید
18%
الگوریتم BFS
شبه کد ضرب دو عدد با استفاده از الگورتیم Divide and Conquer
📣👨‍💻 @AlgorithmDesign_DataStructuer
👍1
def Divide_remaining(m,n):
if m < n:
return m
else:
return Divide_remaining(m-n,n)


m = int(input("Enter the number of elements in the list: "))
n = int(input("Enter the number of elements to be divided: "))

print("The remainder of dividing m by n :" , Divide_remaining(m,n))


کد بازگشتی باقی مانده تقسیم m بر n

📣👨‍💻 @AlgorithmDesign_DataStructuer
میخواهیم در یک آرایه به طول n، عنصري که k بار تکرار شده بیـابیم. K در ورودي داده شده و مستقل از n است. زمان سریعترین الگوریتم:
Anonymous Quiz
27%
n log n
38%
n log k
17%
nk
18%
n+k
👌3🎉1
الگوریتم فلوید (Floyd's algorithm) یکی از الگوریتم‌های معروف برای محاسبه کوتاه‌ترین مسیرها در گراف‌ها است. این الگوریتم به نام دانشمند ریاضی و کامپیوتری "رابرت فلوید" نام‌گذاری شده است.

در این الگوریتم، فرض می‌شود که وزن هر یال می‌تواند منفی یا مثبت باشد. هدف این الگوریتم پیدا کردن کوتاه‌ترین مسیرها بین هر دو رأس از رأس‌های گراف است.

مراحل اصلی الگوریتم فلوید عبارتند از:

1. ماتریس وزن: ابتدا یک ماتریس وزن به نام D را تعریف می‌کنیم که در آن D[i][j] وزن کوتاه‌ترین مسیر بین رأس i و j است. این ماتریس در ابتدا برابر با وزن‌های یال‌های گراف است و برای یال‌هایی که میان دو رأس مستقیماً وجود ندارد (به جز خود رأس با خودش)، مقدار بی نهایت یا مقدار زیادی معرفی می‌شود.

2. الگوریتم اصلی: برای هر سه رأس i، j و k، الگوریتم مقدار D[i][j] را با استفاده از فرمول زیر به‌روزرسانی می‌کند:

D[i][j] = min(D[i][j], D[i][k] + D[k][j])

به عبارت دیگر، فرض می‌کنیم که ما به‌روزرسانی D[i][j] را انجام داده‌ایم و k رأسی است که از i به j مسیر می‌دهد. حالا ما وزن کوتاه‌ترین مسیر بین i و j را با استفاده از مقدار فعلی آن (D[i][j]) و وزن مسیر i به k به‌علاوه وزن مسیر k به j (D[i][k] + D[k][j]) محاسبه می‌کنیم. اگر این مقدار کمتر از مقدار فعلی D[i][j] باشد، D[i][j] را به‌روزرسانی می‌کنیم.

3. پایان الگوریتم: بعد از اجرای مرحله 2 برای همه سه رأس i، j و k، ماتریس D به‌روز شده و حاوی اطلاعات کوتاه‌ترین مسیرهای بین هر زوج رأس است.

الگوریتم فلوید بسیار موثر است و با زمان اجرای O(V^3) انجام می‌شود، که در آن V تعداد رئوس گراف است. این الگوریتم به خوبی با وزن‌های منفی کار می‌کند، به شرطی که هیچ دور منفی در گراف وجود نداشته باشد، زیرا این الگوریتم قادر به تشخیص دورهای منفی نمی‌باشد و ممکن است در صورت وجود دور منفی به مقدار بی نهایت یا عدد بسیار بزرگی همگرا شود.
📣👨‍💻 @AlgorithmDesign_DataStructuer