| پیمایش گراف و پیمایش درخت |
| --- |
| هرس آلفا بتا
A\*
الگوریتم \*B
الگوریتم جستجوی بیم
الگوریتم بلمن–فورد
جستجوی ابتدا بهترین
جستجوی دوجهته
الگوریتم جستجوی اول سطح
D\*
الگوریتم جستجوی عمق اول
جستجوی عمق محدود
الگوریتم دیکسترا
الگوریتم فلوید-وارشال
الگوریتم تپه‌نوردی
جستجوی عمق اول عمیق‌کننده تکراری
الگوریتم جانسون
*رده:الگوریتم‌های جستجو* |
| 
جستار وابسته |
| برنامه‌ریزی پویا |
| * ن
* ب
* و
 |

**الگوریتم بلمن-فورد** الگوریتم پیمایش گراف است که مسئلهٔ کوتاهترین مسیر از مبدأ واحد را برای گراف‌های وزن‌داری که وزن یال‌ها ممکن است منفی باشد حل می‌کند.

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

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

چگونه کار می‌کند؟
-----------------

ساختار اصلی الگوریتم بلمن-فورد مشابه الگوریتم دایکسترا است. اجرای الگوریتم 1-|V| دنبالهٔ {\displaystyle d} چنان تعریف می‌شود که برای هر رأس {\displaystyle v}، مقدار {\displaystyle d\_{v}} در پایان مرحلهٔ {\displaystyle i}ام برابر وزن کوتاهترین گذر از مبدأ به {\displaystyle v} است با این شرط اضافه که تعداد یال‌های این گذر حداکثر {\displaystyle i} باشد. بنابراین در پایان مرحلهٔ (1-|V|)ام {\displaystyle d\_{v}} برابر وزن کوتاهترین مسیر از مبدأ به {\displaystyle v} خواهد بود (در واقع چون دور با مجموع وزن منفی نداریم، کوتاهترین گذر با حداکثر 1-|V| یال از مبدأ به {\displaystyle v}، همان کوتاهترین مسیر از مبدأ به {\displaystyle v} در گراف خواهد بود).

اساس کار الگوریتم آزادسازی (Relaxation) همهٔ یال‌های گراف در هر مرحله‌است. آزادسازی یال {\displaystyle (u,v)} به این معناست که اگر {\displaystyle d\_{u}+weight(u,v)<d\_{v}} آنگاه قرار می‌دهیم {\displaystyle d\_{v}=d\_{u}+weight(u,v)}. با این اوصاف اگر آزادسازی همهٔ یال‌ها را برای بار |V|ام هم تکرار کنیم و بعد از این مرحله هم دنبالهٔ {\displaystyle d} تغییر کند، آنگاه می‌توان نتیجه گرفت که گراف دور منفی‌ای دارد که از مبدأ قابل دست‌یابی است. بنابراین الگوریتم بلمن-فورد توانایی تشخیص دور منفی را نیز دارد.

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

همانطور که گفته شد الگوریتم بلمن-فورد توانایی تشخیص دور منفی را نیز دارد. بنابراین الگوریتم را به گونه‌ای پیاده‌سازی می‌کنند که در صورت تشخیص دور منفی مثلاً مقدار بولی True برگرداند.

### پیاده‌سازی

یک پیاده‌سازی نوعی به این شرح است:

```
 1  **Algorithm** Bellman-Ford(G,s)
 2  **Input** : G=(V,E), s(the source vertex)
 3  **Output** : Sequence d and a boolean return value
 4  **begin**
 5      **for** all vertices w **do**
 6          {\displaystyle d\_{w}} = {\displaystyle \infty }
 8      {\displaystyle d\_{s}} = 0
 9      **for** i = 1 **to** |V|-1 **do**
10          **for** all edge (u,v) in E **do**
11              **if** {\displaystyle d\_{u}+weight(u,v)<d\_{v}} **then**
12                  {\displaystyle d\_{v}} = {\displaystyle d\_{u}+weight(u,v)}
13      **for** all edge (u,v) in E **do**
14          **if** {\displaystyle d\_{u}+weight(u,v)<d\_{v}} **then**
15              **return False**
16      **return True**
17  **end**
```

### اثبات درستی

می توان درستی را با استفاده از استقرای ریاضی نشان داد. 

**لم**. بعد از *i* بار تکرار حلقه: 

* اگر (Distance(u بی نهایت نباشد، برابر است با فاصله ی مسیری از s به u.
* اگر مسیری از s به u با حداکثر i یال وجود داشته باشد آنگاه (Distance(u حداکثر i یال دارد و طول کوتاه‌ترین مسیر از s به u است.

**اثبات**. 
ابتدا حالت پایه استقرا را در نظر بگیریم که در آن `i=0`. در این حالت `source.distance = 0` که درست است. به ازای تمامی گره‌های غیر از مبنا *u* داریم `u.distance = **infinity**` که درست است؛ چون که هیچ مسیری از مبنا به این گره‌ها با طول مسیر صفر وجود ندارد. 

ابتدا قسمت اول را اثبات می کنیم. 
با فرض استقرا فرض کنیم `u.distance` طول مسیری از مبنا به *u* باشد. در اینصورت `u.distance + uv.weight` طول مسیری از مبنا به *v* است. 

برای قسمت دوم، طول کوتاه‌ترین مسیر از مبنا به *u* با حداکثر تعداد i یال را در نظر بگیریم. فرض کنیم *v* گرهی قبل از *u* در طول این مسیر باشد، در اینصورت کوتاه‌ترین مسیر به *v* با تعداد i-1 یال است. بنابه فرض استقرا بعد از i-1 تکرار حلقه، کوتاه‌ترین مسیر تا *v* حداکثر به طول همین مسیر است(با i-1 یال). در اینصورت چون در *i*-امین تکرار حلقه `uv.weight + v.distance` با `u.distance` مقایسه می‌شود حتماً کوتاه‌ترین مسیر با تعداد i یال در i امین تکرار پیدا خواهد شد. 

توجه کنید که در چنین درختی که مسیر شامل حلقه نداریم، حداکثر طول مسیر برابر با {\displaystyle |V|-1} است. لذا الگوریتم مورد نظر بعد از اتمام جواب بهینه را به‌دست خواهد داد.

### پیچیدگی زمانی

مشخص است که در {\displaystyle |V|-1} مرحله، در هر مرحله {\displaystyle |E|} عملیات بر روی یال‌ها انجام می‌شود. پس {\displaystyle O(|V|\times |E|)} پیچیدگی زمانی الگوریتم بلمن-فورد خواهد بود.

برنامه‌های مورد استفاده در مسیر یابی
------------------------------------

انتشارات مختلفی از الگوریتم بل من فورد در پروتکل Distance vector routing مورد استفاده قرار گرفته بود. برای مثال پروتکل RIP یکی از الگوریتم‌هایی است که انتشار یافته‌است چون تعدادی از گره‌ها (مسیر یاب ها) را با یک سیستم خود مختار درگیر می‌کند. یک مجموعه شبکه IP که معمولاً به وسیلهٔ یک ISP مالکیت می‌شود شامل این گام‌ها می‌شود:
۱- هر گره مسافت بین خودش و تمام گره‌هایی که در داخل AS اند را محاسبه می‌کند و در جدولی اطلاعات را ذخیره می‌کند .
۲- هر گره جدول اش را به تمام نودهای مجاورش ارسال می‌کند.
۳- وقتی یک گره جدول مسافت را از گره مجاور خودش دریافت می‌کند، کوتاهترین مسیرها را به تمام بقیه گره‌ها محاسبه می‌کند و جدول خودش را برای بازتاب تغییرات بروز می‌کند.
اشکال اصلی الگوریتم بل من فورد در این تنظیمات عبارتست از :
- به‌خوبی مقیاس (نسبت) نمی‌کند.
- تغییر در توپولوژی شبکه به سرعت انعکاس داده نمی‌شود چون آپدیت شدن گره به گره منتشر می‌شود.
- محاسبه تا بی‌نهایت ( اگر لینک یا گره در انتقال به یک گره غیرقابل دسترس از بعضی از مجموعه دیگر گره‌ها شکست بخورد، آن گره‌ها ممکن است برای همیشه به تدریج تخمین مسافتشان به آن گره افزایش پیدا کند و در ضمن ممکن است مسیر loop باشد.)

توسعه YEN
---------

در انتشار سال ۱۹۷۰، Jin.Y.Yen یک توسعه از الگوریتم بل من فورد را برای گراف بدون حلقه با وزن منفی تشریح کرد. توسعه Yen ابتدا کمی نوبت خطی انحصاری بر روی تمام رئوس و بعد تمام قسمت‌های مجموعه تمام یال‌ها در یکی از ۲ زیر مجموعه نشان داد. اولین زیر مجموعه Ef۱ شامل تمام رئوس (Vi،Vj) که i<j و دومین مجموعه، Eb شامل یال‌های (Vi،Vj) که i<j است. هر راس که در ترتیب v۱، v۲، ...، v|V|، ملاقات می‌شود را کم می‌کند. هر خروجی یال از آن راس در Ef ثبت می‌شود. هر راس بعدی که در ترتیب v|V|، v|V|−۱، ...، v۱ ملاقات می‌شود، هر خروجی از آن راس را در Eb کم می‌کند. توسعه Yen، تأثیرگذاری بسزایی در نصف کردن تعداد مسیرهای طی شده مورد نیاز برای مسئله کوتاهترین مسیر ممکن تک منبعی داشت.

کاربردها
--------

* مسیریابی (Routing)

پیوند به بیرون
--------------

* شبیه‌سازی الگوریتم با جاوا
* پیاده‌سازی به زبان C

منابع
-----


* Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. *Introduction to Algorithms*, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7.
* Udi Manber. *Introduction to Algorithms — A Creative Approach*. MIT Press and Addison-Wesley, 1989. ISBN 0-201-12037-2.
* Donald E. Knuth. *The Art Of Computer Programming Vol 1.*, Third Edition. Addison-Wesley, 1997. ISBN 0-201-89683-4.
* Douglas B. West. *Introduction to Graph Theory*, Second Edition. Prentice Hall, 2001. ISBN 0-13-014400-2.
* Richard Bellman: On a Routing Problem, in Quarterly of Applied Mathematics, 16(1), pp. 87–90, 1958.
* L. R. Ford, Jr. D. R. Fulkerson: Flows in Networks, Princeton University Press, 1962.
* Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Section 24.1: The Bellman–Ford algorithm, pp. 588–592. Problem 24-1, pp. 614–615.
* George T. Heineman, Gary Pollice, and Stanley Selkow (2008). "Chapter 6:Graph Algorithms". Algorithms in a Nutshell. Oreilly Media. pp. 160–164. ISBN 978-0-596-51624-6.


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

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

|  |  |
| --- | --- |
| … تابع‌ها | 
* 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

 |

 |

 |

 |
| 

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

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

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

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

 |

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

 |

 |

 |
| 

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

 |

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

 |