77e6f1042f9b3ecef1084c4cab23c024.ppt
- Количество слайдов: 7
Приёмы сокращения перебора Метод ветвей и границ Динамическое программирование
Динамическое программирование Числа Фибоначчи f(0)=f(1)=1 f(n)=f(n-1)+f(n-2), при n>1 n 0 f(n) 1 1 1 2 2 3 3 4 5 5 8 6 13 7 21
Динамическое программирование Задача. Найти количество кратчайших путей из левого верхнего в правый нижний угол. c[i, j] = c[i-1, j] + c[i, j-1]
Сокращение перебора n n За счёт симметрии задачи Метод ветвей и границ Задача раски графа int colors[]; function paint. Graph(int n, int k) { // раскрасить n первых вершин в k цветов if( n ) { // осталось раскрасить n вершин int i; for(i=1; i<=k; i++){ colors[n]=i; if( admis. Color(n, i) ) { paint. Graph(n-1); } } } else { // получили раску save. Colors(); } }
Сокращение перебора Задача раски графа Сокращение перебора за счёт симметрии задачи int colors[]; int max. Color; function paint. Graph(int n) { // раскрасить n первых вершин if( n ) { // осталось раскрасить n вершин int i; for(i=1; i<=max. Color+1; i++){ colors[n]=i; if( admis. Color(n, i) ) { if(i > max. Color) { max. Color++; paint. Graph(n-1); max. Color--; } else paint. Graph(n-1); } } } else { // получили раску if( max. Color < best. Color. Number ) { best. Color. Number= max. Color; save. Colors(); } } }
Сокращение перебора Задача раски графа Метод ветвей и границ int colors[]; int max. Color; function paint. Graph(int n) { // раскрасить n первых вершин if( n ) { // осталось раскрасить n вершин int i; int limit=min(best. Color. Number-1, max. Color+1); for(i=1; i<=limit; i++){ colors[n]=i; if( admis. Color(n, i) ) { if(i > max. Color) { max. Color++; paint. Graph(n-1); max. Color--; } else paint. Graph(n-1); } } } else { // получили раску if( max. Color < best. Color. Number ) { best. Color. Number= max. Color; save. Colors(); } } }
Порядок перебора n n Имеет значение порядок в котором мы выбираем вершины Распространение ограничений
77e6f1042f9b3ecef1084c4cab23c024.ppt