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