100% found this document useful (1 vote)
95 views62 pages

Backtracking Algorithms Analysis

The document discusses backtracking algorithms. It begins by introducing the general idea of backtracking as a technique where when a partial solution is determined to not be promising, the search backtracks to the previous node. It then provides examples of problems that can be solved using backtracking, such as the n-queens problem and placing n rooks on an n×n chessboard without any attacking each other. The document explains the general backtracking algorithm and provides pseudocode. It also discusses techniques like avoiding generation of unpromising nodes to improve efficiency.

Uploaded by

api-3810361
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
95 views62 pages

Backtracking Algorithms Analysis

The document discusses backtracking algorithms. It begins by introducing the general idea of backtracking as a technique where when a partial solution is determined to not be promising, the search backtracks to the previous node. It then provides examples of problems that can be solved using backtracking, such as the n-queens problem and placing n rooks on an n×n chessboard without any attacking each other. The document explains the general backtracking algorithm and provides pseudocode. It also discusses techniques like avoiding generation of unpromising nodes to improve efficiency.

Uploaded by

api-3810361
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

‫ﻓﺼﻞ ﭘﻨﺠﻢ‬

‫ﻋﻘﺒﮕﺮد‬
‫‪Backtracking‬‬

‫ﺗﺤﻠﻴﻞ و ﻃﺮاﺣﻲ اﻟﮕﻮرﻳﺘﻢ ﻫﺎ‬


‫ﻣﺪرس‪ :‬ﺣﺴﻴﻦ ﻣﻮﻣﻨﻲ‬
‫‪momeni@[Link]‬‬
‫اﻳﺪه‬
‫• ﭘﺮﭼﻴﻦ ﭘﺮ ﭘﻴﭻ و ﺧﻢ ﻗﺼﺮ ﻫﺎﻣﭙﺘﻮن‬
‫• اﻧﺘﺨﺎب دﻧﺒﺎﻟﻪ اي از اﺷﻴﺎء از ﻳﻚ ﻣﺠﻤﻮﻋﻪ ﻣﺸﺨﺺ ﺑﻪ ﻃﻮري ﻛﻪ‬
‫ﻣﻌﻴﺎر ﺧﺎﺻﻲ ﺑﺮآورده ﺷﻮد‬
‫• ﻣﺜﺎل‪ :‬ﻣﺴﺎﻟﻪ ‪-n‬وزﻳﺮ‬
‫– دﻧﺒﺎﻟﻪ‪ n :‬ﻣﻮﻗﻌﻴﺖ روي ﺻﻔﺤﻪ ﺷﻄﺮﻧﺞ‬
‫– ﻣﺠﻤﻮﻋﻪ‪ n2 :‬ﻣﻮﻗﻌﻴﺖ ﻣﻤﻜﻦ‬
‫– ﻣﻌﻴﺎر‪ :‬ﻫﻴﭻ دو وزﻳﺮي ﻫﻤﺪﻳﮕﺮ را ﺗﻬﺪﻳﺪ ﻧﻜﻨﻨﺪ‪.‬‬
‫• ﺟﺴﺘﺠﻮي اول ﻋﻤﻖ درﺧﺖ )ﭘﻴﻤﺎﻳﺶ ﭘﻴﺶ ﺗﺮﺗﻴﺐ درﺧﺖ(‬
‫‪٢‬‬ ‫‪Design & Analysis of Algorithms‬‬
‫‪Hossein Momeni-Spring 2007‬‬
‫ﺟﺴﺘﺠﻮي اول ﻋﻤﻖ‬
‫‪1‬‬

‫‪2‬‬ ‫‪8‬‬ ‫‪11‬‬

‫‪3‬‬ ‫‪4‬‬ ‫‪7‬‬ ‫‪9‬‬ ‫‪10‬‬ ‫‪12‬‬ ‫‪13‬‬ ‫‪16‬‬

‫‪5‬‬ ‫‪6‬‬ ‫‪14‬‬ ‫‪15‬‬

‫ﻳﻚ درﺧﺖ ﻛﻪ در آن ﮔﺮه ﻫﺎ ﻃﺒﻖ ﺟﺴﺘﺠﻮي ﻋﻤﻘﻲ ﺷﻤﺎره ﮔﺬاري ﺷﺪه اﻧﺪ‪.‬‬ ‫ﺷﻜﻞ ‪1-5‬‬

‫‪٣‬‬ ‫‪Design & Analysis of Algorithms‬‬


‫‪Hossein Momeni-Spring 2007‬‬
‫اﻟﮕﻮرﻳﺘﻢ ﺟﺴﺘﺠﻮي اول ﻋﻤﻖ‬
void depth_first_tree_search ( node v )
{
node u ;
visit v ;
for ( each child u of v )
depth_first_tree_search ( u ) ;
}

۴ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫وزﻳﺮ‬-4 ‫ﻣﺴﺎﻟﻪ‬
‫• درﺧﺖ ﻓﻀﺎي ﺣﺎﻟﺖ‬

۵ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
... ‫در ﺻﻮرت ﺑﺮرﺳﻲ ﻫﺮ راه ﺣﻞ ﻛﺎﻧﺪﻳﺪا‬

[<1, 1>, <2, 1>, <3, 1>, <4, 1>]


[<1, 1>, <2, 1>, <3, 1>, <4, 2>]
[<1, 1>, <2, 1>, <3, 1>, <4, 3>]
[<1, 1>, <2, 1>, <3, 1>, <4, 4>]
[<1, 1>, <2, 1>, <3, 2>, <4, 1>]

۶ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫ﺟﺴﺘﺠﻮ ﺑﺮاي ﻋﻼﻣﺖ ﻫﺎي ﺑﻦ ﺑﺴﺖ‬

٧ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫ﻋﻘﺒﮕﺮد )‪(Backtracking‬‬
‫• ﻋﻘﺒﮕﺮد‪ :‬رواﻟﻲ ﻛﻪ ﺗﻮﺳﻂ آن‪ ،‬ﭘﺲ از ﺗﻌﻴﻴﻦ اﻳﻨﻜﻪ ﮔﺮه اي ﻏﻴﺮ اﻣﻴﺪ‬
‫ﺑﺨﺶ ﻣﻲ ﺑﺎﺷﺪ‪ ،‬ﺑﻪ ﮔﺮه ﭘﺪر آن ﻋﻘﺒﮕﺮد ﻣﻲ ﻛﻨﻴﻢ و ﺟﺴﺘﺠﻮ را در ﻓﺮزﻧﺪ‬
‫دﻳﮕﺮي از ﮔﺮه ﭘﺪر اداﻣﻪ ﻣﻲ دﻫﻴﻢ‪.‬‬
‫• ﮔﺮه ﻏﻴﺮ اﻣﻴﺪ ﺑﺨﺶ‬
‫– ﮔﺮه اي ﻛﻪ ﻫﻨﮕﺎم ﻣﻼﻗﺎت آن درﻳﺎﺑﻴﻢ ﻛﻪ اﺣﺘﻤﺎﻻ ﻣﻨﺠﺮ ﺑﻪ راه ﺣﻞ ﻧﻤﻲ ﺷﻮد‬
‫• ﮔﺮه اﻣﻴﺪ ﺑﺨﺶ‬
‫• ﻫﺮس ﻛﺮدن درﺧﺖ ﻓﻀﺎي ﺣﺎﻟﺖ‬
‫• درﺧﺖ ﻓﻀﺎي ﺣﺎﻟﺖ ﻫﺮس ﺷﺪه‬
‫‪٨‬‬ ‫‪Design & Analysis of Algorithms‬‬
‫‪Hossein Momeni-Spring 2007‬‬
‫اﻟﮕﻮرﻳﺘﻢ ﻛﻠﻲ‬
void checknode ( node v)
{
node u ;

if ( promising ( v ) )
if ( there is a solution at v )
write the solution ;
else
for ( each child u of v )
checknode ( u ) ;
}
٩ Design & Analysis of Algorithms
Hossein Momeni-Spring 2007
‫وزﻳﺮ‬-4 ‫ﻣﺴﺎﻟﻪ‬

١٠ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫وزﻳﺮ‬-4 ‫ ﺟﺴﺘﺠﻮي ﻋﻘﺒﮕﺮد ﺑﺮاي‬:‫ﻣﺜﺎل‬
Start

1, 1 1, 2

2, 1 2, 2 2, 3 2, 4 2, 1 2, 2 2, 3 2, 4
╳ ╳ ╳ ╳ ╳

3, 1 3, 2 3, 3 3, 4 3, 1 3, 2 3, 3 3, 4 3, 1
╳ ╳ ╳ ╳ ╳ ╳ ╳

4, 1 4, 2 4, 3 4, 4 4, 1 4, 2 4, 3
╳ ╳ ╳ ╳ ╳ ╳
١١ Design & Analysis of Algorithms
Hossein Momeni-Spring 2007
‫اﺟﺘﻨﺎب از ﺗﻮﻟﻴﺪ ﮔﺮه ﻫﺎي ﻏﻴﺮ اﻣﻴﺪ ﺑﺨﺶ‬
void expand ( node v )
{
node u ;

for ( each child u of v )


if ( promising ( u ) )
if ( there is a solution at u )
write the solution ;
else
expand ( u ) ;
}
١٢ Design & Analysis of Algorithms
Hossein Momeni-Spring 2007
‫وزﻳﺮ‬-n ‫ﻣﺴﺎﻟﻪ‬
‫• ﺑﺮرﺳﻲ اﻳﻨﻜﻪ آﻳﺎ دو وزﻳﺮ ﻳﻜﺪﻳﮕﺮ را ﺗﻬﺪﻳﺪ ﻣﻲ ﻛﻨﻨﺪ‬
‫• ﺑﺮرﺳﻲ ﺳﺘﻮن ﻫﺎ‬
col(i) = col(k) –
‫• ﺑﺮرﺳﻲ ﻗﻄﺮﻫﺎ‬
col(i) – col(k) = i – k –
col(i) – col(k) = k - i –

١٣ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫اﻟﮕﻮرﻳﺘﻢ‬
‫• ﻣﺴﺎﻟﻪ‪ :‬ﻗﺮار دادن ‪ n‬وزﻳﺮ روي ﻳﻚ ﺻﻔﺤﻪ ﺷﻄﺮﻧﺞ ‪ n × n‬ﺑﻪ ﮔﻮﻧﻪ اي ﻛﻪ‬
‫ﻫﻴﭻ دو وزﻳﺮي در ﻳﻚ ﺳﻄﺮ‪ ،‬ﺳﺘﻮن و ﻳﺎ ﻗﻄﺮ ﻗﺮار ﻧﮕﻴﺮﻧﺪ‪.‬‬

‫• ورودي ﻫﺎ‪ :‬ﻋﺪد ﺻﺤﻴﺢ و ﻣﺜﺒﺖ ‪n‬‬

‫• ﺧﺮوﺟﻲ ﻫﺎ‪ :‬ﺗﻤﺎﻣﻲ راه ﻫﺎي ﻣﻤﻜﻦ ﺑﺮاي ﻗﺮار دادن ‪ n‬وزﻳﺮ در ﻳﻚ ﺻﻔﺤﻪ‬
‫ﺷﻄﺮﻧﺞ ‪ n × n‬ﺑﻪ ﻃﻮري ﻛﻪ ﻫﻴﭻ دو وزﻳﺮي ﻧﺘﻮاﻧﻨﺪ ﻳﻜﺪﻳﮕﺮ را ﺗﻬﺪﻳﺪ ﻛﻨﻨﺪ‪.‬‬
‫ﻫﺮ ﺧﺮوﺟﻲ ﺷﺎﻣﻞ آراﻳﻪ اي از اﻋﺪاد ﺻﺤﻴﺢ ﺑﻪ ﻧﺎم ‪ col‬اﺳﺖ ﻛﻪ از ﻳﻚ ﺗﺎ ‪n‬‬
‫اﻧﺪﻳﺲ ﮔﺬاري ﺷﺪه اﺳﺖ و در آن ]‪ col[i‬ﺑﻴﺎﻧﮕﺮﺳﺘﻮﻧﻲ اﺳﺖ ﻛﻪ وزﻳﺮ‬
‫ردﻳﻒ ‪ i‬اُم در آن ﻗﺮار ﻣﻲ ﮔﻴﺮد‪.‬‬

‫‪١۴‬‬ ‫‪Design & Analysis of Algorithms‬‬


‫‪Hossein Momeni-Spring 2007‬‬
‫اﻟﮕﻮرﻳﺘﻢ‬
void queens( index i)
{
if ( promising (i))
if ( i == n)
cout << col [1] through col [n] ;
else
for ( j =1; j <= n; j++) {
col [i + 1] = j ;
queens (i + 1) ;
}
}
١۵ Design & Analysis of Algorithms
Hossein Momeni-Spring 2007
‫اﻟﮕﻮرﻳﺘﻢ ﺑﺮرﺳﻲ اﻣﻴﺪ ﺑﺨﺶ ﺑﻮدن ﮔﺮه ﻫﺎ‬
bool promising ( index i )
{
index k ;
bool switch ;
k=1;
switch = true ;
while ( k < i && switch ) {
if ( col [i] = col [k] || abs ( col [i] – col [k] ) = i – k )
switch = false ;
k++ ;
}
}

١۶ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫ﻛﺎرآﻳﻲ‬
‫• ﺑﺮرﺳﻲ ﺗﻤﺎم درﺧﺖ ﻓﻀﺎي ﺣﺎﻟﺖ ) ﺗﻌﺪاد ﮔﺮه ﻫﺎي ﺑﺮرﺳﻲ ﺷﺪه(‬

‫• اﺳﺘﻔﺎده از ﻣﺰﻳﺖ اﻳﻨﻜﻪ ﻫﻴﭻ دو وزﻳﺮ ي ﻧﻤﻲ ﺗﻮاﻧﻨﺪ ﻫﻤﺰﻣﺎن در ﻳﻚ‬


‫ﺳﻄﺮ ﻳﺎ ﺳﺘﻮن ﻗﺮار ﺑﮕﻴﺮﻧﺪ‬
‫!‪1 + n + n(n-1) + n(n-1)(n-2) + … + n‬‬ ‫ﺗﻌﺪاد ﮔﺮه ﻫﺎي اﻣﻴﺪ ﺑﺨﺶ‬

‫‪١٧‬‬ ‫‪Design & Analysis of Algorithms‬‬


‫‪Hossein Momeni-Spring 2007‬‬
‫ﻣﻘﺎﻳﺴﻪ‬

١٨ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫ﻣﺴﺎﻟﻪ ﺣﺎﺻﻞ ﺟﻤﻊ زﻳﺮ ﻣﺠﻤﻮﻋﻪ ﻫﺎ‬
:2-5 ‫• ﻣﺜﺎل‬

‫ﻓﺮض ﻛﻨﻴﺪ‬
w1 = 5 w2 = 6 w3 = 10 w4 = 11 w5 = 16
‫از آﻧﺠﺎ ﻛﻪ‬
w1 + w2 + w3 = 21,
w1 + w5 = 21,
w3 + w4 = 21
:‫ﺟﻮاب ﻫﺎ ﺑﺮاﺑﺮﻧﺪ ﺑﺎ‬
{w1, w2, w3}, {w1, w5}, {w3, w4}

١٩ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫درﺧﺖ ﻓﻀﺎي ﺣﺎﻟﺖ‬
‫‪• w1 = 2, w2 = 4, w3 = 5‬‬

‫‪Start‬‬
‫‪w1‬‬ ‫‪0‬‬

‫‪w2‬‬ ‫‪0‬‬ ‫‪w2‬‬ ‫‪0‬‬

‫‪w3‬‬ ‫‪0‬‬ ‫‪w3‬‬ ‫‪0‬‬ ‫‪w3‬‬ ‫‪0‬‬ ‫‪w3‬‬ ‫‪0‬‬

‫ﻳﻚ درﺧﺖ ﻓﻀﺎي ﺣﺎﻟﺖ ﺑﺮاي ﻧﻤﻮﻧﻪ اي از ﻣﺴﺎﻟﻪ ﺣﺎﺻﻞ ﺟﻤﻊ زﻳﺮ ﻣﺠﻤﻮﻋﻪ ﻫﺎ ﻛﻪ در آن ‪.n = 3‬‬ ‫ﺷﻜﻞ ‪7-5‬‬

‫‪٢٠‬‬ ‫‪Design & Analysis of Algorithms‬‬


‫‪Hossein Momeni-Spring 2007‬‬
‫درﺧﺖ ﻓﻀﺎي ﺣﺎﻟﺖ‬
‫‪• W = 6,‬‬
‫‪w1 = 2, w2 = 4, w3 = 5‬‬
‫‪Start‬‬
‫‪w1 = 2‬‬ ‫‪w1‬‬ ‫‪0‬‬

‫‪2‬‬ ‫‪0‬‬
‫‪w2 = 4‬‬ ‫‪w2‬‬ ‫‪0‬‬ ‫‪w2‬‬ ‫‪0‬‬

‫‪6‬‬ ‫‪2‬‬ ‫‪4‬‬ ‫‪0‬‬


‫‪w3 = 5 w3‬‬ ‫‪0‬‬ ‫‪w3‬‬ ‫‪0‬‬ ‫‪w3‬‬ ‫‪0‬‬ ‫‪w3‬‬ ‫‪0‬‬

‫‪11‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪2‬‬ ‫‪9‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪0‬‬

‫ﺷﻜﻞ ‪ 8-5‬ﻳﻚ درﺧﺖ ﻓﻀﺎي ﺣﺎﻟﺖ ﺑﺮاي ﻣﺴﺎﻟﻪ ﺣﺎﺻﻞ ﺟﻤﻊ زﻳﺮ ﻣﺠﻤﻮﻋﻪ ﻫﺎ ﺑﺮاي ﻧﻤﻮﻧﻪ ﻣﺜﺎل ‪ .3-5‬ﻣﻘﺎدﻳﺮ‬
‫ذﺧﻴﺮه ﺷﺪه در ﻫﺮ ﮔﺮه ﺑﺮاﺑﺮ ﻣﺠﻤﻮع وزن ﻫﺎ ﺗﺎ آن ﮔﺮه ﻣﻲ ﺑﺎﺷﺪ‪.‬‬

‫‪٢١‬‬ ‫‪Design & Analysis of Algorithms‬‬


‫‪Hossein Momeni-Spring 2007‬‬
‫ﺑﺮرﺳﻲ اﻣﻴﺪ ﺑﺨﺶ ﺑﻮدن ﻳﻚ ﮔﺮه‬
‫• ﻣﺮﺗﺐ ﺳﺎزي وزن ﻫﺎ ﺑﻪ ﺗﺮﺗﻴﺐ ﻏﻴﺮ ﻧﺰوﻟﻲ‬
: i ‫• ﺑﺮرﺳﻲ ﮔﺮه در ﺳﻄﺢ‬
– weight + wi+1 > W
– weight + total < W

٢٢ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫درﺧﺖ ﻓﻀﺎي ﺣﺎﻟﺖ‬
‫‪• W = 13,‬‬
‫‪w1 = 3, w2 = 4, w3 = 5 w4 = 6‬‬
‫‪0‬‬
‫‪3‬‬ ‫‪0‬‬
‫‪w1 = 3‬‬

‫‪3‬‬ ‫‪0‬‬
‫‪w2 = 4‬‬ ‫‪4‬‬ ‫‪0‬‬ ‫‪4‬‬ ‫‪0‬‬

‫‪7‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪0‬‬


‫‪w3 = 5‬‬ ‫‪5‬‬ ‫‪0‬‬ ‫‪5‬‬
‫‪0‬‬
‫‪5‬‬ ‫‪0‬‬
‫‪x‬‬
‫‪12‬‬ ‫‪7‬‬ ‫‪8‬‬ ‫‪3‬‬ ‫‪9‬‬ ‫‪4‬‬
‫‪w4 = 6‬‬ ‫‪6‬‬ ‫‪0‬‬
‫‪x‬‬ ‫‪x‬‬ ‫‪x‬‬ ‫‪x‬‬ ‫‪x‬‬
‫‪13‬‬ ‫‪7‬‬

‫‪x‬‬
‫درﺧﺖ ﻫﺮس ﺷﺪه ﻓﻀﺎي ﺣﺎﻟﺖ ﺗﻮﺳﻂ ﻋﻘﺒﮕﺮد در ﻣﺜﺎل ‪ .4-5‬ﻣﻘﺎدﻳﺮ ذﺧﻴﺮه ﺷﺪه در ﻫﺮ ﮔﺮه ﺑﺮاﺑﺮ‬ ‫ﺷﻜﻞ ‪9-5‬‬
‫ﻣﺠﻤﻮع وزن ﻫﺎ ﺗﺎ آن ﮔﺮه ﻣﻲ ﺑﺎﺷﺪ‪ .‬ﺗﻨﻬﺎ ﺟﻮاب در ﮔﺮه ﺳﺎﻳﻪ ﺧﻮرده ﭘﻴﺪا ﺷﺪه اﺳﺖ‪ .‬ﮔﺮه ﻫﺎي ﻏﻴﺮ اﻣﻴﺪ ﺑﺨﺶ ﺑﺎ‬
‫ﻋﻼﻣﺖ ﺿﺮب ﻣﺸﺨﺺ ﺷﺪه اﻧﺪ‪.‬‬
‫‪٢٣‬‬ ‫‪Design & Analysis of Algorithms‬‬
‫‪Hossein Momeni-Spring 2007‬‬
‫اﻟﮕﻮرﻳﺘﻢ‬
‫• ﻣﺴﺎﻟﻪ‪ :‬ﺗﻌﻴﻴﻦ ﻫﻤﻪ ﺗﺮﻛﻴﺒﺎت اﻋﺪاد ﺻﺤﻴﺢ ﻣﻮﺟﻮد در ﻳﻚ ﻣﺠﻤﻮﻋﻪ ‪n‬‬
‫ﻋﻀﻮي‪ ،‬ﺑﻪ ﻃﻮري ﻛﻪ ﻣﺠﻤﻮع آن ﻫﺎ ﻣﺴﺎوي ﻣﻘﺪار ﻣﻌﻴﻦ ‪ W‬ﺷﻮد‪.‬‬

‫• ورودي ﻫﺎ‪ :‬ﻋﺪد ﺻﺤﻴﺢ ﻣﺜﺒﺖ ‪ ،n‬آراﻳﻪ ﻣﺮﺗﺐ ) ﻏﻴﺮ ﻧﺰوﻟﻲ( از اﻋﺪاد ﺻﺤﻴﺢ‬
‫ﻣﺜﺒﺖ ﻛﻪ از ﻳﻚ ﺗﺎ ‪ n‬اﻧﺪﻳﺲ ﮔﺬاري ﺷﺪه اﺳﺖ‪ .‬و ﻋﺪد ﺻﺤﻴﺢ ﻣﺜﺒﺖ ‪.W‬‬

‫• ﺧﺮوﺟﻲ ﻫﺎ‪ :‬ﺗﻤﺎم ﺗﺮﻛﻴﺒﺎت اﻋﺪاد ﺻﺤﻴﺢ ورودي ﻛﻪ ﻣﺠﻤﻮﻋﺸﺎن ﺑﺮاﺑﺮ ‪W‬‬
‫ﺑﺎﺷﺪ‪.‬‬

‫‪٢۴‬‬ ‫‪Design & Analysis of Algorithms‬‬


‫‪Hossein Momeni-Spring 2007‬‬
‫اﻟﮕﻮرﻳﺘﻢ‬
void sum_of_subsets ( index i,
int weight, int total )
{
if ( promising (i))
if ( weight = W )
cout << include [1] through include [i] ;
else {
include [i + 1] = “yes”;
sum_of_subsets ( i + 1, weight + w [i + 1], total - w [ i +1] ) ;
include [i + 1] = “no” ;
sum_of_subsets ( i + 1, weight, total – w [ i +1] ) ;
}
}

٢۵ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫اﻟﮕﻮرﻳﺘﻢ ﺑﺮرﺳﻲ اﻣﻴﺪ ﺑﺨﺶ ﺑﻮدن ﻳﻚ ﮔﺮه‬

bool promising ( index i )


{
return ( weight + total >=W) &&
( weight == W || weight + w [ i + 1] <= W ) ;

٢۶ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫ﭘﻴﭽﻴﺪﮔﻲ زﻣﺎﻧﻲ‬
‫• اوﻟﻴﻦ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ‬
sum_of_subset(0, 0, total)
n ‫ﻛﻪ‬
total = ∑ w[ j ]
j =1
‫• ﺗﻌﺪاد ﮔﺮه ﻫﺎي ﺑﺮرﺳﻲ ﺷﺪه‬
1 + 2 + 22 + … + 2n = 2n+1 - 1

٢٧ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫رﻧﮓ آﻣﻴﺰي ﮔﺮاف‬
‫• ﻣﺴﺎﻟﻪ ‪:m-Coloring‬‬
‫– ﻳﺎﻓﺘﻦ ﻫﻤﻪ راه ﻫﺎي ﻣﻤﻜﻦ ﺑﺮاي رﻧﮓ آﻣﻴﺰي رﺋﻮس ﻳﻚ ﮔﺮاف ﺑﺪون‬
‫ﺟﻬﺖ ﺑﺎ اﺳﺘﻔﺎده از ﺣﺪاﻛﺜﺮ ‪ m‬رﻧﮓ ﻣﺘﻔﺎوت ﺑﻪ ﻃﻮري ﻛﻪ ﻫﻴﭻ دو راس‬
‫ﻣﺠﺎوري ﻫﻢ رﻧﮓ ﻧﺒﺎﺷﻨﺪ‪.‬‬
‫• ﻣﺜﺎل ‪:5-5‬‬
‫‪v1‬‬ ‫‪v2‬‬

‫‪v4‬‬ ‫‪v3‬‬

‫ﮔﺮاﻓﻲ ﻛﻪ ﺑﺎ دورﻧﮓ ﻗﺎﺑﻞ رﻧﮓ آﻣﻴﺰي ﻧﻤﻲ ﺑﺎﺷﺪ‪ .‬ﺣﻞ ﻣﺴﺎﻟﻪ رﻧﮓ آﻣﻴﺰي ﺑﺎ ‪ 3‬رﻧﮓ‬ ‫ﺷﻜﻞ ‪10-5‬‬

‫‪٢٨‬‬ ‫‪Design & Analysis of Algorithms‬‬


‫‪Hossein Momeni-Spring 2007‬‬
‫ﻛﺎرﺑﺮد‪ :‬رﻧﮓ آﻣﻴﺰي ﻧﻘﺸﻪ‬
‫• ﮔﺮاف ﻣﺴﻄﺢ‪ :‬ﮔﺮاﻓﻲ ﻛﻪ ﺑﺘﻮان آن را در ﺻﻔﺤﻪ رﺳﻢ ﻛﺮد ﺑﻪ ﻃﻮري ﻛﻪ‬
‫ﻫﻴﭻ دو ﻳﺎﻟﻲ ﻳﻜﺪﻳﮕﺮ را ﻗﻄﻊ ﻧﻜﻨﻨﺪ‪.‬‬

‫‪v1‬‬ ‫‪v2‬‬
‫‪v2‬‬
‫‪v3‬‬ ‫‪v1‬‬
‫‪v4‬‬ ‫‪v3‬‬
‫‪v4‬‬

‫‪v5‬‬
‫‪v5‬‬

‫ﻳﻚ ﻧﻘﺸﻪ )ﺳﻤﺖ راﺳﺖ( و ﻧﻤﺎﻳﺶ ﮔﺮاف ﻣﺴﻄﺢ ﻣﺮﺑﻮط ﺑﻪ آن )ﺳﻤﺖ ﭼﭗ(‬ ‫ﺷﻜﻞ ‪11-5‬‬

‫‪٢٩‬‬ ‫‪Design & Analysis of Algorithms‬‬


‫‪Hossein Momeni-Spring 2007‬‬
‫رﻧﮓ آﻣﻴﺰي ﮔﺮاف ﺑﺎ ‪ 3‬رﻧﮓ‬
‫‪Start‬‬

‫‪v1‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬

‫‪v2‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬


‫‪v1‬‬ ‫‪v2‬‬

‫‪x‬‬
‫‪v3‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪v4‬‬ ‫‪v3‬‬
‫‪x‬‬ ‫‪x‬‬
‫‪v4‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬

‫‪x‬‬ ‫‪x‬‬
‫ﺷﻜﻞ ‪ 12-5‬ﺑﺨﺸﻲ از درﺧﺖ ﻫﺮس ﺷﺪه ﻓﻀﺎي ﺣﺎﻟﺖ ﻛﻪ ﺗﻮﺳﻂ ﻋﻘﺒﮕﺮد ﺑﺮاي رﻧﮓ آﻣﻴﺰي ﮔﺮاف ﺷﻜﻞ ‪10-5‬‬
‫ﺑﺎ ‪ 3‬رﻧﮓ ﺗﻮﻟﻴﺪ ﺷﺪه اﺳﺖ‪ .‬اوﻟﻴﻦ راه ﺣﻞ در ﮔﺮه ﺳﺎﻳﻪ ﺧﻮرده ﻳﺎﻓﺖ ﺷﺪه اﺳﺖ‪ .‬ﮔﺮه ﻫﺎي ﻏﻴﺮ اﻣﻴﺪ ﺑﺨﺶ ﺑﺎ ﻋﻼﻣﺖ‬
‫ﺿﺮب ﻧﺸﺎن داده ﺷﺪه اﻧﺪ‪.‬‬
‫‪٣٠‬‬ ‫‪Design & Analysis of Algorithms‬‬
‫‪Hossein Momeni-Spring 2007‬‬
‫اﻟﮕﻮرﻳﺘﻢ‬
‫ﻣﺴﺎﻟﻪ‪ :‬ﺗﻌﻴﻴﻦ ﻫﻤﻪ راه ﻫﺎﻳﻲ ﻛﻪ در آن رﺋﻮس ﻳﻚ ﮔﺮاف ﺑﺪون ﺟﻬﺖ را ﻣﻲ‬
‫ﺗﻮان ﺑﺎ ﺣﺪ اﻛﺜﺮ ‪ m‬رﻧﮓ ﺑﻪ ﮔﻮﻧﻪ اي رﻧﮓ آﻣﻴﺰي ﻧﻤﻮد ﻛﻪ ﻫﻴﭻ دو راس‬
‫ﻣﺠﺎوري ﻫﻢ رﻧﮓ ﻧﺒﺎﺷﻨﺪ‪.‬‬

‫ورودي ﻫﺎ‪ :‬اﻋﺪاد ﺻﺤﻴﺢ و ﻣﺜﺒﺖ ‪ n‬و ‪ m‬و ﮔﺮاف ﺑﺪون ﺟﻬﺖ ﺣﺎوي ‪ n‬راس‪.‬‬
‫ﮔﺮاف ﺗﻮﺳﻂ ﻣﺎﺗﺮﻳﺲ ﻣﺠﺎورﺗﻲ ‪ W‬ﻧﺸﺎن داده ﻣﻲ ﺷﻮد‪.‬‬

‫ﺧﺮوﺟﻲ ﻫﺎ‪ :‬ﻫﻤﻪ رﻧﮓ آﻣﻴﺰي ﻫﺎي ﻣﻤﻜﻦ ﺑﺮاي ﮔﺮاف ورودي ﺑﺎ اﺳﺘﻔﺎده از‬
‫ﺣﺪاﻛﺜﺮ ‪ m‬رﻧﮓ ﺑﻪ ﻃﻮري ﻛﻪ ﻫﻴﭻ دو راس ﻣﺠﺎوري ﻫﻢ رﻧﮓ ﻧﺒﺎﺷﻨﺪ‪.‬‬
‫ﺧﺮوﺟﻲ ﻣﺮﺑﻮط ﺑﻪ ﻫﺮ رﻧﮓ آﻣﻴﺰي ﻳﻚ آراﻳﻪ ﺑﻪ ﻧﺎم ‪ vcolor‬ﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ‬
‫از ﻳﻚ ﺗﺎ ‪ n‬اﻧﺪﻳﺲ ﮔﺬاري ﺷﺪه اﺳﺖ و در آن ]‪ vcolor[i‬ﺑﻴﺎﻧﮕﺮ رﻧﮓ‬
‫ﻣﺮﺑﻮط ﺑﻪ راس ‪ i‬ﻣﻲ ﺑﺎﺷﺪ‪.‬‬
‫‪٣١‬‬ ‫‪Design & Analysis of Algorithms‬‬
‫‪Hossein Momeni-Spring 2007‬‬
‫اﻟﮕﻮرﻳﺘﻢ‬
void m_coloring ( index i )
{
int color ;
if ( promising ( i ))
if ( i == n)
cout << vcolor[1] through vcolor[n] ;
else
for ( color = 1; color <= m; color++) {
vcolor[i + 1] = color ;
m_coloring ( i + 1) ;
}
}

٣٢ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫اﻟﮕﻮرﻳﺘﻢ ﺑﺮرﺳﻲ اﻣﻴﺪ ﺑﺨﺶ ﺑﻮدن ﻳﻚ ﮔﺮه‬
bool promising ( index i )
{
index j ;
bool switch ;
switch = true ;
j = 1;
while ( j < i && switch) {
if ( W [i] [j] && vcolor [i] == vcolor [j] )
switch = false ;
j++ ;
}
return switch ;
}
٣٣ Design & Analysis of Algorithms
Hossein Momeni-Spring 2007
‫ﭘﻴﭽﻴﺪﮔﻲ زﻣﺎﻧﻲ‬
‫• ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ در ﺑﺎﻻﺗﺮﻳﻦ ﺳﻄﺢ‬
m_coloring(0)
‫• ﺗﻌﺪاد ﮔﺮه ﻫﺎ در درﺧﺖ ﻓﻀﺎي ﺣﺎﻟﺖ‬

n +1
m −1
1+ m + m +K+ m =
2 n

m −1

٣۴ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫ﻣﺴﺎﻟﻪ دور ﻫﺎي ﻫﺎﻣﻴﻠﺘﻮﻧﻲ‬
‫• ﻳﺎد آوري‪:‬‬
‫– ﻣﺴﺎﻟﻪ ﺗﻌﻴﻴﻦ ﻛﻮﺗﺎﻫﺘﺮﻳﻦ ﺗﻮر ﺑﺎ ‪n = 20‬‬
‫• روش ﺑﺮﻧﺎﻣﻪ رﻳﺰي ﭘﻮﻳﺎ ‪ 45 ) T(n) = (n - 1)(n - 2)2n-3‬ﺛﺎﻧﻴﻪ(‬
‫• روش ﻛﻮرﻛﻮراﻧﻪ !)‪ 3800 ) (n -1‬ﺳﺎل(‬
‫• اﮔﺮ ‪n = 40‬‬
‫– روش ﺑﺮﻧﺎﻣﻪ رﻳﺰي ﭘﻮﻳﺎ ‪ 6/46‬ﺳﺎل زﻣﺎن ﺑﺮاي ﺗﻌﻴﻴﻦ ﻛﻮﺗﺎﻫﺘﺮﻳﻦ ﺗﻮر‬
‫– ﻣﺴﺎﻟﻪ ﻳﺎﻓﺘﻦ ﻫﺮ ﺗﻮري در ﮔﺮاف ) ﺑﺪون ﺗﻮﺟﻪ ﺑﻪ وزن ﺗﻮر( را ﻣﺴﺎﻟﻪ‬
‫دورﻫﺎي ﻫﺎﻣﻴﻠﺘﻮﻧﻲ ﻣﻲ ﻧﺎﻣﻴﻢ‪.‬‬

‫‪٣۵‬‬ ‫‪Design & Analysis of Algorithms‬‬


‫‪Hossein Momeni-Spring 2007‬‬
‫دور ﻫﺎﻣﻴﻠﺘﻮﻧﻲ‬
‫‪v1‬‬ ‫‪v2‬‬ ‫‪v3‬‬ ‫‪v4‬‬

‫)اﻟﻒ(‬

‫‪v8‬‬ ‫‪v7‬‬ ‫‪v6‬‬ ‫‪v5‬‬

‫‪v1‬‬ ‫‪v2‬‬ ‫‪v3‬‬


‫) ب(‬

‫‪v5‬‬ ‫‪v4‬‬

‫ﮔﺮاف )اﻟﻒ( داراي دور ﻫﺎﻣﻴﻠﺘﻮﻧﻲ ﻣﻲ ﺑﺎﺷﺪ‪ .‬ﮔﺮاف )ب( ﻓﺎﻗﺪ دور ﻫﺎﻣﻴﻠﺘﻮﻧﻲ اﺳﺖ‪.‬‬ ‫ﺷﻜﻞ ‪13-5‬‬

‫‪٣۶‬‬ ‫‪Design & Analysis of Algorithms‬‬


‫‪Hossein Momeni-Spring 2007‬‬
‫اﻟﮕﻮرﻳﺘﻢ ﻋﻘﺒﮕﺮد ﺑﺮاي ﻣﺴﺎﻟﻪ‬
‫دورﻫﺎي ﻫﺎﻣﻴﻠﺘﻮﻧﻲ‬
‫• ﻣﺴﺎﻟﻪ‪ :‬ﺗﻌﻴﻴﻦ ﻛﻠﻴﻪ دورﻫﺎي ﻫﺎﻣﻴﻠﺘﻮﻧﻲ در ﻳﻚ ﮔﺮاف ﻫﻤﺒﻨﺪ و ﺑﺪون ﺟﻬﺖ‬

‫• ورودي ﻫﺎ‪ :‬ﻋﺪد ﺻﺤﻴﺢ و ﻣﺜﺒﺖ ‪ n‬و ﮔﺮاف ﺑﺪون ﺟﻬﺖ داراي ‪ n‬راس‬

‫• ﺧﺮوﺟﻲ ﻫﺎ‪ :‬ﺗﻤﺎم ﻣﺴﻴﺮﻫﺎي ﺑﺴﺘﻪ ﻛﻪ از ﻳﻚ راس ﻣﻔﺮوض آﻏﺎز ﺷﺪه‪ ،‬ﻛﻠﻴﻪ‬
‫رﺋﻮس ﮔﺮاف را دﻗﻴﻘﺎ ﻳﻜﺒﺎر ﻣﻼﻗﺎت ﻣﻲ ﻛﻨﺪ و ﺑﻪ راس ﺷﺮوع ﺧﺘﻢ ﻣﻲ ﺷﻮد‪.‬‬
‫ﺧﺮوﺟﻲ ﻫﺮ ﻣﺴﻴﺮ‪ ،‬آراﻳﻪ اي از اﻧﺪﻳﺲ ﻫﺎي ‪ vindex‬اﺳﺖ ﻛﻪ از ﺻﻔﺮ ﺗﺎ –‪n‬‬
‫‪ 1‬اﻧﺪﻳﺲ ﮔﺬاري ﺷﺪه اﻧﺪ و در آن ]‪ vindex[i‬اﻧﺪﻳﺲ راس ‪ i‬اُم روي ﻣﺴﻴﺮ‬
‫اﺳﺖ‪ .‬اﻧﺪﻳﺲ راش ﺷﺮوع‪ vindex[0] ،‬اﺳﺖ‪.‬‬

‫‪٣٧‬‬ ‫‪Design & Analysis of Algorithms‬‬


‫‪Hossein Momeni-Spring 2007‬‬
‫اﻟﮕﻮرﻳﺘﻢ‬
void hamilton ( index i )
{
index j ;

if ( promising (i))
if ( i == n -1 )
cout << vindex [0] through vindex [n - 1] ;
else
for ( j = 2; j <= n; j++ ){
vindex[ i + 1] = j ;
hamilton (i + 1) ;
}
}

٣٨ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫ﭘﻴﭽﻴﺪﮔﻲ زﻣﺎﻧﻲ‬
‫• ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ در ﺑﺎﻻ ﺗﺮﻳﻦ ﺳﻄﺢ‬
vindex [0] = 1;
hamilton (0) ;
‫• ﺗﻌﺪاد ﮔﺮه ﻫﺎي درﺧﺖ ﻓﻀﺎي ﺣﺎﻟﺖ‬

n −1 ( n − 1) n
−1
1 + (n − 1) + (n − 1) + K + (n − 1) =
2

n−2

٣٩ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
bool promising ( index i )
{
index j ; ‫اﻟﮕﻮرﻳﺘﻢ‬
bool switch ;
if ( i == n -1 && !W [vindex [n – 1]] [vindex [0]] )
switch = false ;
else if ( i > 0 && !W [vindex [i – 1]] [vindex [i]] )
switch = false ;
else {
switch = true ;
j=1;
while ( j < i && switch ) {
if ( vindex [i] = vindex [j] )
switch = false;
j++ ;
}
}
return switch ;
}

۴٠ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫ﻣﺴﺎﻟﻪ ﻛﻮﻟﻪ ﭘﺸﺘﻲ ‪1-0‬‬
‫• ﺗﻔﺎوت ﺑﺎ ﻣﺴﺎﻳﻞ ﻗﺒﻠﻲ‪ :‬ﺑﻬﻴﻨﻪ ﺳﺎزي‬
‫– ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﺟﺴﺘﺠﻮ ﺑﻪ ﭘﺎﻳﺎن ﻧﺮﺳﺪ ﻧﻤﻲ ﺗﻮان درﻳﺎﻓﺖ ﻛﻪ آﻳﺎ ﮔﺮه اي‬
‫ﺣﺎوي ﻳﻚ راه ﺣﻞ ﻣﻲ ﺑﺎﺷﺪ ﻳﺎ ﺧﻴﺮ‪.‬‬
‫– در ﺣﻞ ﻛﺮدن ﻣﺴﺎﻳﻞ ﺑﻬﻴﻨﻪ ﺳﺎزي ﺗﻮﺳﻂ ﻋﻘﺒﮕﺮد‪ ،‬ﻫﻤﻮاره ﻓﺮزﻧﺪان ﻳﻚ‬
‫ﮔﺮه اﻣﻴﺪ ﺑﺨﺶ را ﻣﻼﻗﺎت ﻣﻲ ﻛﻨﻴﻢ‪.‬‬

‫‪۴١‬‬ ‫‪Design & Analysis of Algorithms‬‬


‫‪Hossein Momeni-Spring 2007‬‬
‫اﻟﮕﻮرﻳﺘﻢ ﻛﻠﻲ‬
void checknode ( node v )
{
node u ;

if ( value (v) is better than best )


best = value (v) ;
if ( promising (v))
for ( each child u of v )
checknode (u) ;
}

۴٢ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫ﻛﻮﻟﻪ ﭘﺸﺘﻲ‬
‫• ﮔﺮه ﻏﻴﺮ اﻣﻴﺪ ﺑﺨﺶ‬
‫‪weight ≥ W‬‬
‫• ﻣﺮﺗﺐ ﺳﺎزي ﻗﻄﻌﺎت ﺑﺮﺣﺴﺐ ‪ pi / wi‬ﺑﻪ ﺻﻮرت ﻏﻴﺮ ﻧﺰوﻟﻲ‬
‫• ﺗﻌﻴﻴﻦ ﺣﺪ ﺑﺎﻻ ﺑﺮاي ﺳﻮد ﻗﺎﺑﻞ ﺣﺼﻮل از ﮔﺴﺘﺮش دادن ﮔﺮه‬
‫‪ profit‬ﺣﺎﺻﻞ ﺟﻤﻊ ارزش ﻗﻄﻌﺎﺗﻲ ﻛﻪ ﺗﺎ آن ﮔﺮه در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﺪه اﻧﺪ‬ ‫–‬
‫‪ weight‬ﺣﺎﺻﻞ ﺟﻤﻊ اوزان آن ﻗﻄﻌﺎت‬ ‫–‬
‫ﻣﻘﺪار اوﻟﻴﻪ ﻣﺘﻐﻴﺮ ‪ bound‬را ﺑﺮاﺑﺮ ‪ profit‬ﻗﺮار ﻣﻲ دﻫﻴﻢ‬ ‫–‬
‫ﻣﻘﺪار اوﻟﻴﻪ ﻣﺘﻐﻴﺮ ‪ totweight‬را ﺑﺮاﺑﺮ ‪ weight‬ﻗﺮار ﻣﻲ دﻫﻴﻢ‬ ‫–‬
‫ﻫﺮ ﺑﺎر ﺑﻪ روش ﺣﺮﻳﺼﺎﻧﻪ ﻳﻚ ﻗﻄﻌﻪ ﺑﺮداﺷﺘﻪ و ارزش آن را ﺑﻪ ‪ bound‬و وزﻧﺶ را‬ ‫–‬
‫ﺑﻪ ‪ totweight‬اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢ ﺗﺎ ﺑﻪ ﻗﻄﻌﻪ اي ﺑﺮﺳﻴﻢ ﻛﻪ در ﺻﻮرت ﺑﺮداﺷﺘﻦ آن‬
‫‪ totweight‬از ‪ W‬ﺑﻴﺸﺘﺮ ﺷﻮد‪ .‬در اﻳﻦ ﺻﻮرت ﻛﺴﺮي از آن را ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻇﺮﻓﻴﺖ‬
‫ﺑﺎﻗﻴﻤﺎﻧﺪه ﺑﺮداﺷﺘﻪ و ارزش آن ﻛﺴﺮ را ﺑﻪ ‪ bound‬اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢ‪.‬‬
‫‪۴٣‬‬ ‫‪Design & Analysis of Algorithms‬‬
‫‪Hossein Momeni-Spring 2007‬‬
‫ﻛﻮﻟﻪ ﭘﺸﺘﻲ‬
‫• ﻓﺮض ﻛﻨﻴﺪ ﮔﺮه در ﺳﻄﺢ ‪ i‬ﺑﺎﺷﺪ و ﮔﺮه واﻗﻊ در ﺳﻄﺢ ‪ ،k‬ﮔﺮه اي ﺑﺎﺷﺪ ﻛﻪ ﺣﺎﺻﻞ ﺟﻤﻊ‬
‫اوزان را از ‪ W‬ﺑﻴﺸﺘﺮ ﻛﻨﺪ‪ .‬در اﻳﻦ ﺻﻮرت‪:‬‬
‫‪k −1‬‬
‫‪totoweight = weight +‬‬ ‫‪∑w‬‬
‫‪j =i +1‬‬
‫‪j‬‬

‫‪k −1‬‬
‫‪pk‬‬
‫* ) ‪bound = ( profit + ∑ p j ) + (W − totweight‬‬
‫‪j =i +1‬‬ ‫‪wk‬‬
‫ﺑﻬﺮه ﺣﺎﺻﻞ از‬ ‫ﻇﺮﻓﻴﺖ ﺑﺎﻗﻴﻤﺎﻧﺪه‬ ‫ﺑﻬﺮه واﺣﺪ وزن‬
‫‪ k-1‬ﻗﻄﻌﻪ ﻧﺨﺴﺖ‬ ‫ﺑﺮاي ﻗﻄﻌﻪ ‪ k‬اُم‬ ‫ﺑﺮاي ﻗﻄﻌﻪ ‪ k‬اُم‬

‫• ﮔﺮه ﻏﻴﺮ اﻣﻴﺪ ﺑﺨﺶ‬


‫‪bound ≤ maxprofit‬‬

‫‪۴۴‬‬ ‫‪Design & Analysis of Algorithms‬‬


‫‪Hossein Momeni-Spring 2007‬‬
6-5 ‫ﻣﺜﺎل‬
• n = 4, W = 16

i pi wi pi / wi
1 $40 2 $20

2 $30 5 $6

3 $50 10 $5

4 $10 5 $2

۴۵ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
(0, 0)
$0
0
‫ﻣﺜﺎل‬
$115

maxprofit = 0
profit = 0
weight = 0
3−1
totoweight = weight + ∑w
j = 0 +1
j = 0+2+5 = 7

3−1
p3
bound = ( profit + ∑
j = 0 +1
p j ) + (W − totweight ) *
w3
$50
= $0 + $40 + $30 + (16 − 7) * = $115
10
.‫ ﻣﻲ ﺑﺎﺷﺪ‬maxprofit = 0 ‫( و ﺣﺪش ﺑﺰرﮔﺘﺮ از‬W) 16 ‫اﻳﻦ ﮔﺮه اﻣﻴﺪ ﺑﺨﺶ ﻣﻲ ﺑﺎﺷﺪ زﻳﺮا وزﻧﺶ ﻛﻤﺘﺮ از‬

۴۶ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
(0, 0)
$0
0
‫ﻣﺜﺎل‬
Item 1 $115

($40, 2) (1, 1)
$40
2
$115

profit =$0 + $40 = $40


weight = 0 + 2 = 2
maxprofit = $40
3−1
totoweight = weight + ∑w
j =1+1
j = 0+2+5 = 7

3−1
p3
bound = ( profit + ∑
j =1+1
p j ) + (W − totweight ) *
w3
$50
= $0 + $40 + $30 + (16 − 7) * = $115
10
.‫ ﻣﻲ ﺑﺎﺷﺪ‬maxprofit = 40 ‫( و ﺣﺪش ﺑﺰرﮔﺘﺮ از‬W) 16 ‫اﻳﻦ ﮔﺮه اﻣﻴﺪ ﺑﺨﺶ ﻣﻲ ﺑﺎﺷﺪ زﻳﺮا وزﻧﺶ ﻛﻤﺘﺮ از‬

۴٧ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
(0, 0)
$0
0
‫ﻣﺜﺎل‬
Item 1 $115

($40, 2) (1, 1)
$40
2
$115
Item 2
(2, 1)
($30, 5)
$70 profit =$40 + $30 = $70
7
$115 weight = 2 + 5 = 7
maxprofit = $70

3−1
totoweight = weight + ∑w
j = 2 +1
j =7

$50
bound = $70 + (16 − 7) * = $115
10

.‫ ﻣﻲ ﺑﺎﺷﺪ‬maxprofit = 70 ‫( و ﺣﺪش ﺑﺰرﮔﺘﺮ از‬W) 16 ‫اﻳﻦ ﮔﺮه اﻣﻴﺪ ﺑﺨﺶ ﻣﻲ ﺑﺎﺷﺪ زﻳﺮا وزﻧﺶ ﻛﻤﺘﺮ از‬

۴٨ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
(0, 0)
$0
0
‫ﻣﺜﺎل‬
Item 1 $115

($40, 2) (1, 1)
$40
2
$115
Item 2
(2, 1)
($30, 5)
$70 profit =$70 + $50 = $120
7
$115 weight = 7 + 10 = 17
Item 3 (3, 1)
maxprofit = $70
($50, 10) $120
17

‫( اﺳﺖ و ﺑﻨﺎﺑﺮاﻳﻦ ﺣﺪش را ﻣﺤﺎﺳﺒﻪ ﻧﻤﻲ ﻛﻨﻴﻢ‬W) 16 ‫اﻳﻦ ﮔﺮه اﻣﻴﺪ ﺑﺨﺶ ﻧﻤﻲ ﺑﺎﺷﺪ زﻳﺮا وزﻧﺶ ﺑﻴﺸﺘﺮ از‬

۴٩ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
(0, 0)

Item 1
‫ﻣﺜﺎل‬ $0
0
$115

($40, 2) (1, 1)
$40
2
$115
Item 2
(2, 1)
($30, 5)
$70 profit =$70
7
$115 weight = 7
Item 3 (3, 1) (3, 2)
maxprofit = $70
($50, 10) $120 $70
17 7 5 −1
$80 bound = profit + ∑p
j =3+1
j = $70 + $10 = $80
x

‫ ﻣﻲ ﺑﺎﺷﺪ‬maxprofit = $70 ‫( اﺳﺖ و ﺣﺪش ﺑﺰرﮔﺘﺮ از‬W) 16 ‫اﻳﻦ ﮔﺮه اﻣﻴﺪ ﺑﺨﺶ ﻣﻲ ﺑﺎﺷﺪ زﻳﺮا وزﻧﺶ ﻛﻤﺘﺮ از‬

۵٠ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
(0, 0)

Item 1
‫ﻣﺜﺎل‬ $0
0
$115

($40, 2) (1, 1)
$40
2
$115
Item 2
(2, 1)
($30, 5)
$70
7
$115
Item 3 (3, 1) (3, 2)
($50, 10) $120 $70
17 7
$80
(4, 1)
x
Item 4 $80
($10, 5) 12
$80

x
‫ ﻧﻤﻲ ﺑﺎﺷﺪ‬maxprofit = $80 ‫اﻳﻦ ﮔﺮه اﻣﻴﺪ ﺑﺨﺶ ﻧﻤﻲ ﺑﺎﺷﺪ زﻳﺮا ﺣﺪش ﺑﺰرﮔﺘﺮ از‬

۵١ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
(0, 0)

Item 1
‫ﻣﺜﺎل‬ $0
0
$115

($40, 2) (1, 1)
$40
2
$115
Item 2
(2, 1)
($30, 5)
$70
7
$115
Item 3 (3, 1) (3, 2)
($50, 10) $120 $70
17 7
$80
(4, 1) (4, 2)
x
Item 4 $80 $70
($10, 5) 12 7
$80 $70

x x
‫ ﻣﻲ ﺑﺎﺷﺪ‬maxprofit = $80 ‫اﻳﻦ ﮔﺮه اﻣﻴﺪ ﺑﺨﺶ ﻣﻲ ﺑﺎﺷﺪ زﻳﺮا ﺣﺪش ﻛﻮﭼﻜﺘﺮ از‬

۵٢ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
(0, 0)

Item 1
‫ﻣﺜﺎل‬ $0
0
$115

($40, 2) (1, 1)
$40
2
$115
Item 2
(2, 1) (2, 2)
($30, 5)
$70 $40
7 2
$115 $98
Item 3 (3, 1) (3, 2)
($50, 10) $120 $70
17 7
$80
(4, 1) (4, 2)
x
Item 4 $80 $70
($10, 5) 12 7
$80 $70

x x
‫ ﻣﻲ ﺑﺎﺷﺪ‬maxprofit = $80 ‫(ﺣﺪش ﻛﻮﭼﻜﺘﺮ از‬W) 16 ‫اﻳﻦ ﮔﺮه اﻣﻴﺪ ﺑﺨﺶ ﻣﻲ ﺑﺎﺷﺪ زﻳﺮا وزﻧﺶ ﻛﻤﺘﺮ از‬

۵٣ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
(0, 0)

Item 1
‫ﻣﺜﺎل‬ $0
0
$115

($40, 2) (1, 1)
$40
2
$115
Item 2
(2, 1) (2, 2)
($30, 5)
$70 $40
7 2
$115 $98
Item 3 (3, 1) (3, 2) (3, 3)
($50, 10) $120 $70 $90
17 7 12
$80 $98
(4, 1) (4, 2)
x
Item 4 $80 $70
($10, 5) 12 7
$80 $70

x x
‫ ﻣﻲ ﺑﺎﺷﺪ‬maxprofit = $80 ‫(ﺣﺪش ﻛﻮﭼﻜﺘﺮ از‬W) 16 ‫اﻳﻦ ﮔﺮه اﻣﻴﺪ ﺑﺨﺶ ﻣﻲ ﺑﺎﺷﺪ زﻳﺮا وزﻧﺶ ﻛﻤﺘﺮ از‬

۵۴ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
(0, 0)

Item 1
‫ﻣﺜﺎل‬ $0
0
$115

($40, 2) (1, 1)
$40
2
$115
Item 2
(2, 1) (2, 2)
($30, 5)
$70 $40
7 2
$115 $98
Item 3 (3, 1) (3, 2) (3, 3)
($50, 10) $120 $70 $90
17 7 12
$80 $98
(4, 1) (4, 2) (4, 3)
x
Item 4 $80 $70 $100
($10, 5) 12 7 17
$80 $70

x x x
‫(و ﺑﻨﺎﺑﺮاﻳﻦ ﺣﺪش ﻣﺤﺎﺳﺒﻪ ﻧﻤﻲ ﺷﻮد‬W) 16 ‫اﻳﻦ ﮔﺮه اﻣﻴﺪ ﺑﺨﺶ ﻧﻤﻲ ﺑﺎﺷﺪ زﻳﺮا وزﻧﺶ ﺑﻴﺸﺘﺮ از‬

۵۵ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
(0, 0)

Item 1
‫ﻣﺜﺎل‬ $0
0
$115

($40, 2) (1, 1)
$40
2
$115
Item 2
(2, 1) (2, 2)
($30, 5)
$70 $40
7 2
$115 $98
Item 3 (3, 1) (3, 2) (3, 3)
($50, 10) $120 $70 $90
17 7 12
$80 $98
(4, 1) (4, 2) (4, 3) (4, 4)
x
Item 4 $80 $70 $100 $90
($10, 5) 12 7 17 12
$80 $70 $90

x x x x
‫ ﻧﻤﻲ ﺑﺎﺷﺪ‬maxprofit = 90 ‫اﻳﻦ ﮔﺮه اﻣﻴﺪ ﺑﺨﺶ ﻧﻤﻲ ﺑﺎﺷﺪ زﻳﺮا ﺣﺪش ﺑﺰرﮔﺘﺮ از‬

۵۶ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
(0, 0)

Item 1
‫ﻣﺜﺎل‬ $0
0
$115

($40, 2) (1, 1)
$40
2
$115
Item 2
(2, 1) (2, 2)
($30, 5)
$70 $40
7 2
$115 $98
Item 3 (3, 1) (3, 2) (3, 3) (3, 4)
($50, 10) $120 $70 $90 $40
17 7 12 2
$80 $98 $50
(4, 1) (4, 2) (4, 3) (4, 4)
x x
Item 4 $80 $70 $100 $90
($10, 5) 12 7 17 12
$80 $70 $90

x x x x
‫ ﻧﻤﻲ ﺑﺎﺷﺪ‬maxprofit = 90 ‫اﻳﻦ ﮔﺮه اﻣﻴﺪ ﺑﺨﺶ ﻧﻤﻲ ﺑﺎﺷﺪ زﻳﺮا ﺣﺪش ﺑﺰرﮔﺘﺮ از‬

۵٧ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫اﻟﮕﻮرﻳﺘﻢ‬
‫• ﻣﺴﺎﻟﻪ‪ n :‬ﻗﻄﻌﻪ ﻛﻪ ﻫﺮ ﻳﻚ داراي وزن و ارزش ﻣﺸﺨﺼﻲ ﻣﻲ ﺑﺎﺷﺪ‪ ،‬داده ﺷﺪه اﺳﺖ‪ .‬وزن‬
‫و ارزش ﻫﺮ ﻗﻄﻌﻪ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ و ﻣﺜﺒﺖ ﻣﻲ ﺑﺎﺷﺪ‪ .‬ﻋﻼوه ﺑﺮاﻳﻦ‪ ،‬ﻋﺪد ﺻﺤﻴﺢ و ﻣﺜﺒﺖ‬
‫‪ W‬داده ﺷﺪه اﺳﺖ‪ .‬ﻣﻄﻠﻮب اﺳﺖ ﺗﻌﻴﻴﻦ ﻣﺠﻤﻮﻋﻪ اي از ﻗﻄﻌﺎت ﺑﺎ ﺣﺪاﻛﺜﺮ ارزش ﺑﻪ ﺷﺮط‬
‫آن ﻛﻪ ﺣﺎﺻﻞ ﺟﻤﻊ اوزان آﻧﻬﺎ از ‪ W‬ﺑﻴﺸﺘﺮ ﻧﺒﺎﺷﺪ‪.‬‬

‫• ورودي ﻫﺎ‪ :‬اﻋﺪاد ﺻﺤﻴﺢ و ﻣﺜﺒﺖ ‪ n‬و ‪ .W‬آراﻳﻪ ﻫﺎي ‪ w‬و ‪ p‬ﻛﻪ ﻫﺮ ﻛﺪام از ‪ 1‬ﺗﺎ ‪n‬‬
‫اﻧﺪﻳﺲ ﮔﺬاري ﺷﺪه اﻧﺪ و ﺣﺎوي اﻋﺪاد ﺻﺤﻴﺢ و ﻣﺜﺒﺘﻲ ﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ ﻛﻪ ﺑﺮ اﺳﺎس ﻣﻘﺎدﻳﺮ‬
‫‪ pi / wi‬ﺑﻪ ﺻﻮرت ﻏﻴﺮ ﻧﺰوﻟﻲ ﻣﺮﺗﺐ ﺷﺪه اﻧﺪ‪.‬‬

‫• ﺧﺮوﺟﻲ ﻫﺎ‪ :‬آراﻳﻪ ‪ bestset‬ﻛﻪ از ‪ 1‬ﺗﺎ ‪ n‬اﻧﺪﻳﺲ ﮔﺬاري ﺷﺪه اﺳﺖ و در آن ﻣﻘﺪار‬
‫]‪ bestset[i‬در ﺻﻮرﺗﻲ ”‪ “yes‬ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﻗﻄﻌﻪ ‪ i‬اُم در ﻣﺠﻤﻮﻋﻪ ﺑﻬﻴﻨﻪ ﮔﻨﺠﺎﻧﺪه ﺷﻮد‪.‬‬
‫ﻋﺪد ﺻﺤﻴﺢ ‪ maxprofit‬ﻛﻪ ارزش ﺑﻴﺸﻴﻨﻪ را ﻧﺸﺎن ﻣﻲ دﻫﺪ‪.‬‬

‫‪۵٨‬‬ ‫‪Design & Analysis of Algorithms‬‬


‫‪Hossein Momeni-Spring 2007‬‬
‫اﻟﮕﻮرﻳﺘﻢ‬
void knapsack ( index i, int profit, int weight )
{
if ( weight <= W && profit > maxprofit ) {
maxprofit = profit ;
numbest = i ;
bestset = include ;
}
if ( promising (i)) {
include [i + 1] = “yes” ;
knapsack (i + 1, profit + p [i + 1], weight + w [i + 1] ) ;
include [i + 1] = “no” ;
knapsack ( i + 1, profit, weight) ;
}
}

۵٩ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
bool promising ( index i)
{
index j, k ;
int totweight ;
‫اﻟﮕﻮرﻳﺘﻢ‬
float bound ;

if ( weight >= W)
return false ;
else {
j=i+1;
bound = profit ;
totweight = weight ;
while ( j <= n && totweight + w [j] <= W) {
totweight = totweight + w [j] ;
bound = bound + p [j];
j++;
}
k = j;
if ( k <= n)
bound = bound + ( W – totweight * p [k] / w [k] ;
return bound > maxprofit ;
}
}
۶٠ Design & Analysis of Algorithms
Hossein Momeni-Spring 2007
‫ﭘﻴﭽﻴﺪﮔﻲ زﻣﺎﻧﻲ‬
2n+1-1 ‫• ﺗﻌﺪاد ﮔﺮه ﻫﺎي درﺧﺖ ﻓﻀﺎي ﺣﺎﻟﺖ‬
‫• ﻣﺜﺎل از ﺑﺪﺗﺮﻳﻦ ﺣﺎﻟﺖ‬
pi = 1 wi = 1 1 ≤ i ≤ n – 1
pn = n wn = n

۶١ Design & Analysis of Algorithms


Hossein Momeni-Spring 2007
‫ﻣﻘﺎﻳﺴﻪ اﻟﮕﻮرﻳﺘﻢ ﺑﺮﻧﺎﻣﻪ رﻳﺰي ﭘﻮﻳﺎ و ﻋﻘﺒﮕﺮد ﺑﺮاي‬
‫ﻣﺴﺎﻟﻪ ﻛﻮﻟﻪ ﭘﺸﺘﻲ ‪1-0‬‬
‫• اﻟﮕﻮرﻳﺘﻢ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﭘﻮﻳﺎ در ﺑﺪﺗﺮﻳﻦ ﺣﺎﻟﺖ‬
‫))‪O(minimum(2n, nW‬‬
‫• اﻟﮕﻮرﻳﺘﻢ ﻋﻘﺒﮕﺮد‬
‫)‪Θ(2n‬‬
‫• ﻫﻮروﻳﺘﺰ و ﺳﺎﻫﻨﻲ ﻧﺸﺎن داده اﻧﺪ ﻛﻪ اﻟﮕﻮرﻳﺘﻢ ﻋﻘﺒﮕﺮد ﻣﻌﻤﻮﻻ ﻧﺴﺒﺖ ﺑﻪ‬
‫اﻟﮕﻮرﻳﺘﻢ ﺑﺮﻧﺎﻣﻪ رﻳﺰي ﭘﻮﻳﺎ ﻛﺎرآﻳﻲ ﺑﻴﺸﺘﺮي دارد‪.‬‬
‫• ﺗﺮﻛﻴﺐ روش ﺗﻘﺴﻴﻢ و ﺣﻞ و ﺑﺮﻧﺎﻣﻪ رﻳﺰي ﭘﻮﻳﺎ ﺗﻮﺳﻂ ﻫﻮروﻳﺘﺰ و ﺳﺎﻫﻨﻲ‬
‫ﺑﺮاي ﺣﻞ ﻣﺴﺎﻟﻪ ﻛﻮﻟﻪ ﭘﺸﺘﻲ ‪1-0‬‬
‫– در ﺑﺪﺗﺮﻳﻦ ﺣﺎﻟﺖ )‪O(2n/2‬‬
‫– اﻳﻦ اﻟﮕﻮرﻳﺘﻢ ﻣﻌﻤﻮﻻ ﻛﺎرآﻳﻲ ﺑﻴﺸﺘﺮي ﻧﺴﺒﺖ ﺑﻪ ﻋﻘﺐ ﮔﺮد دارد‪.‬‬

‫‪۶٢‬‬ ‫‪Design & Analysis of Algorithms‬‬


‫‪Hossein Momeni-Spring 2007‬‬

You might also like