Aprenda a usar el algoritmo de dividir y conquistar para resolver el problema de ubicación de la oficina postal (implementación de Java)

Problema de ubicación de la oficina postal (algoritmo divide y vencerás)


Prefacio

Consejo: En el proceso de aprendizaje de algoritmos, encontraremos una variedad de ideas de algoritmos, la más común de las cuales es la idea del algoritmo dividir y conquistar, y el problema de la ubicación de la oficina postal en este artículo es una implementación diaria basada en la idea de dividir y conquistar. problema


Sugerencia: El siguiente es el contenido de este artículo, describiré el problema en detalle

1. ¿Qué es el algoritmo divide y vencerás?

En términos generales, el algoritmo divide y vencerás descompone un problema a gran escala que es difícil de resolver directamente en varios subproblemas de menor escala, y rompe cada uno para dividir y conquistar.

Inserte la descripción de la imagen aquí
Combine las soluciones resueltas del problema de menor escala en una solución de problema de mayor escala y encuentre la solución del problema original de abajo hacia arriba.
Inserte la descripción de la imagen aquí

2. La idea básica del algoritmo divide y vencerás

1. La idea básica de la estrategia de divide y vencerás

1. Dividir o reducir el problema original en subproblemas más pequeños 2. Resolver cada subproblema de forma recursiva o iterativa 3. Sintetizar las soluciones de los subproblemas para obtener la solución del problema original

2. Nota:

1. Las propiedades de los
subproblemas son exactamente las mismas que las del problema original 2. Los subproblemas pueden resolverse independientemente unos de otros
3. Los subproblemas pueden resolverse directamente cuando la recursividad se detiene.

3. Ubicación de la oficina de correos

Descripción del problema:
en una ciudad que está dividida en bloques regulares en las direcciones este-oeste y norte-sur, n áreas residenciales están dispersas en diferentes bloques. Utilice la coordenada x para indicar la dirección este-oeste y la coordenada y para indicar la dirección norte-sur. La ubicación de cada punto residencial se puede representar mediante coordenadas (x, y). Requisito: Elija una ubicación para la oficina de correos, de modo que la suma de las distancias entre n áreas residenciales y la oficina de correos sea la más pequeña.
Consejo:
mediana ponderada

Codigo:

package Site_selection;
import java.io.BufferedReader;
import java.io.FileReader;

public class Site_selection {
    
    
	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
		int N=0;
		int x[]=new int[500];    //存放测试样本中x轴的数据值
		int y[]=new int[500]; 
		int xweight[]=new int[500];//存放测试样本中的权值
		int yweight[]=new int[500];
        for(int a=1;a<7;a++) {
    
    
        try {
    
    
    	  System.out.println("测试样本"+a);
    	  FileReader filereader=new FileReader("input0"+a+".txt"); //采用拼接方式读取样本
    	  BufferedReader buf=new BufferedReader(filereader);
    	  int j=0;
    	  String readline="";
    	  String[] array=new String[200];
    	  readline=buf.readLine();
    	  N=Integer.parseInt(readline);//读取测试样本中的第一行居民点的个数
    	  System.out.println("居民点个数为:"+N);
    	  while((readline=buf.readLine())!=null) {
    
    
    		  array=readline.split(",");  	//按照,分隔字符串来放入相应的数组之中
    	      x[j]=Integer.parseInt(array[0]);
    		  y[j]=Integer.parseInt(array[1]);
    		  xweight[j]=Integer.parseInt(array[2]);
    		  yweight[j]=Integer.parseInt(array[2]);
    		  j++;  		 
    	  } 
      }
      catch(Exception e) {
    
    
    	 e.printStackTrace();
      }
      MinSumDistance(x,y,xweight,yweight,N);
     }
	}
	/*
	 * 1.快速排序
	 *   通过该排序方式中的分治思想,来对测试样本中所有的数据值进行相对应的排序
	 * 
	*/
    public static void QuickSort(int a[],int weight[],int low,int high){
    
    
    	if(low>high) {
    
    
    		return;
    	}
    	int first=low;
    	int last=high;
    	int key=a[first];
    	int Weight=weight[first];
    	while(first<last)
    	{
    
    
    		while(first<last&&a[last]>key) {
    
    
    			--last;
    		}
    		a[first]=a[last];
    		weight[first]=weight[last];
    		while(first<last&&a[first]<key) {
    
    
    			++first;
    		}
    		a[last]=a[first];
    		weight[last]=weight[first];
    	}
    	a[last]=key;
    	weight[last]=Weight;
    	QuickSort(a,weight,low,first-1);
        QuickSort(a,weight,first+1,high);    	 	
    }
    /*
     * 2.邮局到居民点的最短路径之和
     *   通过对x轴与y轴的带权中位数的求解来得到相应的邮局坐标,再通过坐标位置与各个居民点的坐标位置相运算累加之和即为最短距离
     * 
     * 
     */
    public static void MinSumDistance(int x[],int y[],int xweight[],int yweight[],int N) {
    
    
    	int x1=0;
    	int y1=0;
    	int distance = 0;
    	QuickSort(x,xweight,0,N-1);
    	int sumxweight=0;
    	int sumyweight=0;
    	for(int b=0;b<xweight.length;b++) {
    
    
    		sumxweight+=xweight[b];
    	}
    	System.out.println("x坐标上的总权值为:"+sumxweight);
    	for(int i = 0; i < xweight.length; i++){
    
    
			sumxweight += xweight[i];
			if(sumxweight >= sumxweight / 2){
    
    x1=i;break;//求取x轴上的带权中位数
				 }
			}
    	System.out.println("邮局的x坐标为:"+x[x1]);
    	QuickSort(y,yweight,0,N-1);
    	int sumyWeight=0;
    	for(int b=0;b<yweight.length;b++) {
    
    
    		sumyWeight+=yweight[b];
    	}
    	System.out.println("y坐标上的总权值为:"+sumyWeight);
    	for(int k = 0; k < yweight.length; k++){
    
    
			sumyweight += yweight[k];
			if(sumyweight >= sumyweight / 2){
    
    y1=k;break;//求取y轴上的带权中位数
				 }
			}
    	System.out.println("邮局的y坐标为:"+y[y1]);
    	System.out.println("邮局的坐标位置为"+x[x1]+","+y[y1]);
    	for(int q=0;q<N;q++) {
    
    
    		distance+=Math.abs((x[q]-x[x1]))+Math.abs((y[q]-y[y1]));
    	}
    	System.out.println("所有居民点到邮局的最短距离为:"+distance);
    	System.out.println("------------------");
    }
}

Descripción de la operación: El
problema de ubicación de la oficina postal se analiza analizando la posición de las coordenadas del área residencial y el peso del número de residentes. En los datos de entrada, primero ingrese el número de áreas residenciales en la muestra de prueba y luego ingrese las posiciones de las coordenadas de cada área residencial y El número de residentes Después de ejecutar el programa, el resultado de salida será la ubicación coordinada de la oficina de correos y la suma de los caminos más cortos desde la oficina de correos a todas las áreas residenciales.

resultado de la operación:
Inserte la descripción de la imagen aquí

Resumir ideas de diseño de algoritmos

El programa adopta principalmente la idea de dividir y conquistar, incluido un método de clasificación rápido, ordenando las coordenadas x en los valores de datos de entrada de pequeñas a grandes, de modo que los pesos correspondientes a las coordenadas x también se clasifiquen en consecuencia. Luego seleccione la coordenada x correspondiente a la mitad de la suma de los pesos, encuentre la mediana ponderada y encuentre las coordenadas y de los datos de la misma manera, y finalmente calcule la operación de distancia para las coordenadas de cada punto residencial a través de las coordenadas de la oficina postal obtenidas. , El resultado acumulado es la suma de las distancias más cortas desde la oficina de correos a todas las áreas residenciales.

Supongo que te gusta

Origin blog.csdn.net/Xiao_ni_tongxue/article/details/109255860
Recomendado
Clasificación