برنامه نویسی

پنجشنبه 5 خرداد 1390

گراف دو بخشی

نویسنده: hadi gorbanalizadeh   

مفهوم شهودی

فرض کنید در یک شرکت صنعتی تعدادی شغل بدون متصدی می باشند و تعدادی متقاضی برای این مشاغل اعلام آمادگی نموده اند. حال این سوال مطرح می‌شود که آیا می توان به هر متقاضی شغلی متناسب او اختصاص داد؟ برای حل چنین مسئله ای که به مسئلهٔ تخصیص موسوم است، با استفاده از گراف می توان وضعیت‌های خاص را پیاده سازی نمود. بدین ترتیب که گروهی که متقاضی مشاغل هستند در مجموعه ای به نام X و مجموعه مشاغل بدون متصدی را در مجموعه ای به نام Y قرار می دهیم. گراف رسم شده چنین است که به بعضی از اعضای مجموعه X یک یا چند عضو از مجموعه Y توسط یال‌ها وصل می نماید. به عبارت دیگر گراف بوجود امدی دارای یالهای xy است که مر متقاضی x را از مجموعه X به شغلهای مناسب y از مجموعه Y متصل می نماید. به عبارت دقیقتر هیچ دو راس متعلق به مجموعه X(متفاضیان) یا هیچ دو راس متعلق به مجموعه Y(مشاغل) توسط هیچ یالی به هم متصل نمی باشند. چنین گرافی را گراف دوبخشی یا دوپارچه می گویند.

تعریف

گراف دوبخشی گرافی است که بتوان مجموعه رئوس آن را به دو مجموعه X و Y چنان افراز نمود که هر یال آن دارای یک انتها در X و یک انتها در Y باشد، به گونه ای که هیچ دوراسی در X یا در Y با هم مجاور نباشند. چنین افرازی را دوبخشی کردن گراف می نامند.

  • یادآوری: منظور از افراز یک مجموعه چون A به چند مجموعه، تقسیم مجموعه A به چند مجموعه ناتهی دیگر است که باهم اشتراکی نداشته باشند و اجتماع همه آنها برابر مجموعه A باشد. و در اینجا اگر V به عنوان مجموعه رئوس باشد افراز V به دو مجموعه X و Y (ناتهی) به این صورت است که: X\bigcupY = V و X\bigcapY = \varnothing
  • مثال

به عنوان مثال گراف زیر یک گراف دو بخشی است:

مثالی از یک گراف دو بخشی

 گراف ساده

گراف ساده: هر گراف G زوج مرتبی مانند (V,E) است که در آن V مجموعه‌ای متناهی و ناتهی است و E زیرمجموعه‌ای از تمام زیرمجموعه‌های دو عضوی V می‌باشد. اعضای V را رأسهای G و اعضای E را یالهای G می‌نامیم. به بیان ساده تر بین دو رأس یک گراف ساده حداکثر یک یال وجود دارد.

 گراف همیلتونی

 گراف چرخ

هر گراف G که دارای n راس باشد کهn≥۴ و یکی از رئوس از درجهٔ n-۱ و بقیه از درجهٔ سه باشند، را یک گراف چرخ می نامیم- مانند مثال‌های زیر:




گراف چرخn راسی را با nW نمایش می دهیم.



 گراف چندگانه

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

 گراف مکعبی

یک گراف «k مکعب» (k-Cube) گرافی است که رئوس آنk تایی از «صفر» و «یک» هستند که دو رأس آن به یکدیگر متصل هستند اگر و فقط اگر دو رأسشان دقیقاً در یک مؤلفه با یکدیگر تفاوت داشته باشند. به‌عبارت دیگر اگر kعددی طبیعی باشد منظور از « kمکعب» گرافی است که رأس‌های آن همهٔ دنباله‌های رقمی از «صفر» و «یک» هستند و دو رأس در این گراف مجاور بوده هرگاه دنباله‌های متناظرشان دقیقاً در یک مؤلفه اختلاف داشته باشند (شکل ۱).




می‌توان نشان داد که یک گراف «k مکعب» (k-Cube) دارای ویژگی‌هایی نظیر ذیل است:

  1. تعداد رؤوس =۲k
  2. تعداد یال‌ها=k*۲(k-۱)
  3. گرافی «دوبخشی» (Bipartite) است.

 گراف جهت دار

گراف جهت دار: هر گراف G زوج مرتبی مانند (V,E) است که در آن V مجموعه‌ای متناهی و ناتهی است و E زیرمجموعه‌ای از مجموعهٔ تمام زوج مرتب‌های متشکل از اعضای V است.

 گراف جهتدارو کاربردهای آن

گراف جهت دارو کاربردهای آنگراف جهت دار D، یک سه تایی مرتب( O(D) و A(D) و ( V(D)است که تشکیل شده از یک مجموعه ناتهی V(D) از راسها ویک مجموعه (D) A مجزای از V(D)از کمانها و یک تابع وقوع O(D)که به هر کمان D یک زوج مرتب از راسهای D- که الزاماً متمایز نیستند- را نسبت میدهد. اگر a یک کمان وu,v دو راس باشند به طوری که(u,v) =(a)O (D)، آنگاه میگوئیم که u,a را به v وصل کرده است؛ u، دم v,a سرa نامیده می شود.

 گراف مسطح

گراف مسطح: گراف مسطح گرافی است که می‌توان آن را در یک صفحه محاط کرد به گونه‌ای که یال‌هایش یکدیگر را تنها در راس‌ها قطع کنند.

[ویرایش] گراف وزن دار

گراف وزن دار: در یک گراف وزن دار، به هر یال یک وزن (عدد) نسبت داده می‌شود. معمولاً اعداد حقیقی به عنوان وزن یال‌ها استفاده می‌شوند. اما بسیاری از الگوریتم‌های پر کاربرد فقط برای گراف‌هایی که دارای وزن صحیح یا مثبت هستند طراحی شده‌اند.

 خصوصیات گراف‌های خاص

  • اگر درجهٔ همهٔ راس‌ها در گراف ساده با هم برابر و برابر بزرگترین درجهٔ ممکن (یعنی p-۱ ) باشد، گراف مورد نظر منتظم کامل است. در این گونه گراف‌ها، رابطهٔ میان رأس‌ها و یال‌ها چنین است:
q=p(p-1)/2 \!
که در آن p \! تعداد راسها، و q \! تعداد یالها است.
  • اگر گراف همبند باشد (یعنی از هر نقطه بتوان به یک نقطه دلخواه دیگر رسید) ولی دور نداشته باشد (یعنی هیچ نقطه‌ای از دوراه به نقطهٔ بعدی نرسد) می‌گویند گراف درختی است. در اینگونه گراف‌ها فرمول زیر صدق می‌کند (شرط لازم):
p=q+1 \!
که در آن p \! تعداد رأس‌ها، و q \! تعداد یال‌ها است.[۲]
  • گراف اویلری و همیلتونی:گاهی اوقات ما می‌خواهیم در یک گراف حرکت کنیم.به اینصورت که از راسی به راسی دیگر برویم.در اینصورت ممکن است برای ما مهم باشد که از روی یال یا راس تکراری حرکت نکنیم(مشابه مسالهٔ فروشندهٔ دوره گرد).این مساله در صرفه جویی زمان و هزینه هم مهم است.(یعنی مبحث بهینه سازی).دراینجا دو موضوع گرافهای اویلری(دور زدن در گراف بدون یال تکراری)و همیلتونی(دور زدن بدون راس تکراری) مطرح می‌شود.براحتی می‌توان بررسی کرد که راسهای گراف اویلری باید درجهٔ زوج داشته باشند.اما اینکه شرایط کامل لازم و کافی برای همیلتونی بودن یک گراف چیست هنوز حل نشده مانده‌است.

الگوریتم‌های مهم

 الگوریتم کراسکال(kruskal)

 کد برنامه به زبان C

void kruskal()
{
int i, m, V, E;    
struct edge
{ char v1, v۲; int w; };
struct edge e[maxE];
PQ pq(maxE); EQ eq(maxE);
cin >> V >> E;
for (i = ۱; i <= E; i++)
cin >> e[i].v۱ >> e[i].v۲ >> e[i].w;
for (i = ۱; i <= E; i++)
pq.insert(i, e[i].w);
for (i = ۰; i < V-۱; )
{
if (pq.empty()) break; else m = pq.remove();
if (eq.find(index(e[m].v1),index(e[m].v2),۱))
{ cout << e[m].v۱ << e[m].v۲ << ' '; i++; };
}
}

 الگوریتم پریم(prim)

 کد برنامه به زبان C

int testForPrime (int n) {
int p, i;
p = ۱;
i = ۳;
int result = n;
while (i < result) {
result = n / i;
if (n == i * result) {
p = ۰;
i = n;
}
i = i + ۲;
}
return (p);
}

int main (int argc, char * const argv[]) {
int p, i, n;
i = ۳;
n = ۵;
std::cout << «Initiating prime number generation sequence...\n\n۱: ۲\n۲: ۳\n»;
while (۱) {
p = testForPrime (n);
if (p == ۱) {
std::cout << i << «: » << n << «\n»;
i++;
}
n = n + ۲;
}
return ۰;
}[/align] 

 الگوریتم فلوید-وارشال(الگوریتم کوتاهترین مسیر)

 کد برنامه به زبان C

#include <stdio.h>
#include <conio.h>
void floyd(int cost[۴][۴],int p[۴][۴],int a[۴][۴]);
int cost[۴][۴];
int p[۴][۴];
int a[۴][۴];
int n=۴;
main()
{  int i,j;
        for(i=۰;i<n;i++)
                for(j=۰;j<n;j++)
                        {
                                printf(«Please Enter cost[٪d][٪d] = »,i,j);
                                scanf(«٪d»,&cost[i][j]);
                        }
        floyd(cost,p,a);
        printf(«\n\nArray A = \n»);
        for(i=۰;i<n;i++)
        {  printf(«\n»);
                for(j=۰;j<n;j++)
                        {
                                printf(«  ٪d  »,a[i][j]);
                        }
        }
        printf(«\n\nArray P = \n»);
        for(i=۰;i<n;i++)
        {  printf(«\n»);
                for(j=۰;j<n;j++)
                        {
                                printf(«  ٪d  »,p[i][j]);
                        }
        }
        getch();
        return ۰;
}
void floyd(int cost[۴][۴],int p[۴][۴],int a[۴][۴])
{
        int i,j,k;
        for (i=۰;i<n;i++)
                for (j=۰;j<n;j++)
                {
                        a[i][j] = cost[i][j];
                        p[i][j]=-۱;
                }
        for (k=۰;k<n;k++)
                for (i=۰;i<n;i++)
                        for (j=۰;j<n;j++)
                                if (a[i][k] + a[k][j] < a[i][j])
                                        {
                                                a[i][j] = a[i][k] + a[k][j];
                  p[i][j] = k;
                                        }
}

 گراف‌های کاربردی

گراف بازه‌ها

 کاربردها

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

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

کاربرد گراف بازه‌ها از گراف‌ها برای حل مسایل زیادی در ریاضیات و علوم کامپیوتر استفاده میشود. ساختارهای زیادی را میتوان به کمک گراف‌ها به نمایش در آورد.

درخت و ماتریس درخت در رشته‌های مختلفی مانند شیمی مهندسی برق و علم محاسبه کاربرد دارد . کیرشهف در سال ۱۸۴۷ میلادی هنگام حل دستگاههای معادلات خطی مربوط به شبکه‌های الکتریکی درختها را کشف و نظریه درختها را بارور کرد. کیلی در سال ۱۸۵۷ میلادی درختها را در ارتباط با شمارش ایزومرهای مختلف هیدروکربنها کشف کرد وقتی مثلا میگوییم در ایزومر مختلف c4h۱۰ وجود دارد منظورمان این است که دو درخت متفاوت با ۱۴ راس وجود دارند که درجه ۴ راس از این ۱۴ راس جهار و درجه هر یک از ۱۰ راس باقیمانده یک است. اگر هزینه کشیدن مثلا راه آهن بین هر دو شهر ازp شهر مفروض مشخص باشد ارزانترین شبکه ای که این p شهر را به هم وصل می‌کند با مفهوم یک درخت از مرتبه p ارتباط نزدیک دارد. به جای مساله مربوط به راه آهن میتوان وضعیت مربوط به شبکه‌های برق رسانی و لوله کشی نفت و لوکشی گاز و ایجاد کانالهای آبرسانی را در نظر گرفت . برای تعیین یک شبکه با نازلترین هزینه از قاعده ای به نام الگوریتم صرفه جویی استفاده می‌شود که کاربردهای فراوان دارد. از گرافها می توان به عنوان کدهای کمکی نام برد که به DVB Player‌ها در بالا بردن قابلیت‌های آنها کمک میکنند. گراف‌ها دارایی مزایای مختلفی هستند که شفاف تر کردن و واضحتر کردن تصویر و کاهش مصرف CPU به عنوان یکی از اصلی‌ترین مزایای آنها بشمار می رود.

نظرات() 
z
دوشنبه 2 بهمن 1391 12:04 ب.ظ
سلام
من سرس برنامه ای كه گراف را بگیرد و تشخیص دهد همیلتونی است یا اویلری می خوام
لطفا كمك كنید

آمار وبلاگ

  • کل بازدید :
  • بازدید امروز :
  • بازدید دیروز :
  • بازدید این ماه :
  • بازدید ماه قبل :
  • تعداد نویسندگان :
  • تعداد کل پست ها :
  • آخرین بازدید :
  • آخرین بروز رسانی :

شبکه اجتماعی فارسی کلوب | Buy Website Traffic | Buy Targeted Website Traffic