直接把坐標帶進去你采用的距離公式就行了。

創(chuàng)新互聯2013年至今,是專業(yè)互聯網技術服務公司,擁有項目成都網站建設、做網站網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元扶綏做網站,已為上家服務,為扶綏各地企業(yè)和個人服務,聯系電話:18980820575
最簡單的是二維的的歐式距離公式。舉個例子吧
a=[1,2];
b=[2,1];
juli=sqrt((a(1)-b(1))^2+(a(2)-b(2))^2);
兩維空間里,兩點間的距離公式是L = sqrt((x1-x2)^2+(y1-y2)^2);
多維空間的公式照推。
假設文件中數據如下:
3
2,5,6
6,8,5
則對應的代碼如下:
BufferedReader reader = new BufferedReader(new FileReader("C:/test.txt"));
//獲取維數
String s1 = reader.readLine();
num = Integer.parseInt(s1);
//獲取第一個坐標的信息,將其坐標信息保存在數組中
String s2 = reader.readLine();
String[]str2 = s2.split(",");
int p1[] =new int[num];
for(int i=0;inum;i++) {
p1[i] = Integer.parseInt(str2[i]);
}
//獲取第二個坐標的信息,同上,略過
……
//將對應坐標之差保存到另外一個數組
int a []=new int[num];
for(int i = 0;inum;i++)
a[i] = p1[i]-p2[i];
//求這個數組各元素的平方和
int sum = 0;
for(int i=0;inum;i++) {
sum += a[i]*a[i];
}
求距離
int L = Math.sqrt(sum);
以上代碼直接在瀏覽器中完成,可能會有編碼問題,樓主細察
package noah;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class TxTsp {
private int cityNum; // 城市數量
private int[][] distance; // 距離矩陣
private int[] colable;//代表列,也表示是否走過,走過置0
private int[] row;//代表行,選過置0
public TxTsp(int n) {
cityNum = n;
}
private void init(String filename) throws IOException {
// 讀取數據
int[] x;
int[] y;
String strbuff;
BufferedReader data = new BufferedReader(new InputStreamReader(
new FileInputStream(filename)));
distance = new int[cityNum][cityNum];
x = new int[cityNum];
y = new int[cityNum];
for (int i = 0; i cityNum; i++) {
// 讀取一行數據,數據格式1 6734 1453
strbuff = data.readLine();
// 字符分割
String[] strcol = strbuff.split(" ");
x[i] = Integer.valueOf(strcol[1]);// x坐標
y[i] = Integer.valueOf(strcol[2]);// y坐標
}
data.close();
// 計算距離矩陣
// ,針對具體問題,距離計算方法也不一樣,此處用的是att48作為案例,它有48個城市,距離計算方法為偽歐氏距離,最優(yōu)值為10628
for (int i = 0; i cityNum - 1; i++) {
distance[i][i] = 0; // 對角線為0
for (int j = i + 1; j cityNum; j++) {
double rij = Math
.sqrt(((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j])
* (y[i] - y[j])) / 10.0);
// 四舍五入,取整
int tij = (int) Math.round(rij);
if (tij rij) {
distance[i][j] = tij + 1;
distance[j][i] = distance[i][j];
} else {
distance[i][j] = tij;
distance[j][i] = distance[i][j];
}
}
}
distance[cityNum - 1][cityNum - 1] = 0;
colable = new int[cityNum];
colable[0] = 0;
for (int i = 1; i cityNum; i++) {
colable[i] = 1;
}
row = new int[cityNum];
for (int i = 0; i cityNum; i++) {
row[i] = 1;
}
}
public void solve(){
int[] temp = new int[cityNum];
String path="0";
int s=0;//計算距離
int i=0;//當前節(jié)點
int j=0;//下一個節(jié)點
//默認從0開始
while(row[i]==1){
//復制一行
for (int k = 0; k cityNum; k++) {
temp[k] = distance[i][k];
//System.out.print(temp[k]+" ");
}
//System.out.println();
//選擇下一個節(jié)點,要求不是已經走過,并且與i不同
j = selectmin(temp);
//找出下一節(jié)點
row[i] = 0;//行置0,表示已經選過
colable[j] = 0;//列0,表示已經走過
path+="--" + j;
//System.out.println(i + "--" + j);
//System.out.println(distance[i][j]);
s = s + distance[i][j];
i = j;//當前節(jié)點指向下一節(jié)點
}
System.out.println("路徑:" + path);
System.out.println("總距離為:" + s);
}
public int selectmin(int[] p){
int j = 0, m = p[0], k = 0;
//尋找第一個可用節(jié)點,注意最后一次尋找,沒有可用節(jié)點
while (colable[j] == 0) {
j++;
//System.out.print(j+" ");
if(j=cityNum){
//沒有可用節(jié)點,說明已結束,最后一次為 *--0
m = p[0];
break;
//或者直接return 0;
}
else{
m = p[j];
}
}
//從可用節(jié)點J開始往后掃描,找出距離最小節(jié)點
for (; j cityNum; j++) {
if (colable[j] == 1) {
if (m = p[j]) {
m = p[j];
k = j;
}
}
}
return k;
}
public void printinit() {
System.out.println("print begin....");
for (int i = 0; i cityNum; i++) {
for (int j = 0; j cityNum; j++) {
System.out.print(distance[i][j] + " ");
}
System.out.println();
}
System.out.println("print end....");
}
public static void main(String[] args) throws IOException {
System.out.println("Start....");
TxTsp ts = new TxTsp(48);
ts.init("c://data.txt");
//ts.printinit();
ts.solve();
}
}
我看了三遍 沒太清楚你的意思 你知道一個數 利用歐氏距離 用java產生下一個數。
該逗號還是逗號,改分句還是分句,程序的世界,本來就需要很清楚的闡述問題。
距離可以用r*arccos[cos(y1)*cos(y2)*cos(x1x2)+sin(y1)*sin(y2)]來算
r是地球半徑6370km,x是經度,y是緯度
注意角度單位的轉換。Math類里的sin和cos函數的參數是以弧度為單位的角度,所以x1、x2、y1、y2要用弧度表示,但一般經緯度都是用角度表示(如X1=120 東經120度)就要化成弧度(x1*Pi/180)
而acos函數返回值正好是以弧度為單位的,剛好符合要求
如果你的代碼里的lat1、lat2、lon1、lon2單位是角度,可以這么改
double radius=6371000;
double distance=radius*Math.acos((Math.cos(lat2*Math.PI/180)*Math.cos(lat2*Math.PI/180)*Math.cos(lon1*Math.PI/180-lon2*Math.PI/180)+Math.sin(lat1*Math.PI/180)*Math.sin(lat2*Math.PI/180)));
我算出來是903.9千米
本文標題:歐氏距離java的代碼,歐幾里得算法java
文章分享:http://chinadenli.net/article28/dsspecp.html
成都網站建設公司_創(chuàng)新互聯,為您提供網站設計、微信小程序、關鍵詞優(yōu)化、面包屑導航、做網站、品牌網站制作
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯