algorythm design (6)

53
ا وی پ ی س ی و پ ه م ا ری بDynamic Programming دار ای مد ی ص- هد ش م ی س ردو ف گاه ش ی دا- م ها( ت ی ور گ ل ی ا ح را ط

Upload: vahidvs

Post on 10-Jun-2015

261 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Algorythm Design (6)

برنامه نویسی پویاDynamic Programming

طراحی الگوریتم ها - دانشگاه فردوسی مشهد - صمد پایدار

Page 2: Algorythm Design (6)

22 روش حریصانه

مطالب مورد بحث

مقدمهبررسی چند مساله نمونه

زنجیره ضرب ماتریس هاکوله پشتی صفر و یکویرایش رشته هافروشنده دوره گرد...

Page 3: Algorythm Design (6)

33 روش حریصانه

مقدمه

.شبیه روش تقسیم و حل است در تقسیم و حل مساله را به تعدادی زیرمساله

کوچکتر تقسیم می کنیم و آن زیرمسائل را حل کرده و با ترکیب جواب آنها، جواب مساله اصلی را

بدست می آوریم.یک روال باال به پایین

اگر زیرمسائل بهم مربوط باشند، معموال کارآییخیلی پایین می آید

بخاطر حل مکرر زیرمسائل مشابه ،مثال: الگوریتم فیبوناتچی مبتنی بر روش تقسیم و حل

با مرتبه زمانی نمایی

Page 4: Algorythm Design (6)

44 روش حریصانه

مقدمه

در روش پویا برای حل یک مساله باید تعدادی زیرمساله کوچکتر را حل

کنیم. تمام کوچکترین مسائل را حل می کنیم و جواب آنها را

ذخیره می کنیم. سپس به سطح بعد می رویم و تمام مسائل آن را حل می

کنیم..تمام مسائل را حل می کنیم یک تفاوت با تقسیم و حل: مثال در جستجوی دودویی تمام زیرمسائل

را حل نمی کردیم. در حل مسائل هر سطح، از جواب مسائل تمام سطح های

قبل استفاده می کنیم )عدم نیاز به محاسبه مجدد و حل مکرر(.

نهایتا به مساله اصلی می رسیم و با حل آن کار تمام میشود.

Page 5: Algorythm Design (6)

55 روش حریصانه

مقدمه

ویژگی های اغلب مسائلی که با این روشحل می شوند

برای حل یک نمونه از مساله باید تعدادی نمونهدیگر با اندازه کوچکتر را حل کرد.

موضوع بهینه سازی مطرح است. یعنی بایدبهترین جواب از بین جواب های ممکن را پیدا

کنیم.

Page 6: Algorythm Design (6)

66 روش حریصانه

مقدمه

اصل بهینگی(Principle of optimality) صدق می کند.

،اگر بدست آوردن جواب بهینه مساله اصلیمستلزم بدست آوردن جواب بهینه هر یک از زیرمسائل باشد، آنگاه اصل بهینگی در مورد

مساله صدق می کند. به بیان دیگر، جواب بهینه مساله اصلی، شامل

جواب بهینه زیرمسائل باشد.

Page 7: Algorythm Design (6)

77 روش حریصانه

مقدمه

مثال: پیدا کردن کوتاهترین مسیر بین دو بگذرد.B که از شهر C و Aشهر

باید ابتدا کوتاهترین مسیر بینA و B را پیدا کرده را نیز پیدا C و Bو سپس کوتاهترین مسیر بین

C و Aکنیم و با ترکیب آنها کوتاهترین مسیر بین را بدست آوریم.

اصل بهینگی صدق می کند به احتمال زیاد مساله را می توان به روش پویا حل کرد.

Page 8: Algorythm Design (6)

88 روش حریصانه

مقدمه

مثال: پیدا کردن بلندترین مسیر بدون حلقه ازV1 V4به

:جواب مساله [V1, V3, V2, V4]اگر مساله را به دو زیرمساله تقسیم کنیم

پیدا کردن بلندترین مسیر بدون حلقه ازV1 به V3 پیدا کردن بلندترین مسیر بدون حلقه ازV3 به V4 :جواب زیرمساله اول[V1, V2, V3] :جواب زیرمساله دوم[V3, V2, V4]:ترکیب جوابهای بهینه زیرمسائل

[V1, V2, V3, V2, V4] حلقه دارد.این جواب مساله اصلی نیست

با ترکیب حواب بهینه زیرمسائل، جواب بهینه مساله اصلیبدست نیامد.

.در نتیجه اصل بهینگی در مورد این مساله صدق نمی کند

V2

V1

V3

V4

2

3

1 1

4

Page 9: Algorythm Design (6)

99 روش حریصانه

مطالب مورد بحث

زنجیره ضرب ماتریس هاکوله پشتی صفر و یکویرایش رشته هافروشنده دوره گرد...

Page 10: Algorythm Design (6)

1010 روش حریصانه

زنجیره ضرب ماتریس ها

ضرب چند ماتریسM = M1 * M2 * M3

دو ماتریس در صورتی قابل ضرب هستند کهتعداد ستونهای ماتریس اول با تعداد سطرهای

ماتریس دوم برابر باشد. .ضرب ماتریس ها شرکت پذیر است فقط می توانیم ماتریس های مجاور را در هم

ضرب کنیم. اگرM1 دارای i سطر و j ستون و M2 دارای j

، M1*M2 سطر باشد، آنگاه ماتریس kستون و ستون خواهد بود.k سطر و iدارای

Page 11: Algorythm Design (6)

1111 روش حریصانه

زنجیره ضرب ماتریس ها

الگوریتم معمولی برای ضرب ماتریس ها مرتبه تعداد ضرب ها زیاد داشت )O(n3زمانی

اگر بخواهیم زنجیره ای از ماتریس ها را در همضرب کنیم، می توانیم این کار را به ترتیب

های مختلفی انجام دهیم :مثالM1*M2*M3

:ترتیب اولM1*(M2*M3) :ترتیب دوم(M1*M2*)M3

در ترتیب های مختلف، تعداد اعمال ضربصورت گرفته ممکن است تفاوت قابل توجهی

داشته باشند.

Page 12: Algorythm Design (6)

1212 روش حریصانه

زنجیره ضرب ماتریس ها

مثال: محاسبهM1*M2*M3*M4

یک ترتیب ممکنM1 * (M2 * (M3 *M4) )X = M3*M4 : حاصل: ماتریس 5000 = 100*1*50 تعداد ضرب

50*100M2 * (X) Y = :حاصل: ماتریس 100000 = 100*50*20 تعداد ضرب

20*100M1 * Y :100*10 حاصل: ماتریس 20000 = 100*20*10 تعداد ضرب :ضرب125000مجموع تعداد ضرب های انجام شده

یک ترتیب ممکن(M1 * (M2 * M3) * ) M4X = M2*M3 : 1*20 حاصل: ماتریس 1000 = 1*50*20 تعداد ضربM1 * (X) Y = :1*10 حاصل: ماتریس 200 = 1*20*10 تعداد ضربY*M4 :100*10 حاصل: ماتریس 1000 = 100*1*10 تعداد ضرب :ضرب2200مجموع تعداد ضرب های انجام شده

M1M2M3M4

10*20

20*50

50*11*100

Page 13: Algorythm Design (6)

1313 روش حریصانه

زنجیره ضرب ماتریس ها

M = M1 * M2 * … * Mn

M = M1 * (M2 * … * Mn)

M = (M1 * M2) * (M3 * … * Mn)

M = (M1 * M2 * M3) * (M4 * … * Mn)

…M = (M1 * … * Mn-1) * Mn

M = (M1 * M2 * … * Mi) * (Mi+1 * Mi+2 * … Mn)

:تعداد ترتیب های مختلف

1n

1

)in(F).i(F)n(F

Page 14: Algorythm Design (6)

1414 روش حریصانه

زنجیره ضرب ماتریس ها

تعداد ترتیب های مختلف: اعداد کاتاالنرشد بسیار سریعF(5)=14F(10)=4862F(15)=2674460

Page 15: Algorythm Design (6)

1515 روش حریصانه

زنجیره ضرب ماتریس ها

صورت مساله: تعیین ترتیب بهینه ضرب زنجیره ایn ماتریس

آیا اصل بهینگی صدق می کند؟بله بطور مثال، اگر ترتیب بهینهM1*M2*M3*M4 به

شکل

(M1 * ((M2 * (M3 * M4))

به شکل زیر می M2*M3*M4باشد، آنگاه ترتیب بهینه باشد.

M2 * (M3 * M4)

Page 16: Algorythm Design (6)

1616 روش حریصانه

زنجیره ضرب ماتریس ها

:راه حل ابعاد ماتریسMi : ri-1 * ri که i=1,…,n

mi,j تعداد حداقل اعمال ضرب الزم برای محاسبه :

Mi * Mi+1 * ... * Mj , 1 ≤ i ≤ j ≤ n

اگرi=j باشد mi,j=0 در غیر اینصورت

mi,j = min ( mi,k + mk+1,j + ri-1 * rk * rj )

بایدm1,n را بدست آوریم )حداقل تعداد اعمال ضرب الزم(

i ≤ k ≤ j

Page 17: Algorythm Design (6)

1717 روش حریصانه

زنجیره ضرب ماتریس ها

از یک آرایه دو بعدی برای ذخیرهmi,j استفاده می کنیم.

)مراحل انجام کار )حل زیرمسائل کوچکتر عمل ضرب ماتریسی 0: تعداد 0مرحله قرار دادن

i=1,...,n که mi,iصفر در عمل ضرب ماتریسی 1: تعداد 1مرحله محاسبه

mi,i+1 ، i=1,..,n-1 عمل ضرب ماتریسی 2: تعداد 2مرحله محاسبه

mi,i+2 ، i=1,..,n-2... مرحلهn-1 تعداد :n-1 عمل ضرب ماتریسی

m1,nمحاسبه

Page 18: Algorythm Design (6)

1818 روش حریصانه

زنجیره ضرب ماتریس ها

مثال: محاسبهM1*M2*M3*M4

1*10050*120*5010*20

M4M3M2M1

01000012002200

010003000

05000

0

m

حداقل تعداد ضرب های الزم

Page 19: Algorythm Design (6)

1919 روش حریصانه

زنجیره ضرب ماتریس ها

الگوریتم

int minCost(int n) {

for(i=1; i<=n; i++) m[i][i]=0;

for(l=1; l<n; l++)

for(i=1; i<=n-l; i++) {

j = i+l;

m[i][j] = min{ m[i][k] + m[k+1][j] + r[i-1]*r[k]*r[j] };

}

return m[1][n]

}

Page 20: Algorythm Design (6)

2020 روش حریصانه

زنجیره ضرب ماتریس ها

مرتبه زمانی ،با توجه به الگوریتم، دو حلقه تودرتو داریم

.O(n)هر یک با مرتبه زمانی در داخل حلقه هم عمل مینیمم گیری انجام

استO(n)می شود که مرتبه زمانی آن هم :در نتیجه مرتبه زمانی کل الگوریتمO(n3)

Page 21: Algorythm Design (6)

2121 روش حریصانه

مطالب مورد بحث

زنجیره ضرب ماتریس هاکوله پشتی صفر و یکویرایش رشته هافروشنده دوره گرد...

Page 22: Algorythm Design (6)

2222 روش حریصانه

کوله پشتی صفر و یک

شبیه مساله کوله پشتی غیر صفر و یک می باشدبا این تفاوت که یک شیء را یا باید بطور کامل

انتخاب کنیم یا اصال انتخاب نکنیم..انتخاب کسری از شیء مجاز نمی باشد برای کوله پشتی غیر صفر و یک، الگوریتمی مبتنی

بر روش حریصانه ارائه شد. این الگوریتم برای کوله پشتی صفر و یک قابل

استفاده نمی باشد. :مثال نقضM=20

(W1 , W2 , W3) = (18 , 15 , 10)(P1 , P2 , P3) = (25 , 24 , 15)

(1/2, 1, 0)جواب کوله پشتی غیر صفر و یک : 31.5ارزش:

Page 23: Algorythm Design (6)

2323 روش حریصانه

کوله پشتی صفر و یک

جواب حاصل از استفاده از الگوریتم حریصانهبرای این مثال:

(0 , 1 , 0) :24 ارزش :(0 , 1 , 0)جواب بهینه برای این مثال

24ارزش: در نتیجه الگوریتم حریصانه ارائه شده، برای

کوله پشتی صفر و یک مناسب نیست.

Page 24: Algorythm Design (6)

2424 روش حریصانه

کوله پشتی صفر و یک

از یک منظر دیگر، مساله کوله پشتی صفر ویک معادل است با

انتخاب زیرمجموعه ای از اشیا که مجموع ارزشآنها ماکزیمم شود و مجموع وزن آنها از ظرفیت

کوله پشتی تجاوز نکند.:از این منظر

یک مجموعهn 2 عضوی دارایn زیرمجموعه است یک راه حل: بررسی تمام حاالت ممکن

روشbrute-force مرتبه زمانی :O(2n) اما با استفاده از روش پویا، بدنبال روش بهتری

هستیم.آیا اصل بهینگی صدق می کند؟

Page 25: Algorythm Design (6)

2525 روش حریصانه

کوله پشتی صفر و یک

تعریف نمادP[i][w] که i>0 و w>0P[i][w] برابر است با بیشترین ارزش ممکن

برای کوله پشتی وقتی که آنرا با زیرمجموعه شیء اول پر کنیم و کوله پشتی را iای از

پر کنیم.wحداکثر تا ظرفیت اگر کوله پشتی را با انتخاب اشیا از بینi

شیء اول پر کنیم، طوری که مجموع وزن بیشتر نشود و ضمنا مجموع ارزش wاشیا از

اشیا حداکثر شود، حداکثر ارزش بدست آمده نشان می دهیم.P[i][w]را با

Page 26: Algorythm Design (6)

2626 روش حریصانه

کوله پشتی صفر و یک

طبق مفهومP[i][w]خواهیم داشت

مساله اصلی پیدا کردنP[n][M].است البته این فقط بیشترین ارزش ممکن برای پر کردن کوله

ها را هم محاسبه کنیم.Xiپشتی می باشد و باید

P[i][w]= max { P[i-1][w] , P[i-1][w-wi]+Pi } if w ≥ wi P[i-1][w] if w < wi

Page 27: Algorythm Design (6)

2727 روش حریصانه

کوله پشتی صفر و یک

روش کار: استفاده از یک آرایه دو بعدیn*M P[n] و محاسبه تمام عناصر آن تا نهایتا Pبرای [M].را بدست آوریم

این کار مرتبه زمانیO(n.M).خواهد داشت اگرM خیلی بزرگ باشد، مثال M>2n باشد آنگاه

-bruteمرتبه زمانی این الگوریتم از الگوریتم forceهم بدتر خواهد شد .قابل قبول نیست

روش بهتر: با توجه به رابطه صفحه قبل، واضح نهایتا، به دو Pاست که برای محاسبه هر عنصر

نیاز داریم. بنابراین فقط عناصر Pعنصر دیگر الزم را محاسبه می کنیم.

Page 28: Algorythm Design (6)

2828 روش حریصانه

کوله پشتی صفر و یک

اول می خواهیمP[n][M] را بدست آوریم. برای -P[n-1][M و همچنین P[n-1][M]این کار باید

wn]... را بدست آوریم و یک درخت دودوییاجرای مثال قبل با استفاده از این روش

M=20 و n=3(W1 , W2 , W3) = (18 , 15 , 10)(P1 , P2 , P3) = (25 , 24 , 15)

نحوه پیدا کردنXiها ؟ با این کار مرتبه زمانی الگوریتمO(2n(.خواهد شد

Page 29: Algorythm Design (6)

2929 روش حریصانه

مطالب مورد بحث

زنجیره ضرب ماتریس هاکوله پشتی صفر و یکویرایش رشته هافروشنده دوره گرد...

Page 30: Algorythm Design (6)

3030 روش حریصانه

ویرایش رشته ها

دو رشتهX و Yداریم X = x1 x2 x3 … xn

Y = y1 y2 y3 … ym

می خواهیم با اجرای یک دنباله از اعمال تبدیل کنیم Y را به رشته Xویرایشی، رشته

بطوریکه مجموع هزینه این اعمال حداقل گردد. اعمال ویرایشی مجاز

deleteحذف یک کاراکتر از رشته :insertدرج یک کاراکتر در رشته :change تعویض یک کاراکتر در رشته با یک کاراکتر :

دیگر

Page 31: Algorythm Design (6)

3131 روش حریصانه

ویرایش رشته ها

مثال: X=abbac و Y=abcbc

آیا این راه حل بهینه است؟.به هزینه هر یک از اعمال ویرایشی بستگی داردD(xi( هزینه حذف کاراکتر :xi

I(xi( هزینه درج کاراکتر :xi

C(xi,yi( هزینه تعویض کاراکتر :xi با کاراکترyi

abbac

abac

delete b

ababcinsert b abcbcchange a to c

Page 32: Algorythm Design (6)

3232 روش حریصانه

ویرایش رشته ها

اصل بهینگی؟

فرض کنیم دنباله ای شاملn عمل ویرایشی داریم که تبدیل می کند. می توانیم Y را به Xبا حداقل هزینه،

عمل n1فرض کنیم که در حین این کار ابتدا با تبدیل می شود و سپس با K به Xویرایشی اول،

تبدیل می Y به K عمل ویرایشی دوم، n2استفاده از عمل ویرایشی n1شود. در اینصورت واضح است که

n2 یک جواب بهینه می باشند و K به Xاول، برای تبدیل یک جواب Y به Kعمل ویرایشی دوم نیز، برای تبدیل

(n=n1+n2 ) بهینه می باشند.

X K Y

n1 n2

Page 33: Algorythm Design (6)

3333 روش حریصانه

ویرایش رشته ها

نمادcost(i,j) حداقل هزینه برای تبدیل پیشوند :i Y کاراکتری از j به پیشوند Xکاراکتری

یعنی هزینه تبدیلx1x2x3…xi به y1y2y3..yj

x1x2...xixi+1...xn y1y2...yjyj+1...ym

:با توجه به مفهوم این نماد اگرi=j=0 cost(i,j) = cost(0,0) = 0 اگرi>0 و j=0 cost(i,j) = cost(i,0) = cost(i-1,

0) + D(xi) اگرi=0 و j>0 cost(i,j) = cost(0,j) = cost(0,j-

1) + I(Yj)

Page 34: Algorythm Design (6)

3434 روش حریصانه

ویرایش رشته ها

x1x2...xixi+1...xn y1y2...yjyj+1...ym

اگرi>0 و j>0:آنگاه راه های ممکن cost(i,j) = cost(i-1,j) + D(xi)

cost(i,j) = cost(i,j-1) + I(yj)

cost(i,j) = cost(i-1,j-1) + C(xi,yi) , if xi != yj

cost(i,j) = cost(i-1,j-1) , if xi == yj

Page 35: Algorythm Design (6)

3535 روش حریصانه

ویرایش رشته ها

اگرi>0 و j>0 سه روش کلی .ممکن است هزینه این روش ها یکسان نباشد چون می خواهیم حداقل هزینه را پیدا کنیم، پس

آنگاهj>0 و i>0اگر cost(i,j) = MIN {

cost(i-1,j) + D(xi) , cost(i,j-1) + I(yi) , if(xi!=yj) cost(i-1,j-1) +

C(xi,yi) else cost(i-1,j-1)

}

Page 36: Algorythm Design (6)

3636 روش حریصانه

ویرایش رشته ها

:فرمول کلی

0j , 0i if

1)-j1,-cost(i else

yj)C(xi,1)-j1,-cost(i yj)!if(xi

I(yj) 1)-jcost(i,

D(xi)j)1,-cost(i

MIN

0j , 0i if I(yj) 1)-jcost(0,

0i , 0j if D(xi)1,0)-cost(i

0ji if 0

j)cost(i,

Page 37: Algorythm Design (6)

3737 روش حریصانه

ویرایش رشته ها

هدف: اگر رشتهX دارای n کاراکتر و رشته Y را پیدا cost(n,m) کاراکتر باشد، باید mدارای کنیم.

البتهcost(n,m) یک مقدار است، عالوه بر آن باید دنباله اعمال را نیز پیدا کنیم.

از آرایه دو بعدیcost استفاده می کنیم و عناصر cost[n]آن را محاسبه می کنیم تا نهایتا مقدار

[m].را بدست آوریم سطر اول را محاسبه می کنیمcost[0][j]و m 0≤j≤ ستون اول را محاسبه می کنیمcost[i][0] 0 و≤i≤n.بقیه عناصر را سطر به سطر محاسبه می کنیم آرایه(n+1(*)m+1)عنصری

Page 38: Algorythm Design (6)

3838 روش حریصانه

ویرایش رشته ها

مثال: تبدیلabc به cd با فرض اینکه هزینه تمام اعمال ویرایشی به ازای هر کاراکتر

می باشد.1برابر :حداقل هزینهcost(3,2)=3

:دنباله اعمال ویرایشی الزمdelete(a)change(b,c)change(c,d) البته در این مثال، دنباله ویرایشی بهینه یکتا نمی

باشد.

012

112

222

323

Page 39: Algorythm Design (6)

3939 روش حریصانه

ویرایش رشته ها

محاسبه مرتبه زمانی در این الگوریتم باید(n+1(*)m+1) عنصر آرایه

cost .را محاسبه کنیم محاسبه هر عنصر، به تعداد ثابتی عمل نیاز دارد

قابل انجام است. یعنی O(1)که با مرتبه زمانی حجم اعمال الزم برای محاسبه هر عنصر آرایه

cost مستقل از ،n و m.است در نتیجه، مرتبه زمانی الگوریتمO(n.m) می

باشد.

Page 40: Algorythm Design (6)

4040 روش حریصانه

مطالب مورد بحث

زنجیره ضرب ماتریس هاکوله پشتی صفر و یکویرایش رشته هافروشنده دوره گرد...

Page 41: Algorythm Design (6)

4141 روش حریصانه

فروشنده دوره گرد

TSP: Traveling Salesperson Problem یک فروشنده باید برای فروش اجناس خود، باید به

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

استفاده از یک گراف جهت دار وزن دار برای مدلکردن مساله

گره های گراف: شهر هایالهای گراف: جاده های ارتباطی بین شهرها وزن یالها: طول مسیر بین دو شهر یا هزینه جابجایی

بین دو شهری که گره های ابتدا و انتهای یال را مشخص می کنند.

Page 42: Algorythm Design (6)

4242 روش حریصانه

فروشنده دوره گرد

( گردشtour ) برای گراف جهت دار وزن دارG با n گره، یک

گردش، مسیری است از یک گره به خود آن گره، بطوری که از هر یک از گره های دیگر، دقیقا یک

بار بگذرد. مسالهTSPدر واقع

( پیدا کردن گردش بهینهoptimum tour می )باشد. یعنی گردشی که دارای کمترین هزینه ممکن باشد )البته به فرض اینکه حداقل یک گردش وجود

داشته باشد(

Page 43: Algorythm Design (6)

4343 روش حریصانه

فروشنده دوره گرد

اگرn( شهر n گره( وجود داشته باشد )فرض: گراف کامال متصل(

.باید در هر گام یک شهر را انتخاب کرده و به آنجا برویم ابتدا در گره مبدأ قرار داریم که این گره را باv1 نشان می

دهیم. شروع حرکت( 1در گام( n-1گره قابل انتخاب می باشد. کدام؟ 2در گام ،n-2گره قابل انتخاب است. کدام؟ ... در گامn-1، 1.گره قابل انتخاب است در نتیجه، تعداد کل حاالت ممکن )تعداد گردشهای ممکن( برابر

است با:(n-1) * (n-2) * (n-3) * ... * 3 * 2 * 1 = (n-1)!

در واقع(n-1!) گردش مختلف وجود دارد که باید از بین آنها کوتاهترین را انتخاب کنیم.

Page 44: Algorythm Design (6)

4444 روش حریصانه

فروشنده دوره گرد

الگوریتمbrute-forceبررسی تمام حاالت ممکن :(n-1!) گردش مختلف وجود دارد که باید طول هر کدام

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

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

واضح است که جمعn عدد با مرتبه زمانی O(n) انجام می شود.

پس، محاسبه طول(n-1!) گردش، با مرتبه زمانی O(n.(n-1)!) قابل انجام است یعنی با مرتبه زمانی O(n!)

سپس باید کوتاهترین گردش را پیدا کنیم، که این هم با قابل انجام است.O((n-1)!)مرتبه زمانی

در نتیجه الگوریتم مرتبه زمانیbrute-force برابر ،O(n!).می باشد

Page 45: Algorythm Design (6)

4545 روش حریصانه

فروشنده دوره گرد

این مرتبه زمانی فقط برایn های خیلی کوچک قابل قبول است.

مثال اجرای الگوریتمbrute-force برای n=20 بر روی یک کامپیوتر معمولی، سالها ،

طول می کشد.20 ≈ !1018

آیا می توان الگوریتم بهتری، مبتنی بر برنامهنویسی پویا ارائه کرد؟

آیا اصل بهینگی در مورد مساله صادق است؟بله

Page 46: Algorythm Design (6)

4646 روش حریصانه

فروشنده دوره گرد

Vمجموعه تمام گره ها :v1گره مبدأ : هدف: پیدا کردن کوتاهترین مسیری که از هر یک از گره

v1 یک بار می گذرد و سپس به V-{v1}های مجموعه ختم می شود.

فرض کنیم به روشی، تشخیص داده ایم که اولین گره می باشد. آنگاه برای تشخیص vk( گره v1مسیر )بعد از

گره بعدی، باید کوتاهترین مسیری را پیدا کنیم که از هر یک از گره

ختم v1 یک بار بگذرد و به V-{v1, vk}های مجموعه شود.

....مساله خاصیت بازگشتی دارد

Page 47: Algorythm Design (6)

4747 روش حریصانه

فروشنده دوره گرد

A را بعنوان مجموعه گره های انتخاب نشده در نظر می گیریم که در هر گام، گره بعدی را

باید از آن مجموعه انتخاب کنیم. واضح است کهA زیرمجموعه V.است

از ماتریس دوبعدیW بعنوان ماتریس مجاورت گراف استفاده می کنیم.

W[i][j] وزن یالی که از گره :vi به گره vj.می رود

Page 48: Algorythm Design (6)

4848 روش حریصانه

فروشنده دوره گرد

نمادD[vi][A] طول کوتاهترین مسیری که از : vi Aشروع می شود و از هر یک از گره های مجموعه

ختم می شود.v1یک بار می گذرد و به استخراج رابطه بازگشتی

،با توجه به مفهوم این نماد هدف اصلی بدست آوردنD[v1][V-{v1}].می باشد البته این مقدار، فقط طول کوتاهترین گردش را مشخص

می کند، سپس باید خود مسیر گردش را مشخص نمود.

A if ]1][i[W

A! if }]{v-][AD[vW[i][j]MIN][A]D[v

jjAv

ij

Page 49: Algorythm Design (6)

4949 روش حریصانه

فروشنده دوره گرد

محاسبه مرتبه زمانی اگر از یک آرایه دو بعدی برای ذخیره مقادیر عناصرD

استفاده کنیم. این آرایه دارایn 2 سطر وn.ستون خواهد بود

2چراn چون مجموعه :n عضوی V 2، دارایn.زیرمجموعه می باشد پس بطور کلی تعداد عناصری که باید محاسبه کنیم برابر

است باn . 2n

.البته در عمل برخی عناصر را محاسبه نمی کنیم از طرفی در محاسبه هر عنصر، نیاز به مینیمم گیری می

انجام می O(n)باشد که این مینیمم گیری با مرتبه زمانی شود.

:در نتیجه، مرتبه زمانی الگوریتم ارائه شدهO(n2.2n) مرتبه زمانی خیلی بد است، اما خیلی بهتر از الگوریتم

brute-force.مثال برای می باشد( n=20، n . 2n ≈108)

Page 50: Algorythm Design (6)

5050 روش حریصانه

فروشنده دوره گرد

مثال: های A برای Dباید به محاسبه عناصر

مختلف بپردازیم.: محاسبه حاالت الزم برای 1گام

عضوی0زیرمجموعه های D[v2][Ф] , D[v3][Ф] , D[v4][Ф]

: محاسبه حاالت الزم برای 2گام عضوی1زیرمجموعه های

D[v2][v3], D[v2][v4], D[v3][v2], D[v3][v4],

D[v4][v2], D[v4][v3]: محاسبه حاالت الزم برای 3گام

عضوی2زیرمجموعه های D[v2][v3,v4], D[v3][v2,v4], D[v4]

[v2,v3]: محاسبه حاالت الزم برای 4گام

عضوی3زیرمجموعه های D[v1][v2,v3,v4]

V1 V2

V3V4

2

1

75

84

4

3

6

جواب نهایی مساله

Page 51: Algorythm Design (6)

5151 روش حریصانه

فروشنده دوره گرد

1234

102∞3

2108∞

3∞406

47540

: Wماتریس وزن یالها

D[v2][Ф] = W[2][1] = 1

D[v3][Ф] = W[3][1] = ∞

D[v4][Ф] = W[4][1] = 7

==============================

D[v2][v3] = W[2][3] + D[3][Ф] = 8 + ∞ = ∞

D[v2][v4] = W[2][4] + D[4][Ф] = ∞ + 7 = ∞

D[v3][v2] = W[3][2] + D[2][Ф] = 4+1=5

D[v3][v4] = W[3][4] + D[4][Ф] = 6+7=13

D[v4][v2] = W[4][2] + D[2][Ф] = 5+1=6

D[v4][v3] = W[4][3] + D[3][Ф] = 4 + ∞ = ∞

Page 52: Algorythm Design (6)

5252 روش حریصانه

فروشنده دوره گرد

D[v2][v3,v4] = MIN { W[2][3] + D[v3][v4] , W[2][4]+D[v4][v3] }

= MIN { 21 , ∞ } = 21

D[v3][v2,v4] = MIN { W[3][2]+D[v2][v4] , W[3][4]+D[v4][v2] }

= MIN {∞ , 12 } = 12

D[v4][v2,v3] = MIN { W[4][2]+D[v2][v3] , W[4][3]+D[v3][v2] }

= MIN {∞ , 9 } = 9

===============================================================

D[v1][v2,v3,v4] = MIN { W[1][2] + D[v2][v3,v4] ,

W[1][3] + D[v3][v2,v4] ,

W[1][4] + D[v4][v2,v3] }

= MIN { 23 , ∞ , 12} = 12

طول کوتاهترین v1مسیری که از

شروع شود و از هر و v2یک از گره های

v3 و v4 دقیقا یک بار بگذرد و دوباره به

v1.ختم شود

Page 53: Algorythm Design (6)

5353 روش حریصانه

فروشنده دوره گرد

اما خود مسیر را چگونه بدست آوریم؟ از کدام 12عدد term بدست آمد؟ از W[1][4] + D[v4]

[v2,v3] این ترم معادل حرکت ازv1 به v4 است. پس در اولین گام از

v1 باید به v4.برویم اما مقدارD[v4][v2,v3] از کدام termبدست آمد؟

ازW[4][3]+D[v3][v2] که معادل حرکت از v4 به v3 است. پس بعد برویم.v3 باید به v4از

اما مقدارD[v3][v2] از کدام term بدست آمد؟ ازW[3][2] + D[2][Ф] که معادل حرکت از v3 به v2 است. پس

برویم.v2 به v3باید از مقدارD[2][Ф] چطور بدست آمد؟ این مقدار برابر بود

v1 به v2 یعنی حرکت از W[2][1]با در نتیجه مسیر

V1 V4 V3 V2 V1