重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
直接把坐标带进去你采用的距离公式就行了。
创新互联2013年至今,是专业互联网技术服务公司,拥有项目成都网站建设、做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元扶绥做网站,已为上家服务,为扶绥各地企业和个人服务,联系电话: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个城市,距离计算方法为伪欧氏距离,最优值为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;//当前节点
int j=0;//下一个节点
//默认从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();
//选择下一个节点,要求不是已经走过,并且与i不同
j = selectmin(temp);
//找出下一节点
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;//当前节点指向下一节点
}
System.out.println("路径:" + path);
System.out.println("总距离为:" + s);
}
public int selectmin(int[] p){
int j = 0, m = p[0], k = 0;
//寻找第一个可用节点,注意最后一次寻找,没有可用节点
while (colable[j] == 0) {
j++;
//System.out.print(j+" ");
if(j=cityNum){
//没有可用节点,说明已结束,最后一次为 *--0
m = p[0];
break;
//或者直接return 0;
}
else{
m = p[j];
}
}
//从可用节点J开始往后扫描,找出距离最小节点
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千米