ÌÜèçìá 6ï: ÁËÃÏÑÉÈÌÉÊÅÓ ÔÅ ÍÉÊÅÓ ÏéêïãÝíåéåò Áëãïñßèìùí ÕðÜñ ïõí ðïëëýò ïðôéêýò ãùíßåò êáôü ôï ó åäéáóìü óùóôþí ðñïãñáììüôùí. Ï ó åäéáóìüò êáëþí êáé óùóôþí áëãïñßèìùí åßíáé ìßá áðü áõôýò ôéò ïðôéêýò ãùíßåò. Åßíáé áðáñáßôçôï êáôü ôï ó åäéáóìü áëãïñßèìùí íá Ý ïõìå ðüíôïôå õð üøç ìåñéêýò óôñáôçãéêýò ãéá ôçí åðßëõóç ôïõ êüèå öïñü ðñïâëþìáôïò. Áðü ôï ìüèçìá ôçò Ó åäßáóçò Áëãïñßèìùí Þäç ãíùñßæïõìå ìßá óåéñü ôå íéêþí/ïéêïãåíåéþí ðïõ âïçèïýí óôï óêïðü áõôü. Ãéá ðáñüäåéãìá, ãíùñßæïõìå ôéò ïéêïãýíåéåò êáé ôá áíôßóôïé á ðñïâëþìáôá: ðëçóôç ÌÝèïäïò. ÅëÜ éóôá æåõãíýïíôá ìïíïðüôéá (Prim, Kruskal), Óõíôïìüôåñá ìïíïðüôéá (Dijkstra), Êùäéêïðïßçóç Huffmann, ôï Ðñüâëçìá ôïõ óüêïõ, ôï Ðñüâëçìá ôçò áðïèþêåõóçò óå ôáéíßåò, êëð. Äéáßñåé êáé Âáóßëåõå. ÄõáäéêÞ áíáæþôçóç, Ôáîéíüìçóç ìå óõã þíåõóç, ÃñÞãïñç ôáîéíüìçóç, ôï Ðñüâëçìá ôçò åðéëïãþò, Ðïëëáðëáóéáóìüò ðéíüêùí (Strassen), êëð. Äõíáìéêüò Ðñïãñáììáôéóìüò. Áëõóéäùôüò ðïëëáðëáóéáóìüò ðéíüêùí, Óõíôïìüôåñá ìïíïðüôéá (Floyd), ÂÝëôéóôá äõáäéêü äýíäñá, Ðåñéïäåýùí ðùëçôþò (Hamilton), Ìáêñýôåñç êïéíþ õðïáêïëïõèßá, êëð. Åî Üëëïõ åßíáé ãíùóôýò ïé ôå íéêýò ôçò ïðéóèïäñüìçóçò (backtacking) êáé ôçò äéáêëüäùóçò êáé ðåñéïñéóìïý (branch and bound) ãéá ôç äéüó éóç ãñüöùí. Óôï ìüèçìá áõôü èá åîåôüóïõìå 3 ðñïâëþìáôá, ðïõ èá ðñïóðáèþóïõìå íá åðéëýóïõìå ìå åíáëëáêôéêïýò ôñüðïõò, üðïõ êüèå öïñü èá ðñï ùñïýìå óå åîõðíüôåñåò åðéëïãýò êáé ðéï áðïäïôéêïýò áëãïñßèìïõò. ÌÝãéóôï èñïéóìá Õðïáêïëïõèßáò Äßíåôáé Ýíáò ðßíáêáò ìå áêýñáéïõò áñéèìïýò êáé æçôåßôáé íá âñåèåß ï õðïðßíáêáò åêåßíïò, ôïõ ïðïßïõ ôá Üèñïéóìá ôùí ôéìþí ôùí óôïé åßùí åßíáé ìýãéóôï óå ó Ýóç ìå êüèå Üëëï õðïðßíáêá ðïõ ìðïñåß íá èåùñçèåß. Ãéá ðáñüäåéãìá, óôïí åðüìåíï ðßíáêá Á ôï ìýãéóôï Üèñïéóìá ôùí ôéìþí ôùí óôïé åßùí äßíåôáé áðü ôïí õðïðßíáêá A[3..5] êáé åßíáé ßóï ìå 19. 6-8 7 10 2-4 5 Óôï ðñüâëçìá áõôü õðüñ ïõí äýï ðñïöáíåßò ëýóåéò. Áí ï ðßíáêáò ðåñéý åé ìüíï èåôéêïýò áñéèìïýò, ôüôå ç ëýóç åßíáé ïëüêëçñïò ï ðßíáêáò. ¼ôáí ï ðßíáêáò ðåñéý åé ìüíï áñíçôéêïýò áñéèìïýò ôüôå ç ëýóç åßíáé Ýíáò õðïðßíáêáò ìå 0 66
óôïé åßá. Óå êüèå Üëëç ðåñßðôùóç, ôï ðñüâëçìá èýëåé éäéáßôåñç ðñïóï Þ. Óôç óõíý åéá èá åîåôüóïõìå ôýóóåñéò áëãïñßèìïõò, üðïõ äéáäï éêü èá âåëôéþíïõìå ôçí ðïëõðëïêüôçôü ôïõò. Ðñþôïò áëãüñéèìïò (åîáíôëçôéêüò ôñüðïò) Êáô áñ Þí ðáñïõóéüæåôáé ç ðñþôç ìáò ðñïóðüèåéá: Ýíáò ðñïöáíþò ôñüðïò åðßëõóçò ôïõ ðñïâëþìáôïò, üðïõ åîåôüæåôáé êüèå äõíáôþ ðåñßðôùóç õðïðßíáêá. Ç óõíüñôçóç max subseq sum1 ðïõ áêïëïõèåß, äý åôáé ôïí ðßíáêá A, ðïõ áðïôåëåßôáé áðü n óôïé åßá, êáé åðéóôñýöåé ôç æçôïýìåíç ìýãéóôç ôéìþ. Ìå left êáé right óõìâïëßæïíôáé ôá äýï áêñáßá óôïé åßá ôçò õðïáêïëïõèßáò, ðïõ êüèå öïñü åîåôüæåôáé. Ãéá êüèå åîåôáæüìåíç õðïáêïëïõèßá, ôï áíôßóôïé ï Üèñïéóìá ôùí ôéìþí ôùí óôïé åßùí ôçò õðïëïãßæåôáé ìå ôç âïþèåéá ôçò ìåôáâëçôþò current sum ðïõ óõãêñßíåôáé ìå ôç ìåôáâëçôþ max sum êáé ôçí áíôéêáèéóôü áí Ý åé ìåãáëýôåñç ôéìþ. function max_subseq_sum1; 1. max_sum <-- 0; left <-- 0; right <-- 0; 2. for i <-- 1 to n do 3. for j <-- i to n do 4. current_sum <-- 0; 5. for k <-- i to j do 6. current_sum <-- current_sum+a[k]; 7. if (current_sum>max_sum) then 8. max_sum <-- current_sum; 9. left <-- i; right <-- j 10. return max_sum Ç óõíüñôçóç áõôþ áðïôåëåßôáé áðü ôñåéò öùëéáóìýíåò åíôïëýò for. Ç åýñåóç ôçò ðïëõðëoêüôçôáò áíáäåéêíýåôáé åýêïëá üðùò öáßíåôáé óôç óõíý åéá èåùñþíôáò ùò âáñüìåôñï ôçí åíôïëþ 6 (ìå ìïíáäéáßï êüóôïò), ðïõ âñßóêåôáé óôï åóùôåñéêüôåñï óçìåßï ôùí âñü ùí. T (n) = = 1 2 = 1 2 n n i=1 j=i k=i j 1 = n i=1 j=i n (n i + 1)(n i + 2) i=1 n i=1 i 2 = 1 n(n + 1)(2n + 1) 2 6 = n3 + 3n 2 + 2n 6 n (j i + 1) ( n + 3 ) n i + 1 2 2 (n2 + 3n + 2) i=1 ( n + 3 2 ) n(n + 1) 2 n 1 j=1 + n 2 (n2 + 3n + 2) ôóé ðñïêýðôåé üôé ç ðïëõðëïêüôçôá áõôïý ôïõ áëãïñßèìïõ åßíáé È(n 3 ). 67
Äåýôåñïò áëãüñéèìïò (åîáíôëçôéêüò ôñüðïò) Ðáñáôçñþíôáò ôïí ðñïçãïýìåíï áëãüñéèìï åýêïëá âãáßíåé ôï óõìðýñáóìá üôé ãßíïíôáé ðïëëïß ðåñéôôïß õðïëïãéóìïß. ôóé, ðñïêåéìýíïõ íá âåëôéùèåß ç ðïëõðëïêüôçôá ôïõ áëãïñßèìïõ áõôïý, ìðïñåß íá ðáñáëçöèåß ç ìßá áðü ôéò ôñåéò öùëéáóìýíåò åíôïëýò for. Áõôü ðñïêýðôåé áðü ôçí ðáñáôþñçóç üôé ôï Üèñïéóìá ôùí ôéìþí ôùí óôïé åßùí ôïõ õðïðßíáêá A(left..right) åßíáé ßóï ìå ôï Üèñïéóìá ôùí ôéìþí ôùí óôïé åßùí ôïõ õðïðßíáêá A(left..right-1) êáé ôïõ óôïé åßïõ A(right), ïðüôå êáôü ôïí õðïëïãéóìü ôïõ A(left..right) õðïëïãßæåôáé êáé ðüëé ôï Üèñïéóìá ôùí ôéìþí ôùí óôïé åßùí A(left..right-1). Áí ãßíåé ç áëëáãþ áõôþ óôç óõíüñôçóç max subseq sum1 ðñïêýðôåé ç óõíüñôçóç max subseq sum2. function max_subseq_sum2; 1. max_sum <-- 0; left <-- 0; right <-- 0; 2. for i <-- 1 to n do 3. current_sum <-- 0; 4. for j <-- i to n do 5. current_sum <-- current_sum+a[j]; 6. if (current_sum>max_sum) then 7. max_sum <-- current_sum; 8. left <-- i; right <-- j 9. return max_sum Åõêïëüôåñá áðü ôçí ðñïçãïýìåíç öïñü åßíáé äõíáôüí íá áðïäåé èåß üôé ï áëãüñéèìïò Ý åé ôåôñáãùíéêþ ðïëõðëïêüôçôá È(n 2 ). Ôñßôïò áëãüñéèìïò (äéáßñåé êáé âáóßëåõå) Ìßá äéáöïñåôéêþ áíôéìåôþðéóç ôïõ ðñïâëþìáôïò ðñïêýðôåé áêïëïõèþíôáò ôç óôñáôçãéêþ Äéáßñåé êáé Âáóßëåõå, äçëáäþ äéáéñþíôáò ôïí ðßíáêá óå äýï õðïðßíáêåò (ó åäüí) ßóïõ ìþêïõò. Ãéá ôá õðïäéáíýóìáôá áõôü õðïëïãßæïíôáé áíáäñïìéêü ïé áêïëïõèßåò ìýãéóôïõ áèñïßóìáôïò, äéáéñþíôáò ôá óå åðß ìýñïõò, áí êáé üóï ñåéáóèåß. ôóé äéáêñßíïõìå ôñåéò ðåñéðôþóåéò: ç õðïáêïëïõèßá ôïõ ìýãéóôïõ áèñïßóìáôïò åßôå ðåñéý åôáé óôï ðñþôï ìéóü ôïõ áñ éêïý ðßíáêá, åßôå ðåñéý åôáé óôï äåýôåñï ìéóü, åßôå ôýëïò ðåñéý åôáé êáé óôá äýï. ¼ôáí éó ýåé ç ôñßôç ðåñßðôùóç, ôüôå ç ëýóç ôïõ ðñïâëþìáôïò âáóßæåôáé óôç óêýøç üôé ðñýðåé íá õðïëïãéóèåß áö åíüò ç õðïáêïëïõèßá ìå ìýãéóôï Üèñïéóìá ôïõ ðñþôïõ ìéóïý, ç ïðïßá ðåñéý åé ôï ôåëåõôáßï óôïé åßï ôïõ ðñþôïõ õðïðßíáêá êáé áö åôýñïõ ç õðïáêïëïõèßá ìå ìýãéóôï Üèñïéóìá ôïõ äåýôåñïõ ìéóïý, ç ïðïßá ðåñéý åé ôï ðñþôï óôïé åßï ôïõ äåýôåñïõ õðïðßíáêá. Ç ëýóç ôïõ áñ éêïý ðñïâëþìáôïò åßíáé åêåßíç áðü ôéò ôñåéò õðïáêïëïõèßåò ðïõ Ý åé ôï ìýãéóôï Üèñïéóìá ôùí ôéìþí ôùí óôïé åßùí ôçò. Ãéá ðáñüäåéãìá, áí ï ðßíáêáò Á Ý åé ôçí ðñþôç ìïñöþ ôïõ åðïìýíïõ ó Þìáôïò, ôüôå äéáéñåßôáé óôï ìýóï êáé ðñïêýðôåé ç äåýôåñç ìïñöþ ôïõ ó Þìáôïò. Ìå âüóç áõôþ ôç èåþñçóç õðïëïãßæåôáé ç õðïáêïëïõèßá ìýãéóôïõ áèñïßóìáôïò ôïõ ðñþôïõ ìéóïý (åßíáé ï õðïðßíáêáò A(1..2)=(3,3) ìå Üèñïéóìá 6), ç õðïáêïëïõèßá ôïõ äåýôåñïõ ìéóïý (åßíáé ï õðïðßíáêáò A(7)=(7) ìå Ýíá ìüíï óôïé- åßï) êáé ç õðïáêïëïõèßá ðïõ ðåñéý åé ôï ôåëåõôáßï óôïé åßï ôïõ ðñþôïõ ìéóïý êáé 68
3 3-7 1 4-4 7-6 2 1 3 3-7 1 4-4 7-6 2 1 ôï ðñþôï ôïõ äåýôåñïõ ìéóïý (åßíáé ï õðïðßíáêáò A(4..7)=(1,4,-4,7) ìå Üèñïéóìá 8). ÅðïìÝíùò, ç õðïáêïëïõèßá ìå ìýãéóôï Üèñïéóìá åßíáé ï õðïðßíáêáò A(4...7) ìå Üèñïéóìá ôùí ôéìþí ôùí óôïé åßùí ßóï ìå 8. Ç áíáäñïìéêþ óõíüñôçóç max subseq sum3 õðïëïãßæåé ôï ìýãéóôï Üèñïéóìá ôùí ôéìþí ôùí óôïé åßùí ìåôáîý üëùí ôùí õðïáêïëïõèéþí ôïõ ðßíáêá A, äéáéñþíôáò ôïí ðßíáêá óå åðéìýñïõò ôìþìáôá. Áõôü åßíáé ôï óêýëïò Äéáßñåé. Ç âáóéêþ óõíèþêç (base case) èåùñåß ôçí õðïáêïëïõèßá ìå Ýíá ìüíï óôïé åßï, üðïõ áí ôï óôïé åßï áõôü Ý åé ôéìþ èåôéêþ, ôüôå ôï Üèñïéóìá éóïýôáé ìå ôçí ôéìþ áõôþ, áëëéþò ôï Üèñïéóìá éóïýôáé ìå ìçäýí. Ìå Üëëá ëüãéá, óôï óçìåßï áõôü õëïðïéåßôáé ôï óêýëïò Âáóßëåõå ôçò ãåíéêþò ìåèüäïõ. function max_subseq_sum3(left,right); 1. if left=right then 2. if A[left]>0 then return A[left] 3. else return 0; 4. else 5. center <-- (left+right)/2; 6. max_lsum <-- max_subseq_sum3(left,center); 7. max_rsum <-- max_subseq_sum3(center+1,right); 8. max_lborder_sum <-- 0; lborder_sum <-- 0; 9. for i <-- center downto left do 10. lborder_sum <-- lborder_sum+a[i]; 11. if (lborder_sum>max_lborder_sum) then 12. max_lborder_sum <-- lborder_sum 13. max_rborder_sum <-- 0; rborder_sum <-- 0; 14. for i <-- center+1 to right do 15. rborder_sum <-- rborder_sum+a[i]; 16. if (rborder_sum>max_rborder_sum) then 17. max_rborder_sum <-- rborder_sum 18. temp <-- max_lborder_sum+max_rborder_sum; 19. return max(max_lsum,max_rsum,temp) Ïé ñçóéìïðïéïýìåíåò ìåôáâëçôýò åßíáé áêýñáéåò êáé Ý ïõí ôï åîþò íüçìá. Ïé ìåôáâëçôýò max lsum êáé max rsum åîõðçñåôïýí ôéò äýï ðñþôåò ðåñéðôþóåéò ðïõ áíáöýñèçêáí êáé äßíïõí ôï ìýãéóôï Üèñïéóìá ãéá ôï áñéóôåñü êáé äåîéü õðïðßíáêá, áíôßóôïé á. Ïé õðüëïéðåò ìåôáâëçôýò áöïñïýí óôçí ôñßôç ðåñßðôùóç. Ïé ìåôáâëçôýò lborder sum êáé rborder sum äßíïõí ôï êüèå öïñü õðïëïãéæüìåíï Üèñïéóìá óôá áñéóôåñü êáé äåîéü ôïõ center, åíþ óôéò max lborder sum êáé max rborder sum áðïèçêåýåôáé ôï ìý ñé óôéãìþò ìýãéóôï Üèñïéóìá ãéá ôï áñéóôåñü êáé äåîéü õðïðßíáêá áíôßóôïé á, ôá ïðïßá áñãüôåñá èá ðñïóôåèïýí ãéá íá äþóïõí ôï áðïôýëåóìá ôçò ôñßôçò ðåñßðôùóçò. ÔÝëïò, èåùñåßôáé üôé õðüñ åé ìßá 69
óõíüñôçóç max(), ðïõ åðéóôñýöåé ôï ìåãáëýôåñï áðü ôá óôïé åßá ðïõ åßíáé ôá ïñßóìáôü ôçò. Ç ðïëõðëïêüôçôá ôçò ìåèüäïõ ìðïñåß íá ðñïêýøåé ìå âüóç ôçí áíôßóôïé ç áíáäñïìéêþ åîßóùóç. Êáô áñ Þí áí ôï ìþêïò ôïõ ðßíáêá åßíáé 1, ôüôå ç äñáóôçñéüôçôá óôéò åíôïëýò 1-3 áðïôéìüôáé ùò óôáèåñü ìïíáäéáßï êüóôïò, äçëáäþ T (1) = 1. Áí ï ðßíáêáò åßíáé ìåãáëýôåñïò, ôüôå èá åêôåëåóèïýí äýï áíáäñïìéêýò êëþóåéò, åíþ óôéò åíôïëýò 9-17 èá åêôåëåóèïýí äýï áðëïß âñü ïé for ãñáììéêþò ðïëõðëïêüôçôáò. ÅðïìÝíùò éó ýåé: T (n) = T ( n/2 ) + T ( n/2 ) + n Èåùñþíôáò üôé n = 2 k ãéá áðëïðïßçóç, Ýðåôáé üôé: T (n) = 2T (n/2) + n = 2 (2T (n/4) + n/2) + n = 4T (n/4) + 2n =... = 2 k T (n/2 k ) + kn = 2 k + kn = n lg n + n = Θ(n lg n) Óôï óõìðýñáóìá áõôü êáôáëþãïõìå áí áðëþò èåùñþóïõìå üôé ôï âüèïò ôùí áíáäñïìéêþí êëþóåùí åßíáé È(lg n), åíþ êüèå öïñü ï ðßíáêáò õößóôáôáé åðåîåñãáóßá ôçò ôüîçò È(n). Áêïëïõèåß ï ôåëåõôáßïò áëãüñéèìïò, ðïõ åßíáé ï êáëýôåñïò ðïõ ìðïñïýìå íá ó åäéüóïõìå. ÔÝôáñôïò áëãüñéèìïò (âýëôéóôïò ôñüðïò) ÔÝëïò, ëïéðüí, ìßá áêüìç ëýóç ôïõ ðñïâëþìáôïò ðïõ äéáðñáãìáôåõüìáóôå, äßíåôáé áðü ôç óõíüñôçóç max subseq sum4 ðïõ öáßíåôáé óôç óõíý åéá. Ç óõíüñôçóç áõôþ, óáñþíåé üëá ôá óôïé åßá ôïõ ðßíáêá êáé ôá ðñïóèýôåé üóï ôï Üèñïéóìá ôïõò åßíáé èåôéêü. Áí êüðïéá óôéãìþ ç ôéìþ ôïõ áèñïßóìáôïò áõôïý ãßíåé áñíçôéêþ, ôüôå ìçäåíßæåôáé ç ôéìþ áõôïý ôïõ áèñïßóìáôïò êáé óõíå ßæåôáé ç Üèñïéóç ôùí ôéìþí ôùí óôïé åßùí áðü ôï åðüìåíï óôïé åßï. function max_subseq_sum4; 1. i <-- 0; current_sum <-- 0; max_sum <-- 0; 2. left <-- 0; right <-- 0; 3. for j <-- 1 to n do 4. current_sum <-- current_sum+a[j]; 5. if (current_sum>max_sum) then 6. max_sum <-- current_sum; 7. left <-- i; right <-- j 8. else 9. if (current_sum<0) then 10. i <-- j+1; current_sum <-- 0 11. return max_sum; Ï áëãüñéèìïò áõôüò áíþêåé óôçí êáôçãïñßá ôùí ëåãüìåíùí on-line áëãïñßèìùí. Ïé áëãüñéèìïé áõôïß åðåîåñãüæïíôáé ôá äåäïìýíá üðùò Ýñ ïíôáé, äçëáäþ äåí åßíáé áíüãêç ôá äåäïìýíá íá åßíáé ãíùóôü åê ôùí ðñïôýñùí. ÅðéðëÝïí, áõôüò ï ôñüðïò åðßëõóçò ðáñïõóéüæåé ôï óçìáíôéêü ðëåïíýêôçìá üôé óáñþíåé ìüíï ìßá öïñü ôá óôïé åßá ôïõ ðßíáêá. Áõôü óçìáßíåé üôé áí åîåôáóèåß êüðïéï óôïé åßï áðü ôïí áëãüñéèìï, ôüôå äåí õðüñ åé ëüãïò íá ðáñáìýíåé êüðïõ áðïèçêåõìýíï ãéáôß äåí 70
ðñüêåéôáé íá ñçóéìïðïéçèåß îáíü. Åðßóçò Ýíá ôåëéêü ðëåïíýêôçìá ôïõ áëãïñßèìïõ áõôïý åßíáé üôé óå êüèå ñïíéêþ óôéãìþ, êáôü ôç äéüñêåéá ôçò åêôýëåóçò ôïõ áëãïñßèìïõ, ï áëãüñéèìïò Ý åé õðïëïãßóåé ôï ìýãéóôï Üèñïéóìá ôçò õðïáêïëïõèßáò ôùí óôïé åßùí ðïõ Ý åé åîåôüóåé. Ç áíüëõóç áõôïý ôïõ áëãïñßèìïõ åßíáé ðïëý åýêïëç õðüèåóç. Êáèþò ï êïñìüò ôïõ áëãïñßèìïõ åßíáé Ýíáò áðëüò âñü ïò for (åíôïëþ 3), Ýðåôáé üôé ç ðïëõðëïêüôçôá åßíáé ãñáììéêþ È(n). ÔïðïèÝôçóç 8 Âáóéëéóóþí Ôï ðñüâëçìá áõôü åßíáé éóôïñéêü êáé Ý åé áðáó ïëþóåé ôïõò ìåãüëïõò ìáèçìáôéêïýò (üðùò ïé Gausss, Nauck, Guenther, Glaisher) ðñéí áðü ôá ìýóá ôïõ 19ïõ áéþíá. Ôï ðñüâëçìá æçôü íá âñåèïýí üëïé ïé äõíáôïß ôñüðïé ôïðïèýôçóçò 8 âáóéëéóóþí óå ìßá óêáêéýñá äéáóôüóåùí 8x8 ìå ôýôïéï ôñüðï þóôå íá ìçí áëëçëï-áðåéëïýíôáé. ÂÝâáéá, åßíáé ãíùóôü óôïõò óêáêéóôýò üôé äýï âáóßëéóóåò áëëçëï-áðåéëïýíôáé üôáí âñßóêïíôáé óôçí ßäéá ãñáììþ, óôçí ßäéá óôþëç Þ óôçí ßäéá äéáãþíéï. ÓõíïëéêÜ óôï ðñüâëçìá õðüñ ïõí 92 ëýóåéò, áëëü ðïëëýò áðü áõôýò èåùñïýíôáé éóïäýíáìåò êáèþò ç ìßá ìðïñåß íá ðñïêýøåé áðü ôçí Üëëç ìå âüóç ôç óõììåôñßá Þ åêôåëþíôáò ðåñéóôñïöýò êáôü 90 o. ôóé, áðü ôéò 92 ëýóåéò ðñïêýðôïõí ìüíï 12 äéáêñéôýò. Óôï åðüìåíï ó Þìá ðáñïõóéüæåôáé ìßá ëýóç ôïõ ðñïâëþìáôïò. Q Q Q Q Q Q Q Q Ðßíáêáò 1: Ìßá ëýóç ôïõ ðñïâëþìáôïò íáò ðñïöáíþò ôñüðïò åðßëõóçò ôïõ ðñïâëþìáôïò åßíáé íá åëåã èïýí åîáíôëçôéêü üëïé ïé äõíáôïß ôñüðïé ôïðïèýôçóçò ôùí 8 âáóéëéóóþí óôéò óõíïëéêü 8x8=64 èýóåéò ôçò óêáêéýñáò. ¼ìùò ï áñéèìüò ôùí äõíáôþí áõôþí ôïðïèåôþóåùí åßíáé ôåñüóôéïò, êáèþò éóïýôáé ìå ôï óõíäõáóìü ôùí 64 èýóåùí áíü 8. ñá, óýìöùíá ìå ôïí ôñüðï áõôü ðñýðåé íá åëåã èïýí 4.426.165.368 äéáöïñåôéêïß ôñüðïé ôïðïèýôçóçò. Ìåôáîý áõôþí ôùí ôñüðùí óõìðåñéëáìâüíïíôáé ðåñéðôþóåéò üðïõ óå ìßá ãñáììþ Þ óå ìßá óôþëç Þ óå ìßá äéáãþíéï ìðïñåß íá ôïðïèåôçèïýí ü é ìüíï äýï âáóßëéóóåò, áëëü áêüìç ðåñéóóüôåñåò, üðùò ôñåéò, ôýóóåñéò, êëð ìý ñé êáé ïêôþ âáóßëéóóåò. Ðñïöáíþò ï ôñüðïò áõôüò äåí åßíáé áðïäïôéêüò êáé ãé áõôü äåí åîåôüæåôáé óôç óõíý åéá. Ðñþôïò áëãüñéèìïò (ùìþ âßá) Ìßá ðñþôç âåëôßùóç óå ó Ýóç ìå ôçí ðñïçãïýìåíç ðñïöáíþ áëëü ìç ðñáêôéêþ ìýèïäï, åßíáé íá èåùñçèåß üôé äåí ìðïñïýí íá ôïðïèåôçèïýí ðåñéóóüôåñåò áðü ìßá 71
âáóßëéóóåò óôç ßäéá ãñáììþ. Ç íýá ìýèïäïò ïäçãåß óå óçìáíôéêþ âåëôßùóç êáèþò ôï ðëþèïò ôùí äõíáôþí äéáöïñåôéêþí êáôáóôüóåùí ìåéþíåôáé óå 8 8 =16.777.216. Ï áñéèìüò áõôüò ðñïêýðôåé ëáìâüíïíôáò õð üøç üôé êüèå âáóßëéóóá ìðïñåß íá êáôáëüâåé 1 èýóç ìåôáîý 8 õðïøçößùí èýóåùí, åíþ ç ôïðïèýôçóç ìßáò âáóßëéóóáò óôçí áíôßóôïé ç ãñáììþ ìðïñåß êáô áñ Þí íá èåùñçèåß áíåîüñôçôï ãåãïíüò áðü ôéò ôïðïèåôþóåéò ôùí Üëëùí âáóéëéóóþí. Ïé âáóßëéóóåò áñéèìïýíôáé áðü 1 ùò 8, üðùò åðßóçò ïé óôþëåò êáé ïé ãñáììýò ôçò óêáêéýñáò. óôù üôé ç i-ïóôþ âáóßëéóóá ôïðïèåôåßôáé óôçí i-ïóôþ ãñáììþ êáé óôç óôþëç ðïõ óõìâïëßæåôáé ìå X(i), (üðïõ 1 i 8). ñá ëýóåéò ôïõ ðñïâëþìáôïò áðïôåëïýí ôá äéáíýóìáôá (X(1),..., X(8)), ìå ôýôïéåò ôéìýò ôùí X(i), Ýôóé þóôå íá ìçí õðüñ ïõí äýï ïðïéåóäþðïôå âáóßëéóóåò ðïõ íá âñßóêïíôáé óôçí ßäéá óôþëç Þ óôçí ßäéá äéáãþíéï. Óõíåðþò, äåäïìýíçò ìßáò ôïðïèýôçóçò ãéá êüèå æåýãïò âáóéëéóóþí ðñýðåé íá ãßíïõí äýï Ýëåã ïé: (á) ãéá ôï áí âñßóêïíôáé óôçí ßäéá óôþëç, êáé (â) ãéá ôï áí âñßóêïíôáé óôçí ßäéá äéáãþíéï. Ï Ýëåã ïò ãéá íá äéáðéóôþóïõìå áí äýï âáóßëéóóåò âñßóêïíôáé óôçí ßäéá óôþëç åßíáé åýêïëïò. ÄçëáäÞ, áí ãéá ôçí i-ïóôþ êáé ôçí j-ïóôþ âáóßëéóóá éó ýåé X(i) = X(j) (üðïõ 1 i, j 8), ôüôå åßíáé ðñïöáíýò üôé ïé âáóßëéóóåò áõôýò âñßóêïíôáé óôçí ßäéá óôþëç. ¼ìùò ðþò äéáðéóôþíïõìå áí äýï âáóßëéóóåò âñßóêïíôáé óôçí ßäéá äéáãþíéï; Ï Ýëåã ïò ãéá ôï áí äýï âáóßëéóóåò áíþêïõí óôçí ßäéá äéáãþíéï âáóßæåôáé óôçí åîþò äéáðßóôùóç: Áí èåùñþóïõìå ïðïéáäþðïôå èýóç ìßáò äéáãùíßïõ ìå êáôåýèõíóç áðü åðüíù áñéóôåñü ðñïò êüôù äåîéü, ôüôå ç äéáöïñü ãñáììþ-óôþëç ðáñáìýíåé óôáèåñþ. Ãéá ðáñüäåéãìá, ãéá ôéò èýóåéò (1,1), (2,2),..., (8,8) ôçò êýñéáò äéáãùíßïõ ðïõ áêïëïõèåß áõôþí ôçí êáôåýèõíóç, ç äéáöïñü áõôþ éóïýôáé ìå 0. Åðßóçò ãéá ôéò èýóåéò (1,2), (2,3),..., (7,8) (áíôßóôïé á (2,1), (3,2),... (8,7)) ôçò äéáãùíßïõ ðïõ åßíáé åðüíù (áíôßóôïé á êüôù) áðü ôçí ðñïçãïýìåíç êýñéá äéáãþíéï, ç äéáöïñü áõôþ åßíáé -1 (áíôßóôïé á 1). Ãéá ôéò èýóåéò ôùí äéáãùíßùí ðïõ Ý ïõí êáôåýèõíóç áðü åðüíù äåîéü ðñïò êüôù áñéóôåñü ðáñáôçñïýìå üôé ðáñáìýíåé óôáèåñü ôï Üèñïéóìá ãñáììþ+óôþëç. Ãéá ðáñüäåéãìá, ãéá ôá óôïé åßá (1,8), (2,7),... (8,1) ôçò êýñéáò äéáãùíßïõ óôç óõãêåêñéìýíç êáôåýèõíóç éó ýåé ãñáììþ+óôþëç=9. Ãéá ôá óôïé åßá ôùí äéáãùíßùí åðüíù êáé êüôù áðü ôç êåíôñéêþ áõôþ äéáãþíéï éó ýåé ãñáììþ+óôþëç=8 êáé 10, áíôßóôïé á. ôóé, ìå âüóç ôéò ðáñáôçñþóåéò áõôýò, êáôáëþãïõìå üôé áí éó ýåé i X(i) = j X(j) Þ i + X(i) = j + X(j), ôüôå ç i-ïóôþ êáé ç j-ïóôþ âáóßëéóóá áíþêïõí óôçí ßäéá äéáãþíéï. Ç ëïãéêþ óõíüñôçóç Place1(k) ðïõ áêïëïõèåß, ëáìâüíåé ùò ðáñüìåôñï ôçí ôéìþ k ôçò âáóßëéóóáò ðïõ ðñüêåéôáé íá ôïðïèåôçèåß óôç óêáêéýñá, åëýã åé ôéò èýóåéò ôùí âáóéëéóóþí óôéò ðñïçãïýìåíåò ãñáììýò, êáé åðéóôñýöåé true áí ìðïñåß íá ãßíåé ç ôïðïèýôçóþ ôçò óôç óôþëç X(k). function Place1(k); 1. j <-- 1; flag <-- true; 2. while (j<k-1) and (flag=true) do 3. if (X[i]<>X[k]) or (abs(x[i]-x[k])<>abs(i-k)) 4. then j <-- j+1 5. else flag <-- false; 6. return flag 72
Ãéá íá êáèïñéóèåß áí Ýíá äéüíõóìá (X(1),..., X(8)), ìå ôéìýò ôùí X(i) (ãéá 1 i 8) óôï äéüóôçìá [1,8], áðïôåëåß ëýóç ôïõ ðñïâëþìáôïò, ðñýðåé íá åëåã- èïýí üëá ôá æåýãç ôùí âáóéëéóóþí, ïðüôå áí âñåèåß Ýóôù êáé Ýíá æåýãïò üðïõ ïé âáóßëéóóåò áëëçëï-áðåéëïýíôáé, ôüôå ôï äéüíõóìá äåí áðïôåëåß ëýóç. Ï Ýëåã- ïò áõôüò ãßíåôáé ìå ôçí êëþóç ôçò ëïãéêþò óõíüñôçóçò Solution(X), ðïõ Ý åé ðáñüìåôñï ôï äéüíõóìá X êáé åðéóôñýöåé true áí ôï X åßíáé ëýóç ôïõ ðñïâëþìáôïò. function Solution(X); 1. i <-- 1; flag <-- true; 2. while (i<=8) and (place1(i)) do i <-- i+1; 3. if i=9 then return true else return false Ç ìýèïäïò áõôþ åðßëõóçò ôïõ ðñïâëþìáôïò ìðïñåß íá õëïðïéçèåß ìå ôç ñþóç 8 öùëéáóìýíùí åíôïëþí for, üðùò öáßíåôáé óôç óõíý åéá. ¼ðùò áíáöýñèçêå, ï áëãüñéèìïò áõôüò åîåôüæåé óõíïëéêü 16.777.216 äéáöïñåôéêýò ôïðïèåôþóåéò. Ôçí ðñþôç áðü áõôýò, ôçí âñßóêåé êáé ôçí ôõðþíåé ìåôü áðü 1.299.852 äïêéìýò. procedure Queens1; 1. for X[1] <-- 1 to 8 do 2. for X[2] <-- 1 to 8 do 3. for X[3] <-- 1 to 8 do 4. for X[4] <-- 1 to 8 do 5. for X[5] <-- 1 to 8 do 6. for X[6] <-- 1 to 8 do 7. for X[7] <-- 1 to 8 do 8. for X[8] <-- 1 to 8 do 9. if Solution(X) then 10. for j <-- 1 to 8 do 11. write(x[j], ) Äåýôåñïò âåëôéùìýíïò áëãüñéèìïò ¼ðùò Ý åé Þäç áíáöåñèåß, ëýóåéò ôïõ ðñïâëþìáôïò áðïôåëïýí ôá äéáíýóìáôá (X(1),..., X(8)) ìå óôïé åßá ðïõ åßíáé äéáöïñåôéêü ìåôáîý ôïõò êáé ìðïñïýí íá ðüñïõí ôéìýò áðü 1 Ýùò 8, äçëáäþ áðïôåëïýí äéáöïñåôéêýò äéáôüîåéò ôùí áêåñáßùí 1..8. Áõôü ïäçãåß óå ìßá íýá ìýèïäï ðïõ óôçñßæåôáé óôçí åîýôáóç ðïëý ëéãüôåñùí êáôáóôüóåùí óå ó Ýóç ìå ôéò ìåèüäïõò ðïõ åîåôüóèçêáí ðñïçãïõìýíùò. Ôï ðëþèïò ôùí äõíáôþí êáôáóôüóåùí åßíáé 8!= 40.320. Ìßá Üëëç ðñïóýããéóç ôïõ ðñïâëþìáôïò, ëïéðüí, åßíáé ìå ôçí êëþóç êüðïéáò äéáäéêáóßáò Perm íá ðáñá èïýí üëåò ïé äéáöïñåôéêýò äéáôüîåéò ôùí áñéèìþí óôï äéüíõóìá (1,2,3,4,5,6,7,8). ÕðÜñ ïõí ðïëëýò ìýèïäïé åýñåóçò ôùí äéáöïñåôéêþí áõôþí äéáôüîåùí, ïé ïðïßåò ëýãïíôáé ãåííþôñéåò äéáôüîåùí (permutation generation). H åðüìåíç äéáäéêáóßá Perm óôçñßæåôáé óôçí åîþò ëïãéêþ: ÈÝôåé üëåò ôéò ôéìýò áðü 1 ùò 8 óôçí ðñþôç èýóç ôïõ äéáíýóìáôïò êáé ãéá êüèå ôýôïéá ôïðïèýôçóç, áíáäñïìéêü âñßóêåé ôéò äéáöïñåôéêýò äéáôüîåéò ôùí 7 óôïé åßùí ôïõ äéáíýóìáôïò, ôá ïðïßá áðïìýíïõí. ¼ôáí áíáäéáôá èïýí ôá 8 óôïé åßá, ôüôå ôõðþíåôáé ôï äéüíõóìá ðïõ ðñïêýðôåé áí åßíáé ëýóç ôïõ ðñïâëþìáôïò. 73
procedure Perm(i); 1. if i=n then 2. if Solution(X) then 3. for j <-- 1 to n do write(x[j], ) 4. else 5. for j <-- i to n do 6. Swap(X[i],X[j]); Perm(i+1); 7. Swap(X[j],X[i]) Ç åðüìåíç äéáäéêáóßá Queens2 áñ éêü äßíåé ôçí ôéìþ (1,2,3,4,5,6,7,8) óôï äéüíõóìá X êáé êáëþíôáò ôç äéáäéêáóßá Perm(1) âñßóêåé ôéò äéáöïñåôéêýò äéáôüîåéò ôïõ äéáíýóìáôïò, ôõðþíïíôáò áõôýò ðïõ áðïôåëïýí ëýóç óôï ðñüâëçìá. procedure Queens2; 1. for i <-- 1 to 8 do X[i] <-- i; 2. Perm(1) ¼ðùò áíáöýñèçêå, ï áñéèìüò ôùí äõíáôþí êáôáóôüóåùí åßíáé 40.320, áëëü ç ðñþôç ëýóç èá äïèåß ìåôü áðü 2.830 äïêéìýò. ¼ìùò ðýñá áðü ôï ãåãïíüò üôé ïé ëýóåéò èá âñåèïýí ìå ðïëý ëéãüôåñåò äïêéìýò óå óýãêñéóç ìå ôç äéáäéêáóßá Queens1, ç ìýèïäïò åßíáé ôá ýôåñç ãéáôß äåí ñåéüæåôáé ç óõíüñôçóç Place1 íá åêôåëåß åëýã ïõò óå ó Ýóç ìå ôéò óôþëåò áëëü ìüíï ùò ðñïò ôéò äéáãþíéïõò. Ç íýá åêäï Þ óõíüñôçóçò áõôþò, Place2, ðáñïõóéüæåôáé óôç óõíý åéá. function Place2(k); 1. j <-- 1; flag <-- true; 2. while (j<k-1) and (flag=true) do 3. if (abs(x[i]-x[k])<>abs(i-k)) then j <-- j+1 4. else flag <-- false; 5. return flag Ôñßôïò áëãüñéèìïò (ïðéóèïäñüìçóç) ÔÝëïò, ôï ðñüâëçìá ôùí 8 âáóéëéóóþí ìðïñåß íá áíôéìåôùðéóôåß ìå ôç ìýèïäï ôçò Ïðéóèïäñüìçóçò, óýìöùíá ìå ôçí ïðïßá áöïý ôïðïèåôçèåß ìßá âáóßëéóóá, óôç óõíý åéá åëýã åôáé áí õðüñ åé åðéôñåðôþ èýóç ãéá íá ôïðïèåôçèåß ç åðüìåíç. Áí âñåèåß ôýôïéá èýóç, ôüôå ï áëãüñéèìïò äéá åéñßæåôáé ôçí ôïðïèýôçóç ôçò åðüìåíçò âáóßëéóóáò, äéáöïñåôéêü åðéóôñýöåé (äçëáäþ, ïðéóèïäñïìåß) óôçí ðéï ðñüóöáôá ôïðïèåôçìýíç êáé ôçí ôïðïèåôåß óôç åðüìåíç äõíáôþ èýóç óå ó Ýóç ìå áõôþ üðïõ åß å ôïðïèåôçèåß ðñïçãïõìýíùò. Áí ôýôïéá èýóç äåí õðüñ åé, ôüôå ãßíåôáé ïðéóèïäñüìçóç óôçí áìýóùò ðñïçãïýìåíç êïê. Ç äéáäéêáóßá ðïõ õëïðïéåß áõôüí ôïí ôñüðï åðßëõóçò åßíáé ç Queens3. ÁõôÞ ñçóéìïðïéåß ôç óõíüñôçóç Place1(k), ðïõ ðåñéãñüöçêå ðñïçãïõìýíùò, ãéá íá êáèïñßóåé áí ç k-ïóôþ âáóßëéóóá ìðïñåß íá ôïðïèåôçèåß óôç óôþëç X(k). Ç êëþóç ôçò Queens3(8) äßíåé ôç ëýóç ôïõ ðñïâëþìáôïò. procedure Queens3 (n); 1. X[1] <-- 0; k <-- 1; 74
2. while k>0 do 3. X[k] <-- X[k]+1; 4. while (X[k]<=n) and (not place(k)) do 5. X[k] <-- X[k]+1; 6. if X[k]<=n then 7. if k=n then 8. for i <-- 1 to n do write(x[i], ) 9. else 10. k <-- k+1; X[k] <-- 0 11. else k <-- k-1 {* backtracking *} ÔÝôáñôïò áëãüñéèìïò (äéáêëüäùóç ìå ðåñéïñéóìü) Ï ôåëåõôáßïò ôñüðïò åðßëõóçò ìðïñåß íá âåëôéùèåß áêüìç ðåñéóóüôåñï, áí ôï ðëþèïò ôùí êáôáóôüóåùí ôïõ ðñïâëþìáôïò ïñãáíùèåß óå ìïñöþ äýíäñïõ. Óå êüèå åðßðåäï ôïõ äýíäñïõ áðü ôç ñßæá ìý ñé ôá öýëëá, ïé êüìâïé ðåñéãñüöïõí ìßá íüìéìç êáôüóôáóç ìå 0, 1, 2, êôë. âáóßëéóóåò ôïðïèåôçìýíåò þóôå íá ìçí áëëçëïáðåéëïýíôáé. ¼ëá ôá êëáäéü (v, u) ôïõ äýíäñïõ åßíáé ôýôïéá þóôå óôïí êüìâï v íá ðåñéãñüöåôáé ìßá êáôüóôáóç ãéá k âáóßëéóóåò, åíþ óôï êüìâï u íá ðåñéãñüöåôáé ìßá êáôüóôáóç ìå k + 1 âáóßëéóóåò, ç ïðïßá ðñïêýðôåé áðü ôçí ðñïçãïýìåíç ìå ôçí ðñïóèþêç ìßáò åðéðëýïí âáóßëéóóáò óå åðéôñåðôþ èýóç. ÔìÞìá ôïõ äýíäñïõ áõôïý öáßíåôáé óôï åðüìåíï ó Þìá. Ðáñáôçñïýìå üôé ç ñßæá áðåéêïíßæåé ôçí êáôüóôáóç åíüò äéáíýóìáôïò ìå 0 âáóßëéóóåò êáé Ý åé ïêôþ ðáéäéü. Ùóôüóï, ôï ðñþôï ðáéäß Ý åé ìüíïí Ýîé ðáéäéü êáèþò äåí èá Þôáí íüìéìç ìßá êáôüóôáóç ìå ìßá âáóßëéóóá óôéò èýóåéò 2,1 Þ 2,2, äåäïìýíïõ üôé Þäç õðüñ åé ìßá âáóßëéóóá óôç èýóç 1,1. Åðåêôåßíïíôáò áõôü ôï äýíäñï ðñïò ôá öýëëá, åßôå öèüíïõìå óå êáôáóôüóåéò ðïõ ïäçãïýí óå áäéýîïäï êáé óôáìáôïýìå ôéò ðåñáéôýñù ôïðïèåôþóåéò âáóéëéóóþí, åßôå ïäçãïýìáóôå óôç ëýóç. ñßæá 1...... 8 1,3 1,4... 1,8 1,3,5 1,3,6... 1,3,8 Ó Þìá 9: Ëýóç ôïõ ðñïâëþìáôïò ìå äéáêëüäùóç êáé ðåñéïñéóìü. ÁõôÞ ç ìýèïäïò Ý åé äýï ðëåïíåêôþìáôá óå ó Ýóç ìå ôéò ðñïçãïýìåíåò. Ôï ðñþôï åßíáé üôé ìåéþíåé ôï ðëþèïò ôùí êáôáóôüóåùí, üðïõ áíáæçôïýíôáé ïé ëýóåéò ôïõ ðñïâëþìáôïò, áöïý ïé êüìâïé ôïõ äýíäñïõ åßíáé ëéãüôåñïé áðü 8!=40.320. Ãéá ôçí áêñßâåéá, áí ìå ôç âïþèåéá ôïõ ðñïãñüììáôïò ìåôñþóïõìå ôïõò êüìâïõò ôïõ äýíäñïõ, ôüôå èá âñïýìå üôé åßíáé ìüíï 2057, åíþ ç ðñþôç ëýóç èá âñåèåß ìåôü ôçí åîýôáóç 114 êüìâùí. Tï äåýôåñï åßíáé, üôé ãéá íá åîåôáóèåß áí Ýíáò êüìâïò 75
ôïõ äýíäñïõ, ðïõ åêöñüæåé Ýíá äéüíõóìá ìþêïõò k, áíôéðñïóùðåýåé ìßá íüìéìç êáôüóôáóç, äåí åßíáé áðáñáßôçôï íá åëåã èïýí üëá ôá äõíáôü æåýãç ìåôáîý ôùí k âáóéëéóóþí, áëëü áñêåß íá åëåã èåß áí ç k-ïóôþ âáóßëéóóá áðåéëåß ôéò ðñïçãïýìåíåò. Áõôüò ï Ýëåã ïò ìðïñåß íá ãßíåé ðïëý áðïôåëåóìáôéêü áí óå êüèå êüìâï áðïèçêåýïõìå ôéò äéáãùíßïõò (êáé ôùí äýï êáôåõèýíóåùí) ðïõ åëýã ïíôáé áðü ôéò Þäç ôïðïèåôçìýíåò âáóßëéóóåò. Ôéò äéáãùíßïõò ðïõ Ý ïõí êáôåýèõíóç áðü êüôù áñéóôåñü ðñïò åðüíù äåîéü ôéò óõìâïëßæïõìå ìå d45, åíþ ìå d135 óõìâïëßæïõìå ôéò äéáãùíßïõò ôçò Üëëçò êáôåýèõíóçò. Ãéá íá êáôáëüâïõìå ôçí áðïôåëåóìáôéêüôçôá áõôþò ôçò ôå íéêþò, áñêåß íá óêåöèïýìå üôé óôéò ðñïçãïýìåíåò ìåèüäïõò ãéá íá åëýãîïõìå áí ìßá êáôüóôáóç áðü 8 ôïðïèåôçìýíåò âáóßëéóóåò åßíáé íüìéìç ðñýðåé íá åêôåëýóïõìå 28 åëýã ïõò, óôç åéñüôåñç ðåñßðôùóç. Óôç óõíý åéá äßíåôáé ç äéáäéêáóßá Queens4 ðïõ êùäéêïðïéåß ôçí ôåëåõôáßá ìýèïäï. Ç ëýóç ôïõ ðñïâëþìáôïò ëáìâüíåôáé äßíïíôáò ôçí êëþóç Queens4 ((0,0,0,0,0,0,0,0),0,col,d45,d135). Ðñïûðïôßèåôáé üôé ïé ìåôáâëçôýò col,d45,d135 åßíáé ôýðïõ óõíüëïõ (ð. SET of 1..15 óôçí Pascal). procedure Queens4(X; k; col,d45,d135); 1. if k=8 then 2. for j <-- 1 to 8 do write(x[j], ) 2. else 3. for j <-- 1 to 8 do 5. t1 <-- j-k; t2 <-- j+k; 6. if not (j in col) and not (t1 in d45) and 7. not (t2 in d135) then 8. col <-- col+[j]; d135 <-- d135+[t2]; 8. d45 <-- d45+[t1]; X[k+1] <-- j; 9. Queens4(X,k+1,col,d45,d135) Óôçí ðñïçãïýìåíç áíüðôõîç ôùí ëýóåùí ôïõ ðñïâëþìáôïò ôùí 8 âáóéëéóóþí äåí Ýãéíå áíáöïñü óôçí ðïëõðëïêüôçôá ôùí áíôßóôïé ùí ìåèüäùí. Áí ãåíéêåýóïõìå ôï ðñüâëçìá êáé èåùñþóïõìå üôé ðñýðåé íá ôïðïèåôçèïýí n âáóßëéóóåò óå óêáêéýñá n n ùñßò íá áëëçëï-áðåéëïýíôáé, ôüôå óå ó Ýóç ìå ôçí ðïëõðëïêüôçôá áíáöýñïíôáé óõíïðôéêü ôá åîþò. Ç ìç áíáðôõ èåßóá ( ) ìýèïäïò ðïõ áíáöýñèçêå n 2 óôçí åéóáãùãþ Ý åé ðïëõðëïêüôçôá ôçò ôüîçò, Üñá ðïëõðëïêüôçôá È(n n n ). Ç ðñþôç åîáíôëçôéêþ ìýèïäïò Ý åé ðïëõðëïêüôçôá È(n n ), åíþ ç äåýôåñç åîáíôëçôéêþ ìýèïäïò Ý åé ðïëõðëïêüôçôá Θ(n!) = Θ(n n ). Ìå áðëü ëüãéá, üëåò Ý ïõí ôçí ßäéá äñáìáôéêþ ðïëõðëïêüôçôá, ìå äéáöïñåôéêü âýâáéá óôáèåñü óõíôåëåóôþ. Ïé äýï ôåëåõôáßåò ìýèïäïé äéáêñßíïíôáé áðü åêèåôéêþ ðïëõðëïêüôçôá. Ðåñéïäåýùí ÐùëçôÞò Ôï ðñüâëçìá ôïõ ðåñéïäåýïíôïò ðùëçôþ (travelling salesperson problem, TSP) æçôü ôï óõíôïìüôåñï êýêëï ðïõ ðñýðåé íá áêïëïõèþóåé ï ðùëçôþò, þóôå áñ ßæïíôáò áðü ìßá ðüëç, íá ðåñüóåé ìßá öïñü áðü üëåò ôéò ðüëåéò êáé íá êáôáëþîåé óôçí áöåôçñßá. 76
Ç Ýííïéá ôïõ óõíôïìüôåñïõ êýêëïõ ìðïñåß íá èåùñçèåß üôé äçëþíåé ôïí êýêëï ôïõ ìéêñüôåñïõ êüóôïõò, üðïõ ôï êüóôïò ìåôñüôáé åßôå óå þñåò, åßôå óå éëéüìåôñá, åßôå óå ñþìáôá êôë.). Èá áêïëïõèþóåé ìßá ëåðôïìåñþò ðåñéãñáöþ ôïõ ôñüðïõ õëïðïßçóçò ôùí äéáöüñùí ëýóåùí ðïõ ìðïñïýí íá äïèïýí óôï ðñüâëçìá áõôü. Èåùñþíôáò üôé êüèå ðüëç åßíáé Ýíáò êüìâïò êáé üôé ïé äñüìïé ðïõ åíþíïõí äýï ðüëåéò åßíáé ïé áêìýò åíüò æõãéóìýíïõ óõíäåäåìýíïõ ãñüöïõ, ôï ðñüâëçìá ìåôáó çìáôßæåôáé óôçí åýñåóç åíüò êýêëïõ óôï ãñüöï áõôü, üðïõ ôï Üèñïéóìá ôùí âáñþí ôùí áêìþí íá åßíáé åëü éóôï. ÃåíéêÜ èåùñïýìå üôé ï ãñüöïò åßíáé ðëþñçò, äçëáäþ üëåò ïé êïñõöýò åíþíïíôáé ìåôáîý ôïõò. Ï ãñüöïò ìðïñåß íá áíáðáñáóôáèåß áðü Ýíáí ðßíáêá êüóôïõò C[1..n, 1..n], üðïõ n ï áñéèìüò ôùí êüìâùí. Ç ôéìþ êüèå óôïé åßïõ C[i, j] ôïõ ðßíáêá åßíáé ôï êüóôïò ôçò áêìþò (i, j) ôïõ ãñüöïõ, üðïõ ìüëéóôá åßíáé äõíáôüí íá éó ýåé C[i, j] C[j, i]. Ãéá ôá äéáãþíéá óôïé åßá ôïõ ðßíáêá éó ýåé C[i, i] = 0, áëëü áêüìç êáé áí ïé ôéìýò ôïõò äåí åßíáé ìçäåíéêýò, äåí ëáìâüíïíôáé õð üøç, áöïý ôï ðñüâëçìá áðáéôåß åðßóêåøç ôïõ êüèå êüìâïõ ìüíï ìßá öïñü. Áí äýï ðüëåéò äåí Ý ïõí áð åõèåßáò óýíäåóç ôüôå éó ýåé C[i, j] =, ïðüôå äåí åðçñåüæåôáé ç ëýóç ôïõ ðñïâëþìáôïò. Óôçí ðåñßðôùóç áõôþ, ç æçôïýìåíç äéáäñïìþ åßíáé Ýíáò êýêëïò Hamilton åëá ßóôïõ êüóôïõò. Ðñþôïò áëãüñéèìïò (áðëçóôßá) Ï Üðëçóôïò áëãüñéèìïò êüèå öïñü åðéëýãåé áðü ôïí ðßíáêá êüóôïõò C ôçí áêìþ åêåßíç (i, j) ðïõ Ý åé ôçí åëü éóôç ôéìþ, áðü üëåò üóåò äåí Ý ïõí ìý ñé óôéãìþò åîåôáóèåß êáé ôçí ðñïóèýôåé óôï Þäç ó çìáôéóìýíï ìïíïðüôé áí: äåí õðüñ åé óôï Þäç ó çìáôéóìýíï ìïíïðüôé Üëëç áêìþ ðïõ íá îåêéíü áðü ôïí êüìâï i Þ íá êáôáëþãåé óôïí êüìâï j, êáé ìå ôçí ðñïóèþêç ôçò áêìþò (i, j) äåí ó çìáôßæåôáé êýêëïò (åêôüò áí åßíáé ç áêìþ åêåßíç, ðïõ ìå ôçí ðñïóèþêç ôçò ó çìáôßæåôáé ï êýêëïò ðïõ ðåñíü áðü üëïõò ôïõò êüìâïõò ôïõ ãñüöïõ, äçëáäþ ï êýêëïò ðïõ åßíáé ëýóç ôïõ ðñïâëþìáôïò). Ìå âüóç ôá ðñïçãïýìåíá ðñïêýðôåé üôé áñ éêü ðñýðåé íá Ý ïõìå ôéò áêìýò ïñãáíùìýíåò Ýôóé þóôå íá âñßóêïõìå åýêïëá ôçí áêìþ ìå åëü éóôç ôéìþ êüóôïõò. Áõôü óçìáßíåé üôé ïé áêìýò ðñýðåé íá áðïèçêåõèïýí óå Ýíá óùñü. Óå ìßá ôýôïéá ðåñßðôùóç, ç åýñåóç ôçò êáôüëëçëçò áêìþò åðéôõã Üíåôáé ìå ôç âïþèåéá ôçò DeleteHeap (äåò ìüèçìá 11), ðïõ åðéóôñýöåé ôá Üêñá ôçò áêìþò (i, j) ìå ôï åëü éóôï êüóôïò, ôï ïðïßï ïíïìüæïõìå min. Ïé áêìýò ðïõ Ý ïõí Þäç ðñïóôåèåß óôï êýêëï, áðïèçêåýïíôáé óå ìßá ëßóôá ðïõ ïñßæåôáé ùò ïëéêþ ìåôáâëçôþ, ôçí ïíïìüæïõìå Current Path êáé åßíáé ôýðïõ äåßêôç Path Edge ðïõ äåß íåé ðñïò ôç ìåôáâëçôþ edge ôýðïõ åããñáöþò. Óå êüèå êüìâï, äçëáäþ, áðïèçêåýåôáé ìßá áêìþ (i, j), åíþ ï äåßêôçò next äåß íåé óôïí åðüìåíï êüìâï ôçò ëßóôáò. Ãéá íá ðñïóôåèåß ìßá áêìþ (i, j) óôï ìïíïðüôé ðïõ Ý åé áíáðôõ èåß ìý ñé óôéãìþò, ðñýðåé íá ìçí õðüñ åé óôï ìïíïðüôé áõôü (êáé åðïìýíùò óôç ëßóôá Current Path) Üëëç áêìþ ôçò ìïñöþò (i, k) Þ (k, j). Áõôü óõìâáßíåé ãéáôß óå êüèå êýêëï õðüñ åé ãéá êüèå êüìâï ìßá áêìþ ðïõ êáôáëþãåé ó áõôüí êáé ìßá ðïõ îåêéíü áðü áõôüí. ôóé óáñþíïíôáé üëá ôá óôïé åßá ôçò ëßóôáò 77
êáé áí âñåèïýí áêìýò áõôþò ôçò ìïñöþò, ôüôå ç ðñïóèþêç ôçò íýáò áêìþò áðïññßðôåôáé. ÁõôÞ ôç äéáäéêáóßá áêïëïõèåß ç ëïãéêþ óõíüñôçóç Third Edge(i,j) ðïõ åðéóôñýöåé true áí ç áêìþ (i, j) áðïôåëåß ôçí ôñßôç áêìþ ðïõ ðñïóðßðôåé óôïí êüìâï i Þ j, ïðüôå êáé áðïññßðôåôáé ç åéóáãùãþ ôçò óôï ìïíïðüôé. function Third_Ådge(u,v); 1. new(p); p <-- Current_Path; 2. counter1 <-- 0; counter2 <-- 0; 3. while (p<>nil) and (count1<=1) and (count2<=1) do 4. if p.i=u then count1 <-- count1+1; 5. if p.j=v then count2 <-- count2+1; 6. p <-- p.next 7. if (count1>=1) or (count2>=1) then return true 8. else return false Áí ç óõíüñôçóç Third Edge(i,j) åðéóôñýøåé false, ôüôå ðñýðåé íá ãßíåé Ýëåã ïò ãéá ôï ó çìáôéóìü êýêëïõ, ðñéí ðñïóôåèåß ç áêìþ (i, j) óôï ìïíïðüôé. Êýêëïò ó çìáôßæåôáé üôáí õðüñ ïõí áêìýò (j, k 1 ), (k 1, k 2 ),..., (k p, i) ðïõ íá áíþêïõí üëåò óôï ìïíïðüôé. Áí ï êýêëïò áõôüò ðåñéý åé üëïõò ôïõò êüìâïõò ôïõ ãñüöïõ, ôüôå áðïôåëåß ëýóç ôïõ ðñïâëþìáôïò, áëëéþò áðïññßðôåôáé ç åéóáãùãþ ôçò áêìþò (i, j). Ç óõíüñôçóç Find Next Node(v) åðéóôñýöåé Ýíáí êüìâï k, áí ç áêìþ (v, k) áíþêåé óôï ìïíïðüôé. Áí äåí õðüñ åé ôýôïéá áêìþ, ôüôå åðéóôñýöåé ìçäýí, ðïõ óçìáßíåé üôé óôçí ðåñßðôùóç áõôþ äåí ó çìáôßæåôáé êýêëïò êáé åðïìýíùò ç áêìþ (i, j) ìðïñåß íá åéóá èåß óôï ìïíïðüôé. function Find_Next_Node(u); 1. new(p); p <-- Current_Path; 2. while (p.next<>nil) and (p.i<>u) do p <-- p.next; 3. if p.i=u then return p.j else return 0 Ç ëïãéêþ óõíüñôçóç Cycle(i,j) ñçóéìïðïéåß ôç óõíüñôçóç Find Next Node êáé áðü ôïí êüìâï j áíáðôýóóåé ôï ìåãáëýôåñï ìïíïðüôé ðïõ ìðïñåß íá áíáðôõ èåß, Ýôóé þóôå üëåò ïé áêìýò ôïõ íá ðåñéý ïíôáé óôï Current Path. óôù üôé ôï ìïíïðüôé áõôü åßíáé ôï (j, k 1, k 2,..., k p ). Aí k p = i, ôüôå ó çìáôßæåôáé êýêëïò, ïðüôå áí ïé êüìâïé j, k 1, k 2,..., k p åßíáé áêñéâþò ïé êüìâïé ôïõ ãñüöïõ, ôüôå ôï ìïíïðüôé áõôü åßíáé ç ëýóç ôïõ ðñïâëþìáôïò. Áí üìùò ïé êüìâïé j, k 1, k 2,..., k p åßíáé ëéãüôåñïé áðü ôïõò êüìâïõò ôïõ ãñüöïõ, ôüôå áõôü óçìáßíåé üôé ó çìáôßæåôáé êýêëïò ðïõ äåí áðïôåëåß ëýóç. ôóé ç óõíüñôçóç Cycle åðéóôñýöåé true áðïññßðôïíôáò ôçí åéóáãùãþ ôçò áêìþò (i, j) óôï Current Path. Áí äåí éó ýåé k p = i êáé äåí õðüñ åé êüìâïò k p+1 ôýôïéïò þóôå ç áêìþ (k p, k p+1 ) íá ðåñéý åôáé óôï Current Path, äçëáäþ ç êëþóç ôçò óõíüñôçóçò Find Next Node(kp) åðéóôñýöåé ìçäýí, ôüôå äåí ó çìáôßæåôáé êýêëïò ìå ôçí åéóáãùãþ ôçò (i, j) êáé ç Cycle(i,j) åðéóôñýöåé false. function Cycle(u,v); 1. s <-- [u,v]; a <-- Find_Next_Node(v); 78
2. while (a<>0) and (a<>u) do 4. s <-- s+[a]; a <-- Find_Next_Node(a) 6. if (a=0) then return false 7. else if (a=u) and (Include_all(s)) then 9. cycle <-- false; solution <-- true 11. else return true; Ç óõíüñôçóç Cycle êáëåß ôç ëïãéêþ óõíüñôçóç Include all, ðïõ óêïðü Ý åé íá åëýãîåé áí óôï ìïíïðüôé ðåñéëáìâüíïíôáé üëåò ïé êïñõöýò ôïõ ãñüöïõ êáé äßíåôáé óôç óõíý åéá. Åðßóçò, ç ìåôáâëçôþ s åßíáé ôýðïõ set, åíþ ç ëïãéêþ ìåôáâëçôþ solution åßíáé êáèïëéêþ êáé èá öáíåß ç ñþóç ôçò ìýóá óôï êýñéï ðñüãñáììá. function Include_all(s); 1. Include_all <-- true; 2. while (Include_all=true) and i<=n do 3. if (not (i in s)) then Include_all <-- false; 4. i <-- i+1 ÅðïìÝíùò ç óõíïëéêþ äéáäéêáóßá ðïõ áêïëïõèåßôáé åßíáé: üóï äåí Ý åé âñåèåß ëýóç, åðéëýãåôáé ç áêìþ ìå ôï ìéêñüôåñï êüóôïò ìåôáîý áõôþí ðïõ äåí Ý ïõí åîåôáóèåß ùò ôþñá, ãßíïíôáé ïé äýï Ýëåã ïé êáé áíüëïãá, åßôå ãßíåôáé ç åéóáãùãþ ôçò áêìþò óôï Current Path åßôå áðïññßðôåôáé. Óôç óõíý åéá áêïëïõèåß ôï êýñéï ðñüãñáììá ðïõ äýíåé üëåò ôéò ðñïçãïýìåíåò óõíáñôþóåéò. Getfile åßíáé ç óõíüñôçóç ðïõ äéáâüæåé ôï ãñüöï åéóüäïõ, ï ïðïßïò áíáðáñßóôáôáé ìå ôç ìýèïäï ôïõ ðßíáêá ãåéôíßáóçò. 1. Getfile; new(current_path); Current_Path <-- nil; 2. lenght <-- 0; solution <-- false; 3. while (not solution) do 4. DeleteHeap(i,j,min); 5. if not(third_edge(i,j) and Cycle(i,j)) then 6. new(p); p.i <-- i; p.j <-- j; 7. p.next <-- Current_Path; 8. Current_Path <-- p; length <-- length+min; 9. if solution=true then 10. new(p); p <-- Current_Path; 11. while p<>nil do 12. writeln(p.i,,p.j); p <-- p.next 13. writeln( Óõíïëéêü êüóôïò,length) Áò èåùñþóïõìå ôï ãñüöï ôïõ åðïìýíïõ ó Þìáôïò. Ãéá ôçí åðßëõóç ôïõ TSP ãéá ôï ãñüöï áõôü, ï Üðëçóôïò áëãüñéèìïò áêïëïõèåß ôçí åîþò äéáäéêáóßá: Ç áêìþ ìå ôï åëü éóôï êüóôïò åßíáé ç (2,1) ìå êüóôïò 5, ðïõ åßíáé ç ðñþôç áêìþ ðïõ åéóüãåôáé óôï Current Path. Áðü áõôýò ðïõ áðïìýíïõí, ç áêìþ ìå åëü éóôï êüóôïò åßíáé ç (3,1), ðïõ üìùò äåí åéóüãåôáé óôï ìïíïðüôé, ãéáôß Þäç óå áõôü õðüñ åé ç (2,1). Ãéá ôïí ßäéï ëüãï áðïññßðôåôáé êáé ç (4,1). Óôç óõíý åéá ðáñïõóéüæïíôáé ïé áêìýò 79
ðïõ åîåôüæïíôáé, ôï êüóôïò ôïõò êáé ôï áí åéóüãïíôáé Þ áðïññßðôïíôáé (êáé ãéá ðïéü ëüãï). 1 5 20 8 10 15 6 4 10 12 8 9 9 2 3 13 Ó Þìá 10: ÐáñÜäåéãìá ãñüöïõ. ÁêìÞ Êüóôïò ÅíÝñãåéá (2,1) 5 ÅéóÜãåôáé (3,1) 6 Áðïññßðôåôáé ëüãù ôïõ ðñþôïõ åëýã ïõ (4,1) 8 Áðïññßðôåôáé ëüãù ôïõ ðñþôïõ åëýã ïõ (4,2) 8 ÅéóÜãåôáé (2,3) 9 Áðïññßðôåôáé ëüãù ôïõ ðñþôïõ åëýã ïõ (4,3) 9 Áðïññßðôåôáé ëüãù ôïõ ðñþôïõ åëýã ïõ (1,2) 10 Áðïññßðôåôáé ëüãù ôïõ äåýôåñïõ åëýã ïõ (2,4) 10 Áðïññßðôåôáé ëüãù ôïõ äåýôåñïõ åëýã ïõ (3,4) 12 ÅéóÜãåôáé (3,2) 13 Áðïññßðôåôáé ëüãù ôïõ ðñþôïõ åëýã ïõ (1,3) 15 ÅéóÜãåôáé, ôýëïò. (1,4) 20 Ï êýêëïò ðïõ ó çìáôßæåôáé áðïôåëåßôáé áðü ôéò áêìýò (2,1), (4,2), (3,4) êáé (1,3), åßíáé ï (1,3,4,2,1) êáé Ý åé ìþêïò 40. Ðáñáôçñåßôáé üôé ï êýêëïò (1,2,4,3,1) Ý åé ìþêïò 35. ÅðïìÝíùò ï áëãüñéèìïò áõôüò äåí äßíåé ðüíôá ôç âýëôéóôç ëýóç. Ãéá ôï ëüãï êáôáôüóóåôáé óôçí êáôçãïñßá ôùí ðñïóåããéóôéêþí åõñéóôéêþí Üðëçóôùí áëãïñßèìùí. Ùóôüóï ï áëãüñéèìïò áõôüò åßíáé ñþóéìïò ãéáôß åßíáé ó åôéêü ãñþãïñïò óå ó Ýóç ìå áõôïýò ðïõ èá åîåôáóèïýí óôç óõíý åéá. Ðéï óõãêåêñéìýíá, üðùò èá ìåëåôþóïõìå óôï ìüèçìá 11, ç óõíüñôçóç DeleteHeap åßíáé ôüîçò Ï(lg n), ïé óõíáñôþóåéò Third Edge, Find Next Node êáé Include All åßíáé ãñáììéêýò, åíþ ç óõíüñôçóç Cycle åßíáé ôåôñáãùíéêþò ôüîçò. Ôï ôåëåõôáßï ðñïêýðôåé áðü ôçí ðñüîç âáñüìåôñï while p<>nil do. ÔåëéêÜ ç ðïëõðëïêüôçôá ôçò ìåèüäïõ áõôþò åßíáé ôüîçò Ï(n 2 ). Ç åðüìåíç ëýóç äßíåé ðñüãìáôé ôïí êýêëï ìå ôï ìéêñüôåñï êüóôïò. Äåýôåñïò áëãüñéèìïò (äõíáìéêüò ðñïãñáììáôéóìüò) Óýìöùíá ìå üóá Ý ïõìå áíáöýñåé ãéá ôï Äõíáìéêü Ðñïãñáììáôéóìü óôéò ðáñáäüóåéò ôïõ ìáèþìáôïò ôçò Ó åäßáóçò Áëãïñßèìùí, ôï TSP ìðïñåß íá ëõèåß êüíïíôáò ñþóç ôçò óõíüñôçóçò: 80
g(i, S) = min j S (C ij + g(j, S {j})) üðïõ ôï S åßíáé óýíïëï êüìâùí. Ç óõíüñôçóç g(i, S) åðéóôñýöåé ôï êüóôïò ôïõ óõíôïìüôåñïõ ìïíïðáôéïý ðïõ îåêéíü áðü ôïí êüìâï i, ðåñíü áêñéâþò ìßá öïñü áðü üëïõò ôïõò êüìâïõò ôïõ óõíüëïõ S êáé êáôáëþãåé óôïí êüìâï 1, ðïõ ùñßò áðþëåéá ôçò ãåíéêüôçôáò ìðïñåß íá èåùñçèåß üôé ï êýêëïò áðü áõôüí îåêéíü êáé óå áõôüí êáôáëþãåé. Ç óõíüñôçóç áõôþ ìðïñåß íá õëïðïéçèåß áíáäñïìéêü ùò åîþò. function g(i,s); 1. cost <-- maxint; 2. if s=[] then g <-- C[i,1] 3. else 4. for j <-- 2 to n do 5. if j in s then 6. k <-- C[i,j]+g(j,s-[j]); 7. if k<cost then cost <-- k; 8. g <-- cost Áí äåí æçôåßôáé ìüíï ôï êüóôïò ôçò óõíôïìüôåñçò äéáäñïìþò, áëëü êáé áõôþ ç ßäéá ç äéáäñïìþ, ôüôå ðñýðåé íá ïñéóèåß ìßá óõíüñôçóç J, ôýôïéá þóôå ôï J(i, S) íá éóïýôáé ìå ôïí êüìâï j ðïõ åëá éóôïðïéåß ôï Üèñïéóìá C ij + g(j, S {j}). Ïñßæåôáé ìßá ëßóôá Next Node ôïõ ôýðïõ List Next Node, ðïõ åßíáé Ýíáò äåßêôçò ðñïò ìåôáâëçôýò ôýðïõ element, ðïõ ìå ôç óåéñü ôïõ åßíáé ôýðïõ åããñáöþò ìå ôá ðåäßá node, s, node min cost, next. Óå êüèå óôïé åßï ôçò ëßóôáò áõôþò áðïèçêåýïíôáé ï êüìâïò j (ðïõ åëá éóôïðïéåß ôï êüóôïò g(i, S)) ùò ôéìþ ôïõ ðåäßïõ node min cost, ï êüìâïò i ùò ôéìþ ôïõ ðåäßïõ node êáèþò åðßóçò êáé ôï óýíïëï S. Ãéá íá ìçí õðïëïãßæåôáé ìüíï ôï êüóôïò ôïõ ìïíïðáôéïý, áëëü íá ðñïóäéïñßæåôáé êáé ôï ßäéï ôï ìïíïðüôé ðïõ Ý åé åëü éóôï êüóôïò, ñçóéìïðïéåßôáé ìßá ðáñáëëáãþ ôçò óõíüñôçóçò g ðïõ ðåñéãñüöôçêå ðñïçãïõìýíùò. Óýìöùíá ìå ôç íýá ðáñáëëáãþ êüèå öïñü ðïõ âñßóêåôáé Ýíáò êüìâïò j ðïõ åëá éóôïðïéåß ôï êüóôïò C ij + g(j, S {j}), ðñïóôßèåôáé óôç ëßóôá Next Node Ýíáò êüìâïò ìå ðåäßá ðïõ Ý ïõí áíôßóôïé á ôéò ôéìýò i, S, j. Áí üìùò õðüñ åé Þäç óôç ëßóôá êüìâïò ìå ôéìýò óôá äýï ðñþôá ðåäßá ôéò ôéìýò i êáé S, ôüôå åíçìåñþíåôáé ç ôéìþ ôïõ ôñßôïõ ðåäßïõ êáé ãßíåôáé j. function g(i,s); 1. cost <-- maxint; 2. if s=[] then g <-- C[i,1] 3. else 4. for j <-- 2 to n do if j in s then 5. k <-- C[i,j]+g(j,s-[j]); 6. if k<cost then 7. cost <-- k; 8. if not exist_in_path(i,s,j) then 9. new(p); p.node <-- i; p.s <-- s; 81
10. next_node <-- p; p.node_min_cost <-- j; 11. p.next <-- next_node 12. g <-- cost ÌåôÜ ôçí êëþóç ôçò óõíüñôçóçò áõôþò Ý åé õðïëïãéóèåß ôï êüóôïò ôïõ óõíôïìüôåñïõ êýêëïõ êáé Ý ïõí âñåèåß ïé ôéìýò ôùí êüìâùí j ðïõ åëá éóôïðïéïýí ôá áèñïßóìáôá C ij + g(j, S {j}) ãéá êüèå êüìâï i ôïõ ãñüöïõ êáé ãéá êüèå óýíïëï êüìâùí S. Ï óõíôïìüôåñïò êýêëïò åßíáé (1, J(1, {2..N}), J(J(1, {2..N}), {2..N} J(1, {2..N})),..., 1). Ãéá íá âñåèåß ãßíåôáé áíáæþôçóç óôïõò êüìâïõò ôçò ëßóôáò Next Node, üðùò öáßíåôáé áðü ôïí êþäéêá ôçò äéáäéêáóßáò Search(i,S) ðïõ áêïëïõèåß. procedure Search(i,s); 1. new(p); p <-- next_node; 2. while ((p.next<>nil) and ((p.node<>i) or (p.s<>s))) 3. do p <-- p.next; 4. if (p.node=i) and (p.s=s) then 5. write(p.node_min_cost, ); 6. Search(p.node_min_cost,s-[p.node_min_cost]); Ãéá ôï ãñüöï ôïõ ðñïçãïýìåíïõ ó Þìáôïò, ïé ôéìýò ôçò óõíüñôçóçò J åßíáé: J(2,[3])=3 J(3,[2])=2 J(4,[2])=2 J(2,[3,4])=4 J(4,[2,3])=2 J(2,[4])=4 J(3,[4])=4 J(4,[3])=2 J(3,[2,4])=4 J(1,[2,3,4])=2 ïðüôå ï óõíôïìüôåñïò êýêëïò ðïõ âñßóêåé ï áëãüñéèìïò åßíáé (1,2,4,3,1) ìå êüóôïò 35. ÅðéëïãéêÜ, óôç âéâëéïãñáößá áíáöýñïíôáé êáé Üëëåò åðáêñéâåßò ëýóåéò ðïõ óôçñßæïíôáé óôç ìýèïäï ôçò ïðéóèïäñüìçóçò êáé óôç ìýèïäï ôçò äéáêëüäùóçò êáé ôïõ ðåñéïñéóìïý. Ôï ãåãïíüò åßíáé üôé ôï TSP åßíáé Ýíá êëáóéêü NP-complete ðñüâëçìá êáé åðïìýíùò äåí ìðïñåß êáíåßò íá åßíáé áéóéüäïîïò üôé èá âñåé áðïäïôéêïýò áëãïñßèìïõò ãéá ìßá ãåíéêþ ëýóç ôïõ. Ïé ôå íéêýò ðïõ ðåñéãñüøáìå åäþ äßíïõí ìßá áñêåôü éêáíïðïéçôéêþ ðñïóåããéóôéêþ ëýóç ãéá ìéêñýò (ó åôéêü) ôéìýò. ÅðåéäÞ ôï ðñüâëçìá Ý åé ðïëëýò ðñáêôéêýò åöáñìïãýò, Ý åé áðáó ïëþóåé ðïëëïýò åñåõíçôýò óå ìßá ðñïóðüèåéá íá ðåôý ïõí ëýóåéò óå üëï êáé ìåãáëýôåñá óôéãìéüôõðá ôïõ ðñïâëþìáôïò. Ôï 1954 ïé Dantzig, Fulkerson êáé Johnson Ýëõóáí ôï ðñüâëçìá ãéá 42 ðüëåéò ôùí ÇÐÁ, åíþ ôï 1980 ïé Padberg êáé Hong ôï Ýëõóáí ãéá 318 ðüëåéò. Ôï 1992 ïé Applegate, Bixby, Cook áðü ôï ÐáíåðéóôÞìéï Rice, êáé ï Chvatal áðü ôï ÐáíåðéóôÞìéï Rutgers âñþêáí ôç âýëôéóôç äéáäñïìþ ãéá 3.038 ðüëåéò ôùí ÇÐÁ, ñçóéìïðïéþíôáò Ýíá óýóôçìá áðü 50 óôáèìïýò åñãáóßáò. Ôï 1993 áíýâáóáí ôïí áñéèìü ôùí ðüëåùí óå 4.461 ðüëåéò, åíþ ôï 1994 áíýâáóáí ôïí áñéèìü áõôü óå 7.397 ðüëåéò. Áõôü ôï ñåêüñ åß å ìåßíåé áêáôüññéðôï ìý ñé ôï 1998. Ìå ôç âïþèåéá 3 éó õñþí ìç áíþí (Digital AlphaServer 4100 ìå 12 åðåîåñãáóôýò) êáé Ýíá óýíïëï áðü 12 ðñïóùðéêïýò õðïëïãéóôýò Pentium II, ïé ïðïßïé Ýôñå áí ôï ðñüãñáììá ãéá ðåñßðïõ 3 ìþíåò, ïé ôýóóåñéò åñåõíçôýò ðýôõ áí íá äþóïõí ëýóç óôï ðñüâëçìá ãéá ôéò 13.509 ðüëåéò ôùí ÇÐÁ ìå ðëçèõóìü ðåñéóóüôåñï áðü 500 êáôïßêïõò. 82