algorythm design (6)

Post on 10-Jun-2015

261 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

22 روش حریصانه

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

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

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

33 روش حریصانه

مقدمه

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

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

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

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

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

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

44 روش حریصانه

مقدمه

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

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

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

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

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

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

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

55 روش حریصانه

مقدمه

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

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

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

کنیم.

66 روش حریصانه

مقدمه

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

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

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

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

77 روش حریصانه

مقدمه

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

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

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

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

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

99 روش حریصانه

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

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

1010 روش حریصانه

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

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

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

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

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

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

1111 روش حریصانه

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

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

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

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

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

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

داشته باشند.

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

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

1414 روش حریصانه

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

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

1515 روش حریصانه

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

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

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

شکل

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

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

M2 * (M3 * M4)

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

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محاسبه

1818 روش حریصانه

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

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

1*10050*120*5010*20

M4M3M2M1

01000012002200

010003000

05000

0

m

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

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]

}

2020 روش حریصانه

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

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

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

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

2121 روش حریصانه

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

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

2222 روش حریصانه

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

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

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

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

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

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

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

2323 روش حریصانه

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

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

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

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

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

2424 روش حریصانه

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

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

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

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

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

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

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

2525 روش حریصانه

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

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

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

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

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

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

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

2727 روش حریصانه

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

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

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

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

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

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

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(.خواهد شد

2929 روش حریصانه

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

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

3030 روش حریصانه

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

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

Y = y1 y2 y3 … ym

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

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

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

دیگر

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

3232 روش حریصانه

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

اصل بهینگی؟

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

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

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

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

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

X K Y

n1 n2

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)

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

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)

}

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,

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)عنصری

3838 روش حریصانه

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

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

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

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

باشد.

012

112

222

323

3939 روش حریصانه

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

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

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

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

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

باشد.

4040 روش حریصانه

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

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

4141 روش حریصانه

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

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

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

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

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

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

4242 روش حریصانه

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

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

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

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

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

داشته باشد(

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!) گردش مختلف وجود دارد که باید از بین آنها کوتاهترین را انتخاب کنیم.

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!).می باشد

4545 روش حریصانه

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

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

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

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

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

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

4646 روش حریصانه

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

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

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

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

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

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

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

4747 روش حریصانه

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

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

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

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

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

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

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)

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

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

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 + ∞ = ∞

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.ختم شود

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

top related