选址问题java_学习使用分治算法来解决邮局选址问题(Java实现)
郵局選址問題(分治算法)
前言
提示:在算法的學習過程中我們會遇到各種各樣的算法思想,其中最常見的就有分治算法思想,而本文的問題郵局選址問題就是基于分治思想而去實現的一個日常問題
提示:以下是本文內容,我將對該問題進行詳細的描述
一、分治算法是什么?
總體而言,分治算法是將一個難以直接解決的規模較大的問題分解為若干個規模較小的子問題,并各個擊破,分而治之。
將求出的較小規模的問題解合并成一個較大規模的問題解,并自底向上地求出原問題的解。
二、分治算法的基本思想
1.分治策略的基本思想
1.將原始問題劃分或者歸結為規模較小的子問題 2.遞歸或迭代求解每個子問題 3.將子問題的解綜合得到原問題的解
2.注意:
1.子問題與原始問題性質完全一樣
2.子問題之間可彼此獨立地求解
3.遞歸停止時子問題可直接求解
三、郵局選址問題
問題描述:
在一個按照東西和南北方向劃分成規整街區的城市里,n個居民點散亂地分布在不同的街區中。用x坐標表示東西向,用y坐標表示南北向。各居民點的位置可以由坐標(x,y)表示。要求:為建郵局選址,使得n個居民點到郵局之距離的總和最小。
提示:
帶權中位數
代碼實現 :
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(firstkey) { --last; } a[first]=a[last]; weight[first]=weight[last]; while(first= 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= sumyweight / 2){y1=k;break;//求取y軸上的帶權中位數 } } System.out.println("郵局的y坐標為:"+y[y1]); System.out.println("郵局的坐標位置為"+x[x1]+","+y[y1]); for(int q=0;q
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
運行說明:
郵局選址問題通過對居民點的坐標位置已經居民數量權值來進行分析,在輸入數據中,先輸入該測試樣例共有幾個居民點,再依次輸入各個居民點的坐標位置以及居民的數量,運行程序之后會返回輸出結果郵局所在的坐標位置,以及郵局到所有居民點的最短路徑之和。
運行結果:
總結算法設計思路
該程序主要采用了分治的思想,包含有快速排序的方法,將所輸入數據值中的x坐標按從小到大依次進行排序,使得該x坐標相對應的權值也進行相應的排序。然后通過權值的總和一半來選擇所對應的x坐標,求出帶權中位數,并通過同樣的方式求出數據y坐標,最后通過得到的郵局坐標對每一居民點坐標進行求距離操作,所累加的結果就是郵局到所有居民點的最短距離之和。
文章來源: blog.csdn.net,作者:九墨、,版權歸原作者所有,如需轉載,請聯系作者。
原文鏈接:blog.csdn.net/Xiao_ni_tongxue/article/details/109255860
總結
以上是生活随笔為你收集整理的选址问题java_学习使用分治算法来解决邮局选址问题(Java实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么别人的信用卡额度比你高
- 下一篇: Java 10 常用集合继承关系图