در نظریه گراف، **الگوریتم کراسکال** الگوریتمی برای یافتن یک زیرگراف فراگیر همبند با کمترین وزن در یک گراف وزن‌دار است (در یک گراف وزن دار، به هر یال وزنی نسبت داده شده‌است). همچنین این الگوریتم برای یافتن کوچکترین درخت فراگیر در یک گراف وزن دار استفاده می‌شود.

به عنوان مثال فرض کنید یک شبکه راه آهن که تعدادی شهر را به یکدیگر متصل می‌کند در دست احداث است می‌خواهیم با داشتن هزینه{\displaystyle {c\_{ij}}} مربوط به احداث خط مستقیم بین شهرهای {\displaystyle {v\_{i}},{v\_{j}}} شبکه را طوری طراحی کنیم که مجموع هزینه‌های ساخت به کمترین مقدار خود برسد. با در نظر گرفتن هر شهر به عنوان یک راس از گراف وزن دار با وزن‌های {\displaystyle w({v\_{i}},{v\_{j}})={c\_{ij}}} مسئله به یافتن یک زیر گراف فراگیر همبند با کمترین وزن در یک گراف منجر می‌شود.

فرض کنید وزن‌ها نامنفی هستند بنابراین می‌توانیم تصور کنیم که زیر گراف فراگیر با کمترین وزن یک درخت فراگیر T از G است حال الگوریتم زیر را برای این کار ارائه می‌دهیم.

الگوریتم کراسکال
----------------

1. یال پیوندی{\displaystyle e\_{1}} را طوری انتخاب کن که وزن آن کوچکترین مقدار موجود باشد.
2. اگر یال‌های {\displaystyle {e\_{i}},{...}{e\_{2}},{e\_{1}}} انتخاب شده‌اند یال{\displaystyle {e\_{i+1}}} را از میان{\displaystyle E-\{{e1},{e\_{2}},{...},{e\_{i}}\}} به گونه‌ای انتخاب کن که:
	* زیرگراف با یال‌های {\displaystyle {e\_{1}},{e\_{2}},{...},{e\_{i+1}}} بدون دور باشد.
	* از میان یال‌های مشمول شرط (الف) وزن {\displaystyle {e\_{i+1}}} دارای کمترین مقدار ممکن باشد.
3. در صورتی که مرحله ۲ دیگر قابل اجرا نیست توقف کن.

برنامهٔ Graph Explorer
----------------------

نمونه‌ای از خروجی برنامه:

Kruskal algorithm

مثال
----

| تصویر | توضیحات |
| --- | --- |
|  | یال‌های **AD** و **CE** کوتاه‌ترین یال‌های گراف هستند با طول ۵، یال **AD** به‌طور دلخواه انتخاب می‌شود، که به رنگ سبز نشان داده شده‌است. |
|  | حالا **CE** کوتاه‌ترین یال است با طول ۵، در صورت انتخاب **CE** دور ایجاد نمی‌شود، پس یال **CE** به عنوان دومین یال درخت فراگیر انتخاب می‌شود. |
|  | یال بعدی که باید انتخاب شود یال **DF** می‌باشد با طول ۶. |
|  | در این مرحله کوتاه‌ترین یال‌ها **AB** و **BE** می‌باشند با طول ۷، در اینجا یال **AB** را به‌طور دلخواه برمی‌گزینیم. یال **BD** که در تصویر به رنگ قرمز نشان داده شده‌است، به این معنی است که در انتخاب‌های بعدی نمی‌توان این یال را انتخاب نمود، زیرا انتخاب این یال باعث ایجاد دور(**ABD**) در درخت فراگیر می‌شود. |
|  | در ادامه، کوتاه‌ترین یال بعدی یعنی **BE** انتخاب می‌شود با طول ۷. در این مرحله یال‌های **BC** و **DE** و **FE** با رنگ قرمز نشان داده شده‌اند زیرا انتخاب هرکدام موجب ایجاد دور می‌شود. |
|  | سرانجام الگوریتم با انتخاب یال **EG** با طول ۹ پایان می‌پذیرد و درخت پوشای کمینه ایجاد می‌شود. |

اثبات
-----

ثابت می‌کنیم هر درخت فراگیر U با یال‌های {\displaystyle {e\_{1}},{e\_{2}},{...},{e\_{v-1}}} که با الگوریتم کراسکال ساخته شود یک درخت بهینه‌است.

*از طریق تناقض*: به ازای هر درخت فراگیر T از G به غیر از U کوچکترین مقدار i را به طوری که {\displaystyle {e\_{i}}} در T نباشد باf(t) نمایش می‌دهیم.
اکنون فرض کنید که U یک درخت بهینه نباشد و T را به عنوان درخت بهینه در نظر بگیرید که در آنf(t) دارای بزرگترین مقدار ممکن باشد. فرض کنید {\displaystyle f(t)=k} این بدان معنی است که {\displaystyle {e\_{k-1}},{...},{e\_{2}},{e\_{1}}} هم در T و هم در U هستند؛ ولی {\displaystyle {e\_{k}}} در T نیست پس شامل یک دور یکتای C می‌باشد. فرض کنید {\displaystyle {{e^{'}}\_{k}}} یالی از C باشد که در T هست ولی در U نیست. پس {\displaystyle {{e^{'}}\_{k}}}یال برشی ازT+{\displaystyle {e\_{k}}} نیست؛ بنابراین {\displaystyle {T^{'}}=(T+{e\_{k}}-{{e^{'}}\_{k}})} یک گراف همبند با {\displaystyle v-1} یال بوده در نتیجه درخت فراگیر دیگری برای G خواهد بود. روشن است که:

{\displaystyle w({T^{'}})=w(T)+w({e\_{k}})-w({{e^{'}}\_{k}})}

ولی در الگوریتم کراسکال {\displaystyle {e\_{k}}} به عنوان یالی با کمترین وزن طوری انتخاب شده‌است که زیرگراف G با یال‌های {\displaystyle {e\_{k}},{...},{e\_{2}},{e\_{1}}} بدون دور باشد. چون زیرگراف G با یال‌های {\displaystyle {{e^{'}}\_{k}},{...},{e\_{2}},{e\_{1}}} زیر گرافی از T است. بنابرین ان هم بدون دور است و نتیجه می‌گیریم که:

{\displaystyle w({{e^{'}}\_{k}})} ≥ {\displaystyle w({{e}\_{k}}),}

پس

{\displaystyle w({T^{'}})} ≤ {\displaystyle w({T}),}

پس {\displaystyle {T^{'}}} هم یک درخت بهینه خواهد بود در صورتی که داریم:

{\displaystyle f({T^{'}})>k=f(T)}

که این با T انتخاب در تناقض است. بنابرین {\displaystyle T=U} و در نتیجه{\displaystyle U} یک درخت بهینه‌است.

شبه کد الگوریتم کراسکال
-----------------------

مسئله:یک درخت پوشای می نیمم مشخص کنید.

ورودی:عدد صحیح n>=۲، عدد صحیح مثبت m و یک گراف بدون جهت و وزن دار و متصل شامل n گره و m یال. گراف با یک مجموعه E که شامل یال‌های گراف همراه با وزن‌های آن‌ها است نشان داده می‌شود

خروجی:مجموعه‌ای از یال‌ها F در یک درخت پوشا مینیمم

```
* Void kruskal (int n , int m ,
* set _of_edges E,
* set_of_edges & F)
* {
* index i, j;
* Set_pointer p , q ;
* edge e;
* Sort the m edges in E by weight in nondecreasing order ;
* F=∅;
* initial(n);          //زیر مجموعه غیر الحاقی n مقدار دهی
* While(number of edges in F is less than n-1){
* e= edge with least weight not yet considered;
* i, j = indices of vertices connected by e ;
* p=find(i);
* q=find(j);
* if(!equal(p,q)){
* merge(p,q);
* add e to F ;
* }
* }
* }

```

هرگاه n-1 یال در F وجود داشته باشد، از حلقه whileخارج می‌شویم؛ زیرا در اینصورت، n-1 یال در یک درخت پوشا وجود خواهد داشت

```
void sort(struct krus ed[],int m)
{
  struct krus temp;
  for (int i=۰;i<m;i++)
  for (int j=i+1;j<m;j++)
  if (ed[j].weight<ed[i].weight)
  {
  temp=ed[i];
  ed[i]=ed[j];
  ed[j]=temp;
  }
}

```

منابع
-----

* نظریه گراف‌ها و کاربردهای آن، جی.ای. باندی و یو.اس.ار. مورتی. مترجم حمید ضرابی زاده، مؤسسه فرهنگی دیباگران تهران، ۱۳۷۸
* 

| * ن
* ب
* و
بهینه‌سازی: تئوری، روش‌ها، و ابتکارها |
| --- |
| 

| برنامه‌سازی نامقید غیرخطی: روش‌ها با استفاده از |
| --- |
| 

|  |  |
| --- | --- |
| … تابع‌ها | 
* Golden section search
* Interpolation methods
* Line search
* روش نلدر - مید
* Successive parabolic interpolation

 |
| … و گرادیان‌ها | 

|  |  |
| --- | --- |
| Convergence | 
* Trust region
* Wolfe conditions

 |
| Quasi–Newton | 
* روش بی‌اف‌جی‌اس and L-BFGS
* DFP
* Symmetric rank-one (SR1)

 |
| Other methods | 
* Gauss–Newton
* Gradient
* الگوریتم لونبرگ-مارکارد
* Conjugate gradient

 |

 |
| … و هشین‌ها | 
* Newton's method

 |

 |

 | The graph of a strictly concave quadratic function is shown in blue, with its unique maximum shown as a red dot. Below the graph appears the contours of the function: The level sets are nested ellipses.Optimization computes maxima and minima. |
| 

| برنامه‌سازی مقید غیرخطی |
| --- |
| 

|  |  |
| --- | --- |
| کلی | 
* Barrier methods
* روش پنالتی

 |
| مشتق‌پذیر | 
* Augmented Lagrangian methods
* Sequential quadratic programming
* Successive linear programming

 |

 |

 |
| 

| بهینه‌سازی محدب |
| --- |
| 

|  |  |
| --- | --- |
| بهینه‌سازی محدب | 
* Cutting-plane method
* Reduced gradient (Frank–Wolfe)
* Subgradient method

 |
| برنامه‌ریزی خطی ودرجه دو | 

|  |  |
| --- | --- |
| برنامه‌ریزی خطی | 
* Ellipsoid algorithm of Khachiyan
* الگوریتم کارمارکار

 |
| Basis-الگوریتم حریصانه | 
* الگوریتم غیر مرکب
* Revised simplex algorithm
* Criss-cross algorithm
* Principal pivoting algorithm of Lemke

 |

 |

 |

 |
| 

| بهینه‌سازی ترکیبیاتی |
| --- |
| 

|  |  |
| --- | --- |
| الگو‌ها | 
* الگوریتم تقریبی
* برنامه‌ریزی پویا
* الگوریتم حریصانه
* بهینه‌سازی خطی عدد صحیح
	+ شاخه و حد یا شاخه و برش

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

|  |  |
| --- | --- |
| درخت پوشای کمینه | 
* الگوریتم بلمن–فورد
* الگوریتم بروکا
* الگوریتم دیکسترا
* الگوریتم فلوید-وارشال
* الگوریتم جانسون
* الگوریتم کراسکال

 |

 |
| شبکه شاره | 
* الگوریتم دینیک
* الگوریتم ادموندز کارپ
* الگوریتم فورد–فالکرسون
* الگوریتم ارسال-برچسب

 |

 |

 |
| 

| الگوریتم‌های فراابتکاری |
| --- |
| 
* الگوریتم تکاملی
* الگوریتم تپه‌نوردی
* الگوریتم جستجوی محلی (بهینه‌سازی)
* الگوریتم تبرید شبیه‌سازی شده
* الگوریتم جستجوی ممنوعه

 |

 |
| 
* **رده‌ها**
	+ روش‌ها
	+ ابتکارها
* **نرم‌افزارها**

 |