Problema al cargar la Resolución de retroceso

Descripción del problema

N recipientes tienen que ser cargado en un peso muerto nave W, en el que el contenedor i (1≤i≤n) el wi peso. No se considera que limitar el volumen del recipiente, que se selecciona de los contenedores y el peso W o menos y una pluralidad de recipientes montado en lo más grande posible.
Por ejemplo, n = 5, W = 10 , w = {5,2,6,4,3} tiempo, se carga la mejor solución (1,1,0,0,1) o (0,0,1, 1,0), maxw = 10.

La resolución de problemas

Con la poda resuelto por retroceso. Problema de la siguiente manera:
int W [] = {0,5,2,6,4,3}; // peso de cada uno de los contenedores, sin los elementos tiene 0
int n = 5, W = 10 ;
los resultados se muestran a continuación Solución :
int maxw = 0; // almacenar el peso total de la solución óptima
int x [MAXN]; // almacenar el vector solución óptima
a dichos datos está diseñado para variables globales.
Algoritmo de la siguiente manera:
DFS void (int i, int TW, RW int, int OP [])
donde el parámetro i representa el contenedor i considerado, tw representa el peso de los contenedores seleccionados y, rw denota el peso de los contenedores restantes, y (inicialmente cuando todo y el peso del recipiente), OP representa una solución, es decir, correspondiente a un programa de carga.
La solución óptima: x, maxw
dejó poda: solamente la izquierda expansión nodo hijo tw + w [i] ≤W de
la poda derecha: solamente tw extendida + rw-w [i] > el nodo hijo derecho maxw

código

int w[] = { 0,5,2,6,4,3 };
int n = 5, W = 10;
int maxw = 0;
int x[MAX];//存放最优解

void dfs(int i, int tw, int rw, int op[])
{
	if (i > n)
	{
		if (tw > maxw&&tw <= W)
		{
			maxw = tw;
			for (int j = 1; j <= n; j++)
				x[j] = op[j];
		}
	}
	else
	{
		if (tw + w[i] <= W)//左剪枝
		{
			op[i] = 1;//选择货物
			dfs(i + 1, tw + w[i], rw - w[i], op);
		}
		if (tw + rw - w[i] > maxw)//右剪枝
		{
			op[i] = 0;//不选择货物
			dfs(i + 1, tw, rw - w[i], op);
		}
	}
}

Solución de problemas de carga complejo

Descripción del problema

Hay un total de n número de contenedores para ser cargado en dos c1 carga y c2, respectivamente, de la nave, en el que el peso del contenedor i es Wi, y w1 + w2 + ... + wn≤c1 + c2.
pregunta cargada pidió para determinar si hay un programa razonable puede cargar estos contenedores cargados en estos dos barcos. Si es así, encontrar un programa de carga.
Por ejemplo:
n-3 =, C1 = C2 = 50, W = {10,40,40} cuando, los recipientes 1 y 2 pueden estar unidos a un barco en el primero, y el segundo recipiente 3 está unido a las llamadas de buques.
n = 3, c1 = c2 = 50, w = {20,40,40}, estos tres contenedores pueden no estar todos instalado en la nave.

La resolución de problemas

Si una carga dada problema complejo tiene una solución, se puede utilizar como una manera de conseguir la solución de carga:
En primer lugar, el primero como un barco lleno, entonces el segundo recipiente que queda montado en las escalas de buques.
Puede que tenga que probar su corrección.
Si usted no recibe un programa de carga, lo que indica que el problema de carga complejo hay una solución!
Algoritmo de pensamiento (introducido como W1, W2, ..., Wn, c1, c2):
(1) el mayor número de contenedores cargados en un barco para obtener la solución del vector x.
(2) un total de barco de contenedores Bahrain suma peso restante.
(3) si la suma <= c2, puede representar un segundo barco llama Bahrain, devuelve true; de otro modo no Bahrain muestra una segunda escalas de buques, devuelve false.

código

int w[] = { 0,10,40,40 };
int n = 3;
int c1 = 50, c2 = 50;
int maxw = 0;//存放第一艘轮船的最优总重量
int x[MAX];//存放第一艘轮船的最优解向量

void dfs(int i, int tw, int rw, int op[])
{
	if (i > n)
	{
		if (tw > maxw&&tw <= c1)
		{
			maxw = tw;
			for (int j = 1; j <= n; j++)
				x[j] = op[j];
		}
	}
	else
	{
		if (tw + w[i] <= c1)//左剪枝
		{
			op[i] = 1;//选择货物
			dfs(i + 1, tw + w[i], rw - w[i], op);
		}
		if (tw + rw - w[i] > maxw)//右剪枝
		{
			op[i] = 0;//不选择货物
			dfs(i + 1, tw, rw - w[i], op);
		}
	}
}

bool solve()
{
	int sum = 0;
	for (int j = 1; j <= n; j++)
		if (x[j] == 0)
			sum += w[j];//计算剩余货物的总重量
	if (sum <= c2)
		return true;
	else
		return false;
}
Publicado 26 artículos originales · ganado elogios 0 · Vistas 293

Supongo que te gusta

Origin blog.csdn.net/weixin_42729072/article/details/104905407
Recomendado
Clasificación