Teoría de programación dinámica: Un artículo con usted a fondo para conocer la subestructura óptima, no hay efecto posterior y repite las preguntas

Teoría de programación dinámica: Un artículo con usted a fondo para conocer la subestructura óptima, no hay efecto posterior y repite las preguntas

¿Qué tipo de problemas se pueden resolver mediante programación dinámica? proceso de pensamiento general para resolver el problema de programación dinámica es lo que?

Un modelo teórico para explicar las tres características

Programación Dinámica para resolver el problema de qué reglas a seguir? Resumió como "un modelo de características de tres"

Un modelo: modelo de programación dinámica para resolver el problema, el modelo se define como "solución de decisión óptima de múltiples etapas."

El proceso general para resolver el problema de optimización de la programación dinámica, resolución de problemas, toma de decisiones necesidad de pasar por varias fases, cada una correspondiente a un conjunto de la etapa de toma de decisiones del estado, y luego buscar una secuencia grupo de toma de decisiones, después de lo cual la secuencia de toma de decisiones en grupo, para producir la solución final deseada la solución óptima

Tres características: subestructura óptima, y ​​después de repetidas sin subproblemas

1, subestructura óptima

La solución óptima comprende una solución sub óptima del problema, es decir, el estado se puede derivar etapa posterior a través de una etapa anterior estado

2. No secuela

Derivamos el estado de fase cuando el estado ocupa sólo el valor de la etapa anterior, no se preocupan por la forma en que esto es un paso a paso deducido, sólo para satisfacer el problema del modelo de programación dinámica se ha mencionado anteriormente, la básica se reunirán ningún efecto después de la

3. sub-problemas de repetición

Diferente secuencia de decisiones, llegar a una determinada fase de la misma, puede resultar en estado duplicado

"Característica modelo A tres" análisis de ejemplos

A n- *n-matriz W [n][n], son enteros positivos almacenados en las necesidades de la matriz se mueva desde la parte superior izquierda a las piezas de esquina inferior derecha, cada uno sólo un derecho o el movimiento hacia abajo, los números se suman cada camino a través de la sede hacer la longitud del trayecto, la longitud del camino más corto desde la parte superior izquierda a la inferior derecha es ¿cuánto?

1 3 5 9

2 1 3 4

5 2 6 7

6843 (1 es el punto de partida, punto 3 final)

La cuestión de si el "modelo"?

A partir de (0,0) a (n-1, n-1 ) la suma de los pasos 2*(n-1)paso, cada etapa tiene que bajar a la derecha o dos tipos de decisiones, cada etapa que corresponde a un conjunto de estados, el estado se define como min_dist (i, j), i denota una fila, j representa una columna, min_dist (i, j) representa el valor de la expresión más corta longitud de la trayectoria de la (0,0) a (I, j), por lo que esta es una decisión multi-etapa la solución óptima, en línea con el modelo de programación dinámica

La etapa inicial 0: 1

Etapa 1: 2 o 3

Etapa 2: 5 o 1 o 5

阶段 3: 6 o 2 o 3 o 9

Etapa 4: 8 o 6 o 4

Etapa 5: 4 o 7

Etapa 6: 3

Compatible con las "tres características"?

El dar marcha atrás algoritmo para resolver este problema, tales como escribir el código, mirada a la pintura árbol recursivo, se encontró árbol recursivo ha nodos duplicados, los nodos representan la posición repetida desde la parte superior izquierda del nodo que corresponde a una variedad de rutas, explicar el problema ha repetido sub-problemas

Go (i, j) en esta posición, sólo necesitan preocupación (i-1, j), (i, j-1) correspondiente al estado de las dos posiciones, las piezas no me importa por qué ruta a estas dos posiciones , en línea con ningún efecto posterior de esta característica

min_dist (i, j) por min_dist (i, j-1) y min_dist (i-1, j) para derivar dos estados, en consonancia con subestructura óptima

Dos Dinámica resumen de programación de las ideas de resolución de problemas

Para resolver el problema de programación dinámica en general, tienen dos ideas, el método de la tabla de transición de estados y el método de la ecuación de transición de estados

1. El método de la tabla de transición de estado

problema de programación dinámica puede ser resuelto por la fuerza bruta de búsqueda se puede utilizar el retroceso algoritmo para resolver cuando tenemos el problema resuelto antes de definir el estado de un algoritmo simple vuelta hacia atrás, cada estado representa un nodo, dibujar el árbol recursivo para ver si hay repetir sub-problemas, con el fin de encontrar la ley para ver si se puede usar la programación dinámica para resolver

Después de encontrar duplicados sub-problemas, hay dos ideas, uno directamente de vuelta, más el "orden" a la duplicación de evitar sub-problemas, el segundo es el uso de soluciones de programación dinámica, método de la tabla de transición de estados

método de la tabla de transición de estados es: primero dibujar una tabla de estado, son de mesa generalmente bidimensional, cada estado comprende tres variables, fila, columna, los valores de matriz, de acuerdo con el proceso de toma de decisiones ha, de adelante hacia atrás, cada uno de las etapas de llenado estado, este proceso recursivo de rellenar formularios, traducido a código que es códigos de programación dinámicos

Aunque la mayoría tabla de estados es bidimensional, si los problemas del estado más complejo y requiere una gran cantidad de variables para representar la tabla de estado correspondiente es probablemente la alta dimensión, que no es adecuado para el método de la tabla de transición de estados

Cómo aplicar este método de la tabla de transición de estados para resolver el problema antes de que la matriz de camino más corto?

De principio a fin, hay muchos movimientos diferentes, exhaustivos de todos los movimientos posibles, en comparación con encontrar una más corta se mueve, no podemos dejar de repetir que no se pierda exhaustiva de todos los movimientos? El algoritmo exhaustiva regular con algoritmo de retroceso:

private int minDist = Integer.MAX_VALUE;   //全局变量或者成员变量
//调用方式:minDistBacktracing(0,0,0,w,n):
public void minDistBT(int i ,int j,int dist,int[][] w ,int n){
	//到达了n-1,n-1这个位置
	if(i == n && j == n){
		if(dist < minDist) minDist = dist;
		return;
	}
	if(i < n ){   //往下走,更新i = i+1;j=j
		minDistBT(i + 1,dist+w[i][j],w,n);
	}
	if(j<n){    // 往右走,更新i=i, j = j +1
		minDistBT(i,j+1,dist+w[i][j],w,n);
	}
}

Con la parte posterior de código, dibujado árbol recursivo, se repite con el fin de encontrar los sub-problemas, a tres variables de estado que comprenden (i, j, dist), a pesar de la (i, j, dist) no es repetido, pero (i, j) hay una gran cantidad de duplicado, para (i, j) repetir nodo, seleccionar el más pequeño dist nodo continuar solución recursiva, otros nodos se dan por vencidos

Si puede utilizar para resolver el área de programación dinámica?

Dibujar una tabla de estado de dos dimensiones, las piezas eran representativas de la fila y la columna, el valor representa el camino más corto desde el origen hasta la posición

fila iniciada 0, columna 0

1 4 9 18

3 * * * primera línea: min (3 + 1,4 + 1) min (4 + 3,9 + 3) min (7 + 4,18 + 4)

8 * * * Segunda fila: min (8 + 2,4 + 2) min (6 + 6,7 + 6) min (12 + 7,11 + 7)

14 * * * Tercera fila: min (14 + 8,6 + 8) min (14 + 4,12 + 4) min (16 + 3,18 + 3)

Por lo que el código es:

public int minDistDP(int[][] matrix , int n ){
	int[][] states = new int[n][n];
	int sum = 0 ;
	for(int j = 0 ; j < n ; ++j){     //初始化states的第一行数据
		sum += matrix[0][j];
		states[0][j] = sum;
	}
	sum = 0;
	for(int i = 0 ; i < n ; ++i){    //初始化states的第一列数据
		sum += matrix[i][0];
		states[i][0] = sum;
	}
	for(int i = 1;i < n ;++i){
		for(int j = 1 ; j < n ; ++j){
			states[i][j] = matrix[i][j] +Math.min(states[i][j-1],states[i-1][j]);
		}
	}
	return states[n-1][n-1];
}

ecuación de transición de estado 2. Método

Necesidad de analizar cómo un problema resuelto por recursivamente sub-problemas que óptima subestructura, de acuerdo con subestructura óptima, escribir fórmula recursiva que la ecuación de transición de estado, con la ecuación, el código es simple, y uno es recursivo memorando + una recursividad iterativo

ecuación recursiva es;
metro yo norte re yo s t ( yo , j ) = w [ yo ] [ j ] + m i n ( m i n d i s t ( i , j 1 ) , m i n d i s t ( i 1 , j ) ) min_dist (i, j) = w [i] [j] + min (min_dist (i, j-1), min_dist (i-1, j))

La primera: las ecuaciones recursivas + memo traducido a código
private int[][] matrix = {{1,3,5,9},{2,1,3,4},{5,2,6,7},{6,8,4,3}};
private int n = 4;
private int[][] mem = new int[4][4];
public int minDist(int i , int j){   //调用minDist(n-1,n-1)
	if( i == 0 && j == 0) return matrix[0][0]
	if(mem[i][j] > 0) return mem[i][j];
	int minLeft = Integer.MAX_VALUE;
	if(j-1 >= 0 ){
		minLeft = minDist(i,j-1);
	}
	int minUp = Integer.MAX_VALUE;
	if(i-1 >= 0){
		minUp = minDist(i-1,j);
	}
	
	int currMinDist = matrix[i][j] + Math.min(minLeft,minUp);
	mem[i][j] = currMinDist;
	return currMinDist;
}

Comparación de cuatro algoritmos pensó

Codiciosos, diferencias y vínculos entre divide y vencerás, marcha atrás y programación dinámica

El codicioso, dar marcha atrás, programación dinámica se divide en una clase, la partición en una categoría separada, el primer algoritmo de tres modelo para resolver el problema se puede abstraer en un algoritmo de solución decisión óptima de múltiples etapas, divide y vencerás para resolver el problema, aunque la mayoría de ellos es la solución óptima, pero no se puede abstraer en un multi-etapa de toma de decisiones modelo

Moneda de cambio problema

Hay varias denominaciones diferentes de monedas v1, v2, ......, vn (en unidades de dólares), que se abonará w yuanes, requiere un número mínimo de monedas se requiere, por ejemplo, tenemos tres monedas diferentes, 1 ¥, 3 ¥, 5 ¥, tenemos que pagar $ 9 monedas requiere un mínimo de (monedas 3 de 3 yuanes) tres

Escala que sube puede ser visto como el problema puede ser dividido en pasos 1,3,5, 9 vienen a un mínimo de pasos de cómo la ecuación de transferencia dinámica f (9) = 1 + min (f (8), f (6), f (4))

即 f (n) = 1 + min (f (n-1), f (n-3), f (n-5))

Publicado 75 artículos originales · ganado elogios 9 · vistas 9180

Supongo que te gusta

Origin blog.csdn.net/ywangjiyl/article/details/104717935
Recomendado
Clasificación