magicfile icon وبسایت فایل سحرآمیز - magicfile.ir

تگ های موضوع حل مسئله وزیر با الگوریتم ژنتیک در

حل مسئله ۸ وزیر با الگوریتم ژنتیک در زبان برنامه‌نویسی سی شارپ


مسئله ۸ وزیر یک مسئله کلاسیک در علم کامپیوتر و ریاضیات است که هدف آن جای‌گذاری ۸ وزیر بر روی یک صفحه شطرنج ۸x۸ به گونه‌ای است که هیچ‌یک از وزرا نتوانند یکدیگر را تهدید کنند. در اینجا، ما به بررسی چگونگی استفاده از الگوریتم ژنتیک برای حل این مسئله در زبان سی شارپ می‌پردازیم.
ALGORITHM OVERVIEW
الگوریتم ژنتیک یک روش بهینه‌سازی مبتنی بر اصول انتخاب طبیعی است. این الگوریتم شامل مراحل زیر است:
  1. ابتدایی‌سازی جمعیت: در این مرحله، جمعیتی از راه‌حل‌ها (در اینجا، چیدمان وزرا) به طور تصادفی تولید می‌شود. هر راه‌حل می‌تواند به صورت یک آرایه از اعداد صحیح نمایش داده شود که هر عدد نشان دهنده موقعیت یک وزیر در ردیف خاصی است.

  1. محاسبه تناسب: برای هر فرد در جمعیت، یک تابع تناسب (Fitness Function) تعریف می‌شود. این تابع تعداد برخوردها (تضادها) را محاسبه می‌کند. هدف این است که این عدد را به حداقل برسانیم.

  1. انتخاب: در این مرحله، افراد با تناسب بالاتر احتمال بیشتری برای انتخاب شدن و تولید نسل‌های جدید خواهند داشت. می‌توان از روش‌های مختلفی مانند انتخاب چرخ‌گردان یا انتخاب تورنمنت استفاده کرد.

  1. تقاطع: در این مرحله، دو فرد انتخاب‌شده برای تولید نسل جدید با هم ترکیب می‌شوند. برای مثال، می‌توان از روش‌های تقاطع یک نقطه‌ای یا دو نقطه‌ای استفاده کرد.

  1. موتاسیون: در نهایت، برای جلوگیری از یکنواختی جمعیت، برخی از افراد دستخوش تغییرات تصادفی می‌شوند. این تغییرات می‌توانند شامل جابجایی وزرا در چیدمان باشند.

IMPLEMENTATION IN C#
برای پیاده‌سازی این الگوریتم در سی شارپ، می‌توان از کلاس‌ها و متدهای زیر استفاده کرد:
```csharp
class Queen
{
public int[] Positions { get; set; }
public int Fitness { get; set; }
public Queen(int size)
{
Positions = new int[size];
RandomizePositions();
CalculateFitness();
}
void RandomizePositions()
{
Random rand = new Random();
for (int i = 0; i < Positions.Length; i++)
{
Positions[i] = rand.Next(0, Positions.Length);
}
}
public void CalculateFitness()
{
// Logic to calculate fitness based on the number of attacks
}
}
```
این کلاس می‌تواند به عنوان پایه‌ای برای پیاده‌سازی الگوریتم ژنتیک استفاده شود. در نهایت، با تکرار مراحل انتخاب، تقاطع و موتاسیون، می‌توان به یک راه‌حل بهینه نزدیک شد.
CONCLUSION
استفاده از الگوریتم ژنتیک برای حل مسئله ۸ وزیر یک روش مؤثر و جالب است. با پیاده‌سازی صحیح این الگوریتم در زبان سی شارپ، می‌توان به راه‌حل‌های بهینه‌تری دست یافت. این روش نه تنها برای مسئله ۸ وزیر بلکه برای دیگر مسائل بهینه‌سازی نیز کاربرد دارد.

حل مسئله 8 وزیر با الگوریتم ژنتیک در سی‌شارپ (#C)


مقدمه
مسئله 8 وزیر، یکی از مسائل کلاسیک در حوزه هوش مصنوعی و الگوریتم‌های بهینه‌سازی است. هدف این است که 8 وزیر را روی صفحه‌ی شطرنج 8x8 قرار دهیم به‌طوری که هیچ دو وزیری در یک خط مستقیم، ستون یا قطر قرار نگیرند. حال، استفاده از الگوریتم ژنتیک یکی از روش‌های قدرتمند برای یافتن راه‌حل‌های بهینه یا تقریبی است. در ادامه، به صورت کامل و جامع، نحوه پیاده‌سازی این مسئله در سی‌شارپ را شرح می‌دهم.
شرح کلی الگوریتم ژنتیک برای مسئله 8 وزیر
الگوریتم ژنتیک یک روش مبتنی بر فرآیند طبیعی انتخاب و تولید مثل است. در اینجا، فرض بر این است که هر فرد (Chromosome) یک راه‌حل ممکن است، که به صورت یک آرایه 8 عنصری نشان داده می‌شود. هر عدد در این آرایه، نشان‌دهنده‌ی سطر وزیر در ستون مربوطه است.

مراحل کلی الگوریتم:


  1. تولید جمعیت اولیه:
مجموعه‌ای از راه‌حل‌های تصادفی یا تصادفی‌سازی شده تشکیل می‌شود.
  1. محاسبه‌ی امتیاز (Fitness):
هر فرد ارزیابی می‌شود بر اساس تعداد درگیری‌های وزیران (در خطوط، ستون‌ها و قطرها).
  1. انتخاب:
بر اساس امتیاز، افراد برای تولید نسل جدید انتخاب می‌شوند.
  1. تولید مثل (Crossover):
ترکیب دو والد برای تولید فرزند جدید.
  1. جهش (Mutation):
تغییر تصادفی در فرزند برای افزایش تنوع.
  1. تکرار:
این فرآیند تا رسیدن به راه‌حل مطلوب یا تکرار مشخص ادامه می‌یابد.
---

پیاده‌سازی در سی‌شارپ (#C)


در این بخش، کدهای نمونه و توضیحات مربوط را ارائه می‌دهم.
---

کد نمونه کامل


```csharp
using System;
using System.Collections.Generic;
using System.Linq;
namespace EightQueensGA
{
class Program
{
static Random rand = new Random();
// پارامترهای الگوریتم
const int populationSize = 100;
const int maxGenerations = 1000;
const double mutationRate =
  1. 05;

static void Main(string[] args)
{
// تولید جمعیت اولیه
List<int[]> population = GenerateInitialPopulation();
int generation = 0;
bool solutionFound = false;
while (generation < maxGenerations && !solutionFound)
{
// ارزیابی امتیاز
var fitnessScores = population.Select(ChromosomeFitness).ToList();
// بررسی وجود راه‌حل
int minFitness = fitnessScores.Min();
if (minFitness == 0)
{
// پیدا کردن فرد حل
int index = fitnessScores.IndexOf(0);
Console.WriteLine("راه‌حل پیدا شد در نسل: " + generation);
PrintBoard(population[index]);
solutionFound = true;
break;
}
// انتخاب والدین بر اساس امتیاز
List<int[]> newPopulation = new List<int[]>();
while (newPopulation.Count < populationSize)
{
// انتخاب والدین
var parent1 = SelectParent(population, fitnessScores);
var parent2 = SelectParent(population, fitnessScores);
// تولید نسل جدید با crossover
var children = Crossover(parent1, parent2);
// جهش
for (int i = 0; i < children.Length; i++)
{
if (rand.NextDouble() < mutationRate)
{
Mutate(children[i]);
}
newPopulation.Add(children[i]);
if (newPopulation.Count >= populationSize)
break;
}
}
population = newPopulation;
generation++;
}
if (!solutionFound)
Console.WriteLine("راه‌حلی پیدا نشد در حداکثر نسل‌ها");
}
// تولید جمعیت اولیه
static List<int[]> GenerateInitialPopulation()
{
var population = new List<int[]>();
for (int i = 0; i < populationSize; i++)
{
var chromosome = new int[8];
for (int j = 0; j < 8; j++)
{
chromosome[j] = rand.Next(0, 8); // سطر تصادفی برای هر ستون
}
population.Add(chromosome);
}
return population;
}
// محاسبه امتیاز (تعداد درگیری‌ها)
static int ChromosomeFitness(int[] chromosome)
{
int conflicts = 0;
for (int i = 0; i < chromosome.Length; i++)
{
for (int j = i + 1; j < chromosome.Length; j++)
{
if (chromosome[i] == chromosome[j])
conflicts++; // درگیری در سطر
if (Math.Abs(chromosome[i] - chromosome[j]) == Math.Abs(i - j))
conflicts++; // درگیری در قطر
}
}
return conflicts;
}
// انتخاب والدین بر اساس امتیاز
static int[] SelectParent(List<int[]> population, List<int> fitnessScores)
{
// روش tournament یا roulette
// در اینجا، روش roulette
double totalFitness = fitnessScores.Sum();
double randPoint = rand.NextDouble() * totalFitness;
double cumulative = 0;
for (int i = 0; i < population.Count; i++)
{
cumulative += (
  1. 0 / (fitnessScores[i] + 1)); // معکوس درگیری‌ها
if (cumulative >= randPoint)
return population[i];
}
return population[population.Count - 1];
}
// تولید فرزند با crossover
static int[][] Crossover(int[] parent1, int[] parent2)
{
int crossoverPoint = rand.Next(1, 7); // نقطه برش
int[] child1 = new int[8];
int[] child2 = new int[8];
for (int i = 0; i < 8; i++)
{
if (i < crossoverPoint)
{
child1[i] = parent1[i];
child2[i] = parent2[i];
}
else
{
child1[i] = parent2[i];
child2[i] = parent1[i];
}
}
return new int[][] { child1, child2 };
}
// جهش
static void Mutate(int[] chromosome)
{
int geneIndex = rand.Next(0, 8);
chromosome[geneIndex] = rand.Next(0, 8);
}
// چاپ صفحه
static void PrintBoard(int[] chromosome)
{
for (int row = 0; row < 8; row++)
{
for (int col = 0; col < 8; col++)
{
if (chromosome[col] == row)
Console.Write(" Q ");
else
Console.Write(" . ");
}
Console.WriteLine();
}
}
}
}
```
---

نکات مهم:


- امتیازدهی: هر چه تعداد درگیری‌ها کمتر باشد، راه‌حل بهتر است.
- انتخاب: روش roulette برای انتخاب والدین استفاده شده است، که بر اساس معکوس امتیاز عمل می‌کند.
- کراس‌اور و جهش: نقش مهمی در تنوع نسل‌ها دارند و باعث جلوگیری از رسوب در راه‌حل‌های محلی می‌شوند.
- پایان: زمانی که فردی با امتیاز صفر (بدون درگیری) پیدا شود، حل مسئله است.
---

نتیجه‌گیری

در این پروژه، نشان دادم که چگونه می‌توان با استفاده از الگوریتم ژنتیک، مسئله 8 وزیر را حل کرد. این روش، نمونه‌ای است از قدرت الگوریتم‌های تکاملی در حل مسائل ترکیبی و پیچیده. البته، بهبودهای بیشتری مثل تنظیم پارامترها، اضافه کردن روش‌های انتخاب پیشرفته یا استفاده از الگوریتم‌های هیبریدی، می‌تواند عملکرد را بهبود بخشد.
در صورت نیاز، می‌توانم موارد تخصصی‌تر، مانند بهبودهای الگوریتم، مقایسه با دیگر روش‌ها یا پیاده‌سازی‌های دیگر نیز توضیح دهم.

حل مسئله 8 وزیر با الگوریتم ژنتیک در سی‌شارپ (#C)


مقدمه
مسئله 8 وزیر، یکی از مسائل کلاسیک در حوزه هوش مصنوعی و الگوریتم‌های بهینه‌سازی است. هدف این است که 8 وزیر را روی صفحه‌ی شطرنج 8x8 قرار دهیم به‌طوری که هیچ دو وزیری در یک خط مستقیم، ستون یا قطر قرار نگیرند. حال، استفاده از الگوریتم ژنتیک یکی از روش‌های قدرتمند برای یافتن راه‌حل‌های بهینه یا تقریبی است. در ادامه، به صورت کامل و جامع، نحوه پیاده‌سازی این مسئله در سی‌شارپ را شرح می‌دهم.
شرح کلی الگوریتم ژنتیک برای مسئله 8 وزیر
الگوریتم ژنتیک یک روش مبتنی بر فرآیند طبیعی انتخاب و تولید مثل است. در اینجا، فرض بر این است که هر فرد (Chromosome) یک راه‌حل ممکن است، که به صورت یک آرایه 8 عنصری نشان داده می‌شود. هر عدد در این آرایه، نشان‌دهنده‌ی سطر وزیر در ستون مربوطه است.

مراحل کلی الگوریتم:


  1. تولید جمعیت اولیه:
مجموعه‌ای از راه‌حل‌های تصادفی یا تصادفی‌سازی شده تشکیل می‌شود.
  1. محاسبه‌ی امتیاز (Fitness):
هر فرد ارزیابی می‌شود بر اساس تعداد درگیری‌های وزیران (در خطوط، ستون‌ها و قطرها).
  1. انتخاب:
بر اساس امتیاز، افراد برای تولید نسل جدید انتخاب می‌شوند.
  1. تولید مثل (Crossover):
ترکیب دو والد برای تولید فرزند جدید.
  1. جهش (Mutation):
تغییر تصادفی در فرزند برای افزایش تنوع.
  1. تکرار:
این فرآیند تا رسیدن به راه‌حل مطلوب یا تکرار مشخص ادامه می‌یابد.
---

پیاده‌سازی در سی‌شارپ (#C)


در این بخش، کدهای نمونه و توضیحات مربوط را ارائه می‌دهم.
---

کد نمونه کامل


```csharp
using System;
using System.Collections.Generic;
using System.Linq;
namespace EightQueensGA
{
class Program
{
static Random rand = new Random();
// پارامترهای الگوریتم
const int populationSize = 100;
const int maxGenerations = 1000;
const double mutationRate =
  1. 05;

static void Main(string[] args)
{
// تولید جمعیت اولیه
List<int[]> population = GenerateInitialPopulation();
int generation = 0;
bool solutionFound = false;
while (generation < maxGenerations && !solutionFound)
{
// ارزیابی امتیاز
var fitnessScores = population.Select(ChromosomeFitness).ToList();
// بررسی وجود راه‌حل
int minFitness = fitnessScores.Min();
if (minFitness == 0)
{
// پیدا کردن فرد حل
int index = fitnessScores.IndexOf(0);
Console.WriteLine("راه‌حل پیدا شد در نسل: " + generation);
PrintBoard(population[index]);
solutionFound = true;
break;
}
// انتخاب والدین بر اساس امتیاز
List<int[]> newPopulation = new List<int[]>();
while (newPopulation.Count < populationSize)
{
// انتخاب والدین
var parent1 = SelectParent(population, fitnessScores);
var parent2 = SelectParent(population, fitnessScores);
// تولید نسل جدید با crossover
var children = Crossover(parent1, parent2);
// جهش
for (int i = 0; i < children.Length; i++)
{
if (rand.NextDouble() < mutationRate)
{
Mutate(children[i]);
}
newPopulation.Add(children[i]);
if (newPopulation.Count >= populationSize)
break;
}
}
population = newPopulation;
generation++;
}
if (!solutionFound)
Console.WriteLine("راه‌حلی پیدا نشد در حداکثر نسل‌ها");
}
// تولید جمعیت اولیه
static List<int[]> GenerateInitialPopulation()
{
var population = new List<int[]>();
for (int i = 0; i < populationSize; i++)
{
var chromosome = new int[8];
for (int j = 0; j < 8; j++)
{
chromosome[j] = rand.Next(0, 8); // سطر تصادفی برای هر ستون
}
population.Add(chromosome);
}
return population;
}
// محاسبه امتیاز (تعداد درگیری‌ها)
static int ChromosomeFitness(int[] chromosome)
{
int conflicts = 0;
for (int i = 0; i < chromosome.Length; i++)
{
for (int j = i + 1; j < chromosome.Length; j++)
{
if (chromosome[i] == chromosome[j])
conflicts++; // درگیری در سطر
if (Math.Abs(chromosome[i] - chromosome[j]) == Math.Abs(i - j))
conflicts++; // درگیری در قطر
}
}
return conflicts;
}
// انتخاب والدین بر اساس امتیاز
static int[] SelectParent(List<int[]> population, List<int> fitnessScores)
{
// روش tournament یا roulette
// در اینجا، روش roulette
double totalFitness = fitnessScores.Sum();
double randPoint = rand.NextDouble() * totalFitness;
double cumulative = 0;
for (int i = 0; i < population.Count; i++)
{
cumulative += (
  1. 0 / (fitnessScores[i] + 1)); // معکوس درگیری‌ها
if (cumulative >= randPoint)
return population[i];
}
return population[population.Count - 1];
}
// تولید فرزند با crossover
static int[][] Crossover(int[] parent1, int[] parent2)
{
int crossoverPoint = rand.Next(1, 7); // نقطه برش
int[] child1 = new int[8];
int[] child2 = new int[8];
for (int i = 0; i < 8; i++)
{
if (i < crossoverPoint)
{
child1[i] = parent1[i];
child2[i] = parent2[i];
}
else
{
child1[i] = parent2[i];
child2[i] = parent1[i];
}
}
return new int[][] { child1, child2 };
}
// جهش
static void Mutate(int[] chromosome)
{
int geneIndex = rand.Next(0, 8);
chromosome[geneIndex] = rand.Next(0, 8);
}
// چاپ صفحه
static void PrintBoard(int[] chromosome)
{
for (int row = 0; row < 8; row++)
{
for (int col = 0; col < 8; col++)
{
if (chromosome[col] == row)
Console.Write(" Q ");
else
Console.Write(" . ");
}
Console.WriteLine();
}
}
}
}
```
---

نکات مهم:


- امتیازدهی: هر چه تعداد درگیری‌ها کمتر باشد، راه‌حل بهتر است.
- انتخاب: روش roulette برای انتخاب والدین استفاده شده است، که بر اساس معکوس امتیاز عمل می‌کند.
- کراس‌اور و جهش: نقش مهمی در تنوع نسل‌ها دارند و باعث جلوگیری از رسوب در راه‌حل‌های محلی می‌شوند.
- پایان: زمانی که فردی با امتیاز صفر (بدون درگیری) پیدا شود، حل مسئله است.
---

نتیجه‌گیری

در این پروژه، نشان دادم که چگونه می‌توان با استفاده از الگوریتم ژنتیک، مسئله 8 وزیر را حل کرد. این روش، نمونه‌ای است از قدرت الگوریتم‌های تکاملی در حل مسائل ترکیبی و پیچیده. البته، بهبودهای بیشتری مثل تنظیم پارامترها، اضافه کردن روش‌های انتخاب پیشرفته یا استفاده از الگوریتم‌های هیبریدی، می‌تواند عملکرد را بهبود بخشد.
در صورت نیاز، می‌توانم موارد تخصصی‌تر، مانند بهبودهای الگوریتم، مقایسه با دیگر روش‌ها یا پیاده‌سازی‌های دیگر نیز توضیح دهم.
مشاهده بيشتر

لیست فایل های ویژه وبسایت

دانلود-دیتابیس-تقویم-1404-در-اکسل

دانلود دیتابیس تقویم 1404 در اکسل


نرم-افزار-تغییر-زبان-سورس-کد-ویژوال-استودیو-(عناصر-دیزاین-طراحی-فرم-ها)

نرم افزار تغییر زبان سورس کد ویژوال استودیو (عناصر دیزاین طراحی فرم ها)


بهترین-سرویس-پوش-نوتیفیکیشن-(Web-Push-Notification)-اسکریپت-مدیریت-اعلان-و-ساخت-پوش-نوتیفیکیشن-سایت-و-ارسال-پوش-از-طریق-php

بهترین سرویس پوش نوتیفیکیشن (Web Push Notification) اسکریپت مدیریت اعلان و ساخت پوش نوتیفیکیشن سایت و ارسال پوش از طریق php


نرم-افزار-ترجمه-خودکار-فایل-های-po-,-pot-بصورت-کامل-برای-تمامی-زبان-ها-از-جمله-فارسی

نرم افزار ترجمه خودکار فایل های po , pot بصورت کامل برای تمامی زبان ها از جمله فارسی


دانلود-نرم-افزار-تبدیل-txt-به-vcf-:-برنامه-تبدیل-فایل-متنی-تکست-txt-به-وی‌سی‌اف-vcf-(Virtual-Contact-File-مخاطب-موبایل)

دانلود نرم افزار تبدیل txt به vcf : برنامه تبدیل فایل متنی تکست txt به وی‌سی‌اف vcf (Virtual Contact File مخاطب موبایل)


تعداد فایل های دانلود شده

41080+

آخرین بروز رسانی در سایت

1404/6/3

قدمت سایت فایل سحرآمیز

+8 سال

تعداد محصولات برای دانلود

2704+

دانلود فایل
🛒 چطور فایل را انتخاب و به سبد دانلود اضافه کنم؟
📖 نحوه دانلود کردن فایل از سایت
🗂️ آیا فایل‌ها با پسوند zip یا rar هستند؟
🔐 آیا فایل‌ها رمز عبور دارند؟
▶️ آیا بعد از دانلود می‌توانم فایل‌ها را اجرا کنم؟
📜 قوانین کلی سایت برای دانلود فایل‌ها چیست؟
📥 بعد از دانلود فایل
❗ اگر پرداخت موفق بود ولی نتوانستم دانلود کنم؟
🔄 چگونه لینک دانلود را بازیابی کنم؟
👤 آیا می‌توانم از حساب کاربری دانلود کنم؟
🔢 محدودیت دانلود هر فایل چند بار است؟
⏳ لینک دانلود تا چند روز فعال است؟
📧 اگر ایمیل اشتباه وارد کنم چه می‌شود؟
💳 مشکل پرداخت
🌐 اگر هنگام وصل شدن به درگاه مشکل داشتم؟
🔁 آیا درگاه پرداخت دوم وجود دارد؟
🚫 اگر پرداخت ناموفق بود چه کنم؟
💸 آیا مبلغ پرداخت شده قابل بازگشت است؟
📂 خراب بودن فایل
🧪 آیا فایل‌ها قبل از ارسال تست می‌شوند؟
❌ اگر فایل بعد از دانلود خراب بود؟
🕒 آیا پشتیبانی پس از 3 روز وجود دارد؟
🗃️ نحوه باز کردن فایل
📦 فایل‌ها به چه صورت فشرده هستند؟
🔑 آیا فایل‌ها پسورد دارند؟
🧰 با چه نرم‌افزاری فایل‌ها را باز کنم؟
🛠️ آیا فایل‌ها قابلیت ترمیم دارند؟
✏️ درخواست ویرایش فایل
🧑‍💻 آیا سایت پشتیبانی برای ویرایش دارد؟
🔄 اگر نیاز به تغییر فایل داشتم؟
📩 آیا درخواست‌های ویرایش پاسخ داده می‌شود؟
💰 مالی
↩️ آیا امکان برگشت وجه وجود دارد؟
📃 قوانین بازگشت مبلغ چگونه است؟
💼 آیا مبلغ شامل هزینه پشتیبانی می‌شود؟
🛠️ فنی
🎓 آیا پشتیبانی شامل آموزش نصب می‌شود؟
⏱️ زمان پاسخگویی پشتیبانی چقدر است؟
⚠️ اگر کاربر ادب را رعایت نکند؟
📌 چه مواردی شامل پشتیبانی نمی‌شوند؟
🧾 آیا اطلاعات کاربران ممکن است تغییر کند؟
🚀 نحوه اجرای فایل‌ها
🐘 نحوه اجرای فایل‌های PHP
💻 نحوه اجرای فایل‌های VB.NET و C#
📱 نحوه اجرای سورس‌کدهای B4A
📊 نحوه اجرای فایل‌های Excel
📁 نحوه اجرای فایل‌های Access
🗄️ نحوه اجرای فایل‌های SQL
🌐 نحوه اجرای سورس‌کدهای HTML/CSS/JS
📄 نحوه اجرای فایل‌های متنی و PDF

راهنمایی 🎧 پشتیبانی سایت MagicFile.ir

👋 سلام و وقت بخیر!

به سامانه 🎧 راهنمایی سایت MagicFile.ir خوش آمدید! 🌟
اینجا می‌تونید به‌راحتی پاسخ سوالات خودتون رو پیدا کنید، یا اگر مشکلی در دانلود، پرداخت دارید، براحتی از بین گزینه ها مشکل خود را انتخاب کنید تا توضیحات را دریافت نمایید! 🧑‍💻💡

از منوی سمت راست می‌تونید دسته‌بندی‌های مختلف سوالات متداول 📚 رو ببینید و فقط با یک کلیک پاسخ‌هاشون رو مشاهده کنید.

اگر سوالی دارید، همین حالا بپرسید! 😊

📞 برای دریافت کمک مستقیم، به پشتیبانی سایت مراجعه کنید.
هم‌اکنون