Artificial Intelligence - هوش مصنوعی

Artificial Intelligence - هوش مصنوعی (http://artificial.ir/intelligence/)
-   حل مسائل معروف هوش مصنوعي (http://artificial.ir/intelligence/forum102.html)
-   -   حل مسئله 8 وزير(8Queen) با روش هاي مختلف! (http://artificial.ir/intelligence/thread619.html)

Astaraki ۰۸-۱-۱۳۸۸ ۱۱:۳۵ قبل از ظهر

حل مسئله 8 وزير(8Queen) با روش هاي مختلف!
 
دوستان بياييد مسئله 8 وزير را با روش هاي مختلف در اينجا با هم حل کنيم:rolleyes:

با استفاده از روشهايي از قبيل:
الگوريتم ژنتيک
جستجوي محلي
الگوريتم عقبگرد
مسئله ارضاي محدوديت
جستجوي تپه نوردي
و غيره

;)

Astaraki ۰۸-۱-۱۳۸۸ ۱۱:۴۲ قبل از ظهر

صورت مسئله : هشت وزير را در هشت خانه شطرنج (8*8) طوري قرار دهيد كه هيچكدام يكديگر را تهديد نكنند. وزير در خانه هاي شطرنج به صورت عرضي،طولي و قطري مي تواند حركت كند. اين مسئله قابل تعميم به مسئله N وزير در يك شطرنج N*N است.

تاريخچه: اين مسئله در سالي 1848 توسط شطرنج بازي به نام Max Bezzel عنوان شد و رياضي دانان بسياري ازجمله Gauss و Georg Cantor بر روي اين مسئله كار كرده و در نهايت آنرا به N وزير تعميم دادند. اولين راه حل توسط Franz Nauck در سال 1850 ارائه شد كه به همان مسئله N وزير تعميم داده شد. پس از آن Gunther راه حلي با استفاده از دترمينان ارائه داد كه J.W.L. Glaisher آنرا كامل نمود.
در سال 1979 ، Edsger Dijkstra با استفاده از الگوريتم عقب گرد اول عمق اين مسئله را حل كرد.

راه حل: براي حل اين مسئله كه داراي 92 جواب است ، بايد تكنيكهايي جهت كاهش حالات ،روش Brute Force يا امتحان تك تك جواب ها انجام شود. تعداد همه حالاتي كه مي تواند در روش Brute Force چك شود برابر 16,777,216 يا هشت به توان هشت است!
يكي از روش هاي حل اين مسئله براي n>=4 يا n=1 استفاده از روش مكاشفه اي (heuristic) است:
1- عدد n را بر عدد 12 تقسيم كن و باقي مانده را يادداشت كن
2- به ترتيب اعداد زوج 2 تا n را در ليستي بنويس
3- اگر باقي مانده 3 يا 9 بود ، عدد 2 را به انتهاي ليست انتقال بده.
4- به ليست اعداد فرد 1 تا N را به ترتيب اضافه كن، اما اگر باقي مانده 8 بود اعداد را دو به دو باهم عوض كند (مثلا 1و3و5و7و9 تبديل به 3و1و7و5و9 ميشه)
5- اگر باقي مانده 2 بود جاي 1 و3 را با هم عوض كن و 5 را به انتهاي ليست ببر
6- اگر باقي مانده 3 يا 9 بود ، اعداد 1 و 3 را به انتهاي ليست ببر.
7- حال با استفاده از ليست بدست آمده وزير ها در صفحه شطرنج چيده مي شوند، بطوريكه جاي وزير ستون اول ،اولين عدد ليست ،جاي وزير ستون دوم ، دومين عدد ليست و ...
اين الگوريتم يك راه حل براي حل اين مسئله است، براي بدست آوردن همه حالات از روشهاي ديگري مي توان استفاده كرد.
روش حل مسئله 12 راه حل يكتا دارد كه با در نظر گيري تقارن و چرخش به 92 حالت قابل تبديل است.

Astaraki ۰۸-۱-۱۳۸۸ ۱۱:۵۸ قبل از ظهر

روش های جستجوی محلی
برای معرفی هریک از روش های جستجویی که در فصل به بررسی آن ها می پردازیم از مسئله 8 وزیر استفاده خواهیم کرد. در مسئله 8 وزیر هدف قرار دادن 8 وزیر بر روی صفحه شطرنج به گونه ای است که هیچیک از وزیرها همدیگر را گارد ندهند. تعمیم یافته مسئله 8 وزیر، مسئله n وزیر است که در آن بر روی یک صفحه شطرنج n*n باید n وزیر را به گونه ای قرار دهیم که هیچیک همدیگر را گارد ندهند. مسئله n وزیر از جمله مسائل NP در هوش مصنوعی است که روش های جستجوی معمولی قادر به حل آن ها نخواهد بود. از سوی دیگر می توان به مسئله 8 وزیر به عنوان یک مسئله بهینه سازی نیز نگریست که در آن هدف بهینه کردن تعداد گاردهای جفت وزیرها می باشد. به عنوان مثال فرض کنید در صفحه شطرنج معمولی ، 8 وزیر را به دو روش زیر قرار دهیم :

http://aisthinktank.com/images/contents/queen1.JPGhttp://aisthinktank.com/images/contents/queen.JPG


در روش چینش سمت چپ 3 وزیر و در روش چینش سمت راست 4 وزیر همدیگر را گارد می دهند. بنابراین روش چینش قبلی بهینه تر از روش چینش فعلی است. در واقع می توان مسئله بهینه سازی را به صورت زیر تعریف کرد. فرض کنید S مجموعه همه جواب های ممکن برای مسئله باشد. در صورتی S* می تواند جواب مسئله باشد که به ازای همه جواب های موجود در S ، S* بهینه تر از دیگر جواب ها باشد. در مسئله 8 وزیر دیدیم که جوابی بهینه است که تعداد گاردهای جفت وزیر آن کمتر باشد.

روش های جستجوی محلی همگی حالت های همسایه حالت فعلی را برای رسیدن به بهینه ترین جواب بررسی می کنند. از این رو وجود دو تابع در همه این روش های جستجو الزامی است. اولین تابع میزان بهینگی جواب مسئله ارزیابی می کند و تابع دوم یکی از حالت های همسایه حالت فعلی را انتخاب می کند.

سخن آخر اینکه نحوه پیاده سازی و طراحی الگوریتم برای انتخاب حالت هسایه در این روش های جستجو از اهمیت ویژه ای برخوردار است. به عنوان مثال برای مسئله 8 وزیر می توان به شکل های زیر حالت های همسایگی را تولید کرد :
1) دو وزیر به تصادف انتخاب شده و جای آن دو باهم عوض گردد.
2) یکی از وزیر ها به تصادف انتخاب شده و شماره سطر آن به تصادف تغییر کند.
3) ویزیری به تصادف انتخاب شده و یک خانه به سمت بالا یا پایین حرکت کند

Astaraki ۰۸-۱-۱۳۸۸ ۱۲:۲۴ بعد از ظهر

برنامه جستجوی تپه نوردی(برای هشت وزیر) نوشته شده با زبان c#
 
1(ها)ضميمه
تپه نوردی Hill Climbing Searching یکی از الگوریتم های هوش مصنوعی می باشد که برای مسائل پیچیده به کار میرود به گونه ای که بجای اینکه برای حل مسئله از کل گراف استفاده کند.به صورت اتفاقی از یک قسمت از گراف استفاده میکند.

دريافت سورس برنامه به زبان #C

Astaraki ۰۸-۱-۱۳۸۸ ۱۲:۲۸ بعد از ظهر

1(ها)ضميمه
اين مسئله به وسيله الگوريتم ژنتيک نيز در لينک زير(پاورپوينت سوم) توضيح داده شده است;)

اسلاید های آموزشی الگوریتم ژنتیک

در لينک زير هم حل اين مسئله توسط الگوريتم ژنتيک با زبان vb.net قرار دارد:
كد:

http://www.sergejusz.com/engineering_tips/queens_ga.htm
البته در اون سايت برنامه کامل نيست!
و کاربر محترم ALI_KH برنامه ي کامل شده را به ما لطف کردند که در ضميمه ميتونيد دريافت کنيد::41:

Astaraki ۰۸-۱-۱۳۸۸ ۱۲:۳۰ بعد از ظهر

1(ها)ضميمه
حل مسئله هشت وزير با آنالينگ شبيه سازي شده

Astaraki ۰۸-۱-۱۳۸۸ ۱۲:۳۳ بعد از ظهر

هشت وزير با prolog
 
اين برنامه با زبان پرولوگ هم در لينک زير نوشته شده!

هشت وزير با PROLOG
;)

Astaraki ۰۸-۱-۱۳۸۸ ۱۲:۴۴ بعد از ظهر

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

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

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

روش بازگشت به عقب برای آن دسته از مسائلی قابل استفاده است که برای رسیدن به جواب بتوان یک جستجوی سیستماتیک را دنبال کرد. به عنوان نمونه می‌توان بهره‌گیری از این روش را در بازیهای کامپیوتری، سیستمهای اثبات تئوریها، شبکه‌های مفهومی، هایپرتکس و ... دید.


مثال 8 وزير:

چگونه هشت وزیر را بر روی صفحه شطرنج قرار دهیم به گونه‌ای که هیچ یک از آنها مورد تهدید دیگری قرار نگیرد؟

در مقاله زير اين مسئله با استفاده از روش عقبگرد همراه با سورس کد آن کاملاً توضيح داده شده
;)

hamide_kh ۰۸-۲۶-۱۳۸۸ ۰۹:۳۷ بعد از ظهر

درخواست راهنمایی در مورد برنامه تپه نوردی با c#
 
نقل قول:

تپه نوردی Hill Climbing Searching یکی از الگوریتم های هوش مصنوعی می باشد که برای مسائل پیچیده به کار میرود به گونه ای که بجای اینکه برای حل مسئله از کل گراف استفاده کند.به صورت اتفاقی از یک قسمت از گراف استفاده میکند.
سلام دوست عزیز من این برنامه را دانلود کردم و خیلی هم کارم را راه انداخت فقط مشکلی که هست 2 تابع moveو whereY را نمی فهمم اگه ممکنه در موردشون کمی بهم توضیح بدید

Astaraki ۰۹-۱۳-۱۳۸۸ ۰۷:۳۳ بعد از ظهر

1(ها)ضميمه
و این هم برنامه ی NQueen که n رو از کاربر می خواد و بعد تمام جوابهای موجود رو چاپ میکنه!:D
با TC اجرا ميشه;)

Astaraki ۰۹-۱۳-۱۳۸۸ ۰۷:۵۱ بعد از ظهر

یک مثال کلاسیک از عقبگرد، مسئله n وزیر است.
- هدف از مسئله n وزیر ، چیدن n مهره وزیر در یک صفحه شطرنج است ، به طوری که هیچ دو وزیری یکدیگر را گارد ندهند. یعنی هیچ دو مهره ای نباید در یک سطر، ستون یا قطر یکسان باشند.

- عقبگرد حالت اصلاح شده ی جست و جوی عمقی یک درخت است.

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

الگوریتم عقبگرد برای مسئله n وزیر

كد:

  void queens ( index i)
 {
 index j;
  if ( promising(i))
  if ( i == n)
  cout << col [1] through col [n];
  else
  for ( j = 1 ; j ≤ n ; j++ ) {
 
 col [ i +1 ] = j;
 queens ( i + 1);
 }
}
bool promising ( index i )
{
  index k ;
 bool  switch;
 k = 1;
 switch = true ;
  while ( k < i && switch ) {
  if (col [i] == col[k] || abs(col[i] – col[k] == i-k)
 switch = false;
 k++;
 }
  return switch;
 }


ali-kh ۱۱-۲-۱۳۸۸ ۰۹:۲۴ بعد از ظهر

1(ها)ضميمه
اینم یه برنامه برای الگوریتم عقبگرد که خودم با c# نوشتم

persiandata ۰۱-۱۴-۱۳۸۹ ۰۷:۲۱ بعد از ظهر

سلام کاش یکی پیدا میشد و برنامه n وزیر با الگوریتم ژنتیک توی سی شارپ رو میگذاشت . خواهشا کمک کنید فقط با سی شارپ

Astaraki ۰۱-۱۸-۱۳۸۹ ۰۱:۳۳ بعد از ظهر

1(ها)ضميمه
Solving n-Queen problem using global parallel genetic algorithm

bagheri ۰۱-۱۸-۱۳۸۹ ۰۸:۰۹ بعد از ظهر

کد مساله هشت وزیر یا هشت پازل بوسیله الگوریتم زنتیک
 
با سلام
من به کد این مساله با روش زنتیک لازم دارم
یعنی حتما باید با استفاده از توابع ترکیب وجهش در الگوریتم ژنتیک این مساله را حل کنیم
لطفا اگر کسی کدشو داره بذاره ممنون میشم

Astaraki ۰۱-۱۸-۱۳۸۹ ۰۸:۳۴ بعد از ظهر

1(ها)ضميمه
در اين تاپيک که کد هم قرار داره!
queens_ga

Eight Queens Puzzle:
A genetic algorithm implementation using Java

Astaraki ۰۳-۹-۱۳۸۹ ۰۶:۱۱ بعد از ظهر

1(ها)ضميمه
اینم 8 وزیر با الگوریتم ژنتیک که با ++c نوشته شده

با تشکر از مدير گرامي alijy

sarakh ۰۴-۲۵-۱۳۸۹ ۰۳:۰۳ بعد از ظهر

سلام.دوستان عزیز بهتر نبود به جای اینکه این قدر کد برنامه رو بزارین, توضیح در مورد الگوریتم می دادین؟؟؟؟
من که از کدهای نوشته شده چیزی نفهمیدم.توضیح بازگشت به عقب رو هم خوندم ولی اینو خودمم می دونستم.اگر بیشتر در مورد الگوریتم بازگشت به عقب برای حل این مسئله راهنماییم کنین ممنون می شم.اینکه برای حل مسئله چه کارایی باید انجام بدم.
ممنون.

مريم نازنين ۰۸-۱۷-۱۳۸۹ ۰۱:۴۶ بعد از ظهر

سلام به همه ي علاقه مندان به هوش مصنوعي:25:
بچه ها من تازه واردم :3:
يه سوال داشتم فقط بالاغيرتا نگين برو سرچ كن كه قبل ازاينكه شما بگبن سرچيدم، اما نبوده و اون هم اينكه.....
كسي ميتونه خط به خط الگوريتم هشت وزير رو توضح بده ؟؟ به همون روش عقبگرد.
طراحي الگوريتم پاس كردم ، نفهميدم. هوش هم دارم پاس مي كنم ولي باز هم نفهميدم.
ممنون از اينكه م خواين برام توضيح بين:4:

aminkop ۰۸-۱۸-۱۳۸۹ ۱۱:۱۳ بعد از ظهر

نقل قول:

نوشته اصلي بوسيله مريم نازنين (پست 12434)
سلام به همه ي علاقه مندان به هوش مصنوعي:25:
بچه ها من تازه واردم :3:
يه سوال داشتم فقط بالاغيرتا نگين برو سرچ كن كه قبل ازاينكه شما بگبن سرچيدم، اما نبوده و اون هم اينكه.....
كسي ميتونه خط به خط الگوريتم هشت وزير رو توضح بده ؟؟ به همون روش عقبگرد.
طراحي الگوريتم پاس كردم ، نفهميدم. هوش هم دارم پاس مي كنم ولي باز هم نفهميدم.
ممنون از اينكه م خواين برام توضيح بين:4:

سلام
من می خواستم کامل توضیح بدم . صفحه قبل را که دیدم... واقعا آنرا ملاحظه کرده اید؟
هشت وزير با روش بازگشت به عقب Backtracking
http://artificial.ir/intelligence/thread619.html

با شکل و توضیحات کامل ارائه شده بررسی کنید اگه واقعا مشکلی باقی ماند بفرمائید
یک پیشنهاد دارم یک صفحه شطرنج بردارید و مهره ها را مرحله به مرحله بچینید

مريم نازنين ۰۸-۲۰-۱۳۸۹ ۱۱:۱۴ قبل از ظهر

نقل قول:

نوشته اصلي بوسيله aminkop (پست 12486)
یک صفحه شطرنج بردارید و مهره ها را مرحله به مرحله بچینید

ممنون از جوابتون اما من از كدش چيزي سر در نميارم:

void queens ( index i)
{
index j;
if ( promising(i))
if ( i == n)
cout << col [1] through col [n];
else
for ( j = 1 ; j ≤ n ; j++ ) {

col [ i +1 ] = j;
queens ( i + 1);
}
}
bool promising ( index i )
{
index k ;
bool switch;
k = 1;
switch = true ;
while ( k < i && switch ) {
if (col [i] == col[k] || abs(col[i] – col[k] == i-k)
switch = false;
k++;
}
return switch;
}


يعني ببينين اينجا منظور از promising وtrue .. چيه؟ فقط شرط آخر رو متوجه شدم كه قطري بودن و.. رو چك مي كنه.:2:

asmagan ۰۹-۱۹-۱۳۸۹ ۰۱:۴۶ قبل از ظهر

واي كاش يكي پيدا ميشد و 8 وزير را با زبان جاوا يا سي شارپ با الگوريتم هاي blind و hurrstic search رو به من مي داد:42:

Astaraki ۰۹-۱۹-۱۳۸۹ ۰۴:۲۱ بعد از ظهر

سورس 8 وزیر

كد:


#include <iostream.h>
#include<conio.h>

int test( int i , int j );
int board[8][8] = { 0 };
int main()
{
 for ( int a = 0 ; a < 8 ; a++ )
  if(test( 0 , a ))
  for ( int b = 0 ; b < 8 ; b++ )
    if(test( 1 , b ))
    for ( int c = 0 ; c < 8 ; c++ )
      if(test( 2 , c ))
      for ( int d = 0 ; d < 8 ; d++ )
        if(test( 3 , d ))
        for ( int e = 0 ; e < 8 ; e++ )
          if(test( 4 , e ))
          for ( int f = 0 ; f < 8 ; f++ )
            if(test( 5 , f ))
            for ( int g = 0 ; g < 8 ; g++ )
              if(test( 6 , g ))
              for ( int h = 0 ; h < 8 ; h++ )
                if(test( 7 , h )) {
                for ( int m = 0 ; m < 8 ; m++ ) {
                  for ( int n = 0 ; n < 8 ; n++ )
                  cout << board[m][n] << " ";
                  cout << endl;
                }
                cout << endl;
                getch();
                }
 cout << endl;
 return 0;
}
int test( int i , int j )
{
 for ( int a = 0 ; a < 8 ; a++ )
  board[i][a] = 0;
 for ( int b = 1 ; b < 8 ; b++ )
  if ( i - b >= 0 ) {
  if ( board[i - b][j] != 0 )
    return 0;
  if ( j - b >= 0 )
    if ( board[i - b][j - b] != 0 )
    return 0;
  if ( j + b <= 7 )
    if ( board[i - b][j + b] != 0 )
    return 0;
  }
 board[i][j] = 1;
 return 1;
}


Astaraki ۰۹-۱۹-۱۳۸۹ ۰۴:۲۴ بعد از ظهر

برنامه ی زیر که به صورت بازگشتی و با روش BackTrack نوشته شده رو میشه به N وزیر به راحتی تعمیم داد:

كد:


#include <iostream>
#include <stdlib.h>
#include<conio.h>
using namespace std;
#define N 8
bool mark[N];
int a[N];
void bt (int n)
{
if (n == N)
{
 for (int i = 0; i < N; i++, cout << endl)
  for (int j = 0; j < N; j++)
  if (a[i] == j)
    cout << "1 ";
  else
    cout << "0 ";
 cout << endl;
 getch ();
}
else
{
 for (int i = 0; i < N; i++)
  if (!mark[i])
  {
  bool b = true;
  for (int j = 0; j < n; j++)
    if (n - j == abs(i - a[j]))
    b = false;
  if (b)
  {
    mark[i] = true;
    a[n] = i;
    bt(n + 1);
    mark[i] = false;
  }
  }
}
}
int main ()
{
bt(0);
}


Astaraki ۰۹-۱۹-۱۳۸۹ ۰۴:۲۷ بعد از ظهر

2(ها)ضميمه
غیر بازگشتی:

كد:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace reversi
{
classeightQueen {
privateBoolean [,] board;
privateBoolean[, ,] memory;
privatestaticInt32 BoardNO = 0;
 
publicBoolean[, ,] calculate()
{
board = newBoolean [8,8];
memory = newBoolean[8, 8, 92];
 
for ( int a = 0 ; a < 8 ; a++ )
if(test( 0 , a ))
for ( int b = 0 ; b < 8 ; b++ )
if(test( 1 , b ))
for ( int c = 0 ; c < 8 ; c++ )
if(test( 2 , c ))
for ( int d = 0 ; d < 8 ; d++ )
if(test( 3 , d ))
for ( int e = 0 ; e < 8 ; e++ )
if(test( 4 , e ))
for ( int f = 0 ; f < 8 ; f++ )
if(test( 5 , f ))
for ( int g = 0 ; g < 8 ; g++ )
if(test( 6 , g ))
for ( int h = 0 ; h < 8 ; h++ )
if (test(7, h))
{
 
for ( int m = 0 ; m < 8 ; m++ ) {
for (int n = 0; n < 8; n++)
memory[m, n, BoardNO] = board[m,n];
}
BoardNO++;
}
return memory;
}
Boolean test( int i , int j )
{
for ( int a = 0 ; a < 8 ; a++ )
board[i, a] = false;
for ( int b = 1 ; b < 8 ; b++ )
if ( i - b >= 0 ) {
if ( board[i - b,j] != false )
returnfalse;
if ( j - b >= 0 )
if (board[i - b, j - b] != false)
returnfalse;
if ( j + b <= 7 )
if (board[i - b, j + b] != false)
returnfalse ;
}
board[i,j]= true ;
returntrue ;
}
}
}


بازگشتی: ( که در اين لينک هم قرار داده شده)

كد:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
//calculate
namespace reversi
{
classeightQueen{
privateint [] board;
privateBoolean[,,] memory;
privateint number=0;
 
/**
* Each element of the board[] represents a row and the value of each element
* specifies the column number where the queen is placed on that particular row.
* This method is used to retrieve the board array.
*
* @return
*/
publicBoolean [,,] getBoard() {
return memory;
}
public eightQueen()
{
 
board = newint[8];
memory = newBoolean[8, 8, 93];
this.place(0);
}
/**
* Place a queen in a row and check its validity. If valid then place it in the
* next row else backtrack.
*
* @param row
*/
publicvoid place(int row) {
if (row == 8) {
 
for (int r = 0; r< 8; r++)
{
for (int c = 0; c < 8; c++)
{
if (board[r] == c){
memory[r, c, number] = true;
// MessageBox.Show(r.ToString()+"/"+c.ToString()+"/"+number.ToString());
}else
memory[r, c, number] = false;
}
}
this.number++;
return;
} else {
for (int i = 0; i < 8; i++) {
board[row] = i;
if (valid(row)) place(row + 1);
}
}
}
/**
* Checks the validity of a position. If valid returns true else returns false.
*
* @param row
* @return
*/
publicBoolean valid(int row) {
for (int i = 0; i < row; i++) {
if ((board[i] == board[row]) || Math.Abs(board[row] - board[i]) == (row - i)) {
returnfalse;
}
}
returntrue;
}
}}



کد طراحی هر دوی آن به یک صورت است:

كد:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
 
namespace reversi
{
publicpartialclassReversi : Form
{
private System.Windows.Forms.Panel squaresPanel;
private System.Windows.Forms.Panel boardPanel;
private System.Windows.Forms.Label cornerLabel;
privateLabel[] colLabels, rowLabels;
privateSquareControl[,] squareControls;
// For converting column numbers to letters and vice versa.
privatestaticString alpha = "ABCDEFGH";
// The game board.
privateBoard board;
 
privateeightQueen queen;
privateBoolean[, ,] memory;
privateInt32 moveNumber;
// Used to track which player made the last move.
// Defines a thread for running the computer move look ahead.
 
public Reversi()
{
InitializeComponent();
// Create the game board.
this.board = newBoard();
 
#region bord designer
// Create the controls for each square, add them to the squares
// panel and set up event handling.
this.squareControls = newSquareControl[8, 8];
int i, j;
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
{
// Create it.
this.squareControls[i, j] = newSquareControl(i, j);
// Position it.
this.squareControls[i, j].Left = j * this.squareControls[i, j].Width;
this.squareControls[i, j].Top = i * this.squareControls[i, j].Height;
// Add it.
this.squaresPanel.Controls.Add(this.squareControls[i, j]);
// Set up event handling for it.
this.squareControls[i, j].Click += newEventHandler(this.SquareControl_Click);
 
}
// Create the column and row labels.
this.colLabels = newLabel[8];
for (i = 0; i < 8; i++)
{
// Create a column label.
this.colLabels[i] = newLabel();
// Set its display properties.
this.colLabels[i].Text = Reversi.alpha.Substring(i, 1);
this.colLabels[i].BackColor = this.cornerLabel.BackColor;
this.colLabels[i].ForeColor = this.cornerLabel.ForeColor;
this.colLabels[i].TextAlign = ContentAlignment.MiddleCenter;
// Set its size and position.
this.colLabels[i].Width = this.squareControls[0, 0].Width;
this.colLabels[i].Height = this.cornerLabel.Height;
this.colLabels[i].Left = this.cornerLabel.Width + i * this.colLabels[0].Width;
this.colLabels[i].Top = 0;
// Add it.
this.boardPanel.Controls.Add(this.colLabels[i]);
}
this.rowLabels = newLabel[8];
for (i = 0; i < 8; i++)
{
// Create a row label.
this.rowLabels[i] = newLabel();
// Set its display properties.
this.rowLabels[i].Text = (i + 1).ToString();
this.rowLabels[i].BackColor = this.cornerLabel.BackColor;
this.rowLabels[i].ForeColor = this.cornerLabel.ForeColor;
this.rowLabels[i].TextAlign = ContentAlignment.MiddleCenter;
// Set its size and position.
this.rowLabels[i].Width = this.cornerLabel.Height;
this.rowLabels[i].Height = this.squareControls[0, 0].Height;
this.rowLabels[i].Left = 0;
this.rowLabels[i].Top = this.cornerLabel.Height + i * this.rowLabels[0].Width * 2;
 
// Add it.
this.boardPanel.Controls.Add(this.rowLabels[i]);
}
#endregion
// Initialize the game state.
 
queen = neweightQueen();
memory = queen.getBoard();
}
privatevoid UpdateBoardDisplay()
{
if (moveNumber < 93&&moveNumber>-1)
{
this.moveNumber++;
// Map the current game board to the square controls.
SquareControl squareControl;
for (int row = 0; row < 8; row++)
{
for (int col = 0; col < 8; col++)
{
squareControl = (SquareControl)this.squaresPanel.Controls[row * 8 + col];
if (memory[row, col, this.moveNumber] == true)
{
 
squareControl.Contents = 1;
}
else squareControl.Contents = 0;
}
}
// Redraw the board.
this.squaresPanel.Refresh();
}
}
privatevoid SquareControl_Click(object sender, System.EventArgs e)
{
 
this.UpdateBoardDisplay();
}
}
}


استفاده از این برنامه به عنوان پروژه درسی مجاز نیست.دوستان تنها مجاز به استفاده از قسمت گرافیک این برنامه هستند.
برای پیاده سازی دیگر الگوریتم ها تنها کافیست که یک آرایه 3 بعدی را با الگوریتم تان برگردانید.
اندیس اول و دوم این آرایه برای ردیف و ستون صفحه شطرنج در نظر گرفته شده است،و اندیس سوم هم برای ذخیره 92 حالت ممکن در نظر گرفته شده است.

دیگر الگوریتم های ممکن را می توانید در همین فارم پیدا کنید.

Astaraki ۰۹-۱۹-۱۳۸۹ ۰۴:۳۸ بعد از ظهر

جاوا
 
1(ها)ضميمه
Solving the N-Queens Problem

asmagan ۰۹-۲۰-۱۳۸۹ ۱۱:۱۲ قبل از ظهر

ممنون از لطفت ريحانه جان واقعا متشكرم از لطفتون


دوستاي گلم مرتبه زماني و مكاني دو الگوريتم blind و hurrstic search رو اگر داريد لطف كنيد ممنون ميشم

mpour ۰۹-۲۸-۱۳۸۹ ۰۲:۴۰ بعد از ظهر

حل مساله nوزیر با الگوریتم ژنتیک
 
لطفا حل کامل مساله n وزیر ( 8 وزیر) را همراه با الگوریتم آن با الگوریتم ژنتیک قرار دهید .

mehdinajafinia ۱۰-۶-۱۳۸۹ ۱۰:۱۶ قبل از ظهر

ان وزیر
 
سلام
منم این ترم هوش دارم خواستی مقاله لاتین (ان وزیر) رو با کد پیاده سازی و power point میدم
خبر بده؟:112:

farzane1 ۱۰-۲۸-۱۳۸۹ ۱۱:۲۸ قبل از ظهر

سلام پروژه 8وزیر به روش ژنتیک
با نرم افزار مطلب

sinakhaki ۱۰-۳۰-۱۳۸۹ ۰۶:۰۶ بعد از ظهر

سلام دوستان
کسی میدونه هشت وزیر با الگوریتم تپه نوردی چطور حل میشه؟
گوگل کردم ولی خوب نفهمیدم چی میگن. توضیح کامل میخوام.
توضیح :
بعد از قرار دادن وزیر ها در روی صفحه به صورت تصادفی و همچنین دادن مقدار با تابع هزینه به هر کدام از خانه های شطرنج چطور باید محل وزیر ها رو تغییر بدیم ؟

Mahila ۱۰-۳۰-۱۳۸۹ ۰۷:۰۹ بعد از ظهر

سلام
لطفا برای منم الگوریتم 8 وزیر با ژنتیک در متلب رو بفرستید.

sahar68 ۱۱-۲۳-۱۳۸۹ ۱۲:۱۲ قبل از ظهر

سلام از تمامی کسانی که تو این تاپیک زحمت کشیدند خیلی تشکر می کنم
من می خوام n وزیرو با روش ارضای محدودیت(csp) بنویسم. اما نمی دونم چه طوری باید گراف محدودیت شو پیاده سازی کنم. ممنون می شم اگه راهنماییم کنید

mehdinajafinia ۱۱-۲۳-۱۳۸۹ ۱۲:۱۲ بعد از ظهر

نقل قول:

نوشته اصلي بوسيله sahar68 (پست 15846)
سلام از تمامی کسانی که تو این تاپیک زحمت کشیدند خیلی تشکر می کنم
من می خوام n وزیرو با روش ارضای محدودیت(csp) بنویسم. اما نمی دونم چه طوری باید گراف محدودیت شو پیاده سازی کنم. ممنون می شم اگه راهنماییم کنید


hi
bebinid har vaziri dar har soton hadafi dare hamon makanesh dar har soton mishe
yek nod.
dar in cod taarif makanharo darim
Variables: { Q1, Q2, Q3, Q4 }

Domain: { (1, 2, 3, 4), (1, 2, 3, 4), (1, 2, 3, 4), (1, 2, 3, 4) }

Constraints: Alldifferent( Q1, Q2, Q3, Q4 ) and
for i = 0...n and j = (i+1)...n, k = j-i, Q[i] != Q[j] + k and Q[i] != Q[j] - k.



va in algoritm ke baray javab har khane ast bedast miayad ke badan yek csp ast.
khat be khatam tozihesh dadam.

min-conflicts(csp, max):
initial := complete assignment ;jamiyate avaliye
for 1..max do: ;az 1 .. akharin khane
if initial is a solution: ;if jamiyate tolide javab bod
return initial ;barmigardanad
var := nextVar() ;da ghire indorat yek motaghair be jelo
value := leastConflicts( var ) ;taeein meghdar
var := value in initial ;gharar dadan meghdar dar motaghair
return failure ;bargash be ebtedaye algoritm



inam chandta file pdf ke ke be tartib rajebe Constraint Graph.
hame chizo to pdf sharh dade az dast nadahid.

http://www.cs.toronto.edu/~fbacchus/Presentations/CSP-BasicIntro.pdf

http://www.iiia.csic.es/~pedro/CSP-Introduction.pdf

http://www.cs.uwaterloo.ca/~jhoey/teaching/cs486/asst1.pdf

http://cse.unl.edu/~choueiry/F09-896-004/Homework/homework4.pdf


dar nahayad 2ta pic az backtracking
http://www.4c.ucc.ie/web/outreach/backtracking.jpg


forwardchecking

http://www.4c.ucc.ie/web/outreach/forwardchecking.jpg

by

narsis2090 ۰۲-۲۴-۱۳۹۰ ۰۱:۲۸ بعد از ظهر

سلام میشه سورس هشت وزیر به روش بازگشتی در سی شارپ رو بده سریع

fmahdi ۰۲-۲۶-۱۳۹۰ ۱۰:۴۵ قبل از ظهر

1(ها)ضميمه
سلام من این معمای هشت وزیر رو با C# نوشتم.
البته خیلی تعداد خطوطش زیاد شده .
اما به هر حال میازرم برا دانلود.
این برنامه رو با switch-case نوشتم.
:18:

adina ۰۲-۲۶-۱۳۹۰ ۱۱:۵۹ قبل از ظهر

با سلام من برنامه ی 8 وزیرو به زبان سی شارپ می خوام ..خیلی عجله دارم مرسی

m.shh ۰۳-۱-۱۳۹۰ ۰۹:۲۹ قبل از ظهر

با الگوریتم ژنتیک
 
نقل قول:

نوشته اصلي بوسيله fmahdi (پست 18446)
سلام من این معمای هشت وزیر رو با c# نوشتم.
البته خیلی تعداد خطوطش زیاد شده .
اما به هر حال میازرم برا دانلود.
این برنامه رو با switch-case نوشتم.
:18:

ببخشید این را با الگوریتم ژنتیک نوشتی؟
ضروریه

fmahdi ۰۳-۱-۱۳۹۰ ۱۱:۴۲ قبل از ظهر

نه...:103:

iAchilles ۰۳-۲-۱۳۹۰ ۰۱:۵۶ بعد از ظهر

نقل قول:

نوشته اصلي بوسيله Reyhane (پست 2953)
و این هم برنامه ی NQueen که n رو از کاربر می خواد و بعد تمام جوابهای موجود رو چاپ میکنه!:D
با TC اجرا ميشه;)

با سلام خدمته دوستان و اساتید ...

دوستان اگه میشه لطف کنن این برنامه رو که با c++ نوشته شده و در پست بالا گزاشته شده بود
(لینک دانلود برنامش : http://artificial.ir/intelligence/at...585-nqueen-zip )

توضیح بدن اصلا طرف چی کار کرده ... تقریبا یه توضیح خط به خط ..

واقعا خیلی خیلی ممنون میشم اگه کسی برام توضیح بده
یک دنیا ممنون میشم !!


زمان محلي شما با تنظيم GMT +3.5 هم اکنون ۰۲:۴۸ بعد از ظهر ميباشد.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.1.0 ©2007, Crawlability, Inc.