您的位置:首页 > 其它

写个原创的小算法,如何算出遍历每个点的路径最短

2018-03-06 17:33 447 查看
首先,我们明确一下需求,要求在a,b,c,d,e五个点中,先选一个起点,然后选一个终点。这个路径必须经过这五个所有的点,求最短路径。
private void Computingdistance() {

List<Integer> arrayList = new ArrayList<>();

for (int i = 0; i < mDateSearchBeanData.size(); i++) {
if (i == startpoint || i == endpoint) {

} else {
arrayList.add(i);
}
}

int length = arrayList.size();
int[] array = new int[length];

for (int i = 0; i < arrayList.size(); i++) {
array[i] = arrayList.get(i);
}

permute(array, 0);
//        System.out.println("bigArray.size() " + bigArray.size());
countMin();

int[] finalend = endSize.get(0);
String mShowText = "";
for (int i = 0; i < finalend.length; i++) {
// mShowText = mShowText+mDateSearchBeanData.get(finalend[i]).getObj_name()+"--->";

if (i == finalend.length - 1) {
mShowText = mShowText + mDateSearchBeanData.get(finalend[i]).getObj_name();
} else {
mShowText = mShowText + mDateSearchBeanData.get(finalend[i]).getObj_name() + "--->";
}
}

//// TODO: 2017/10/16
Intent intent = new Intent(this, MyTripActivity.class);
intent.putExtra("array", finalend);
setResult(RESULT_OK, intent);
finish();

mShowFinal.setText(mShowText);

}
//计算出每种路径的经过的点
private void permute(int a[], int s) {if (s == a.length) {mHeadA = new int[a.length + 2];mHeadA[0] = startpoint;mHeadA[mHeadA.length - 1] = endpoint;for (int i = 0; i < a.length; i++) {mHeadA[i + 1] = a[i];}bigArray.add(Arrays.asList(mHeadA));} else        for (int i = s; i < a.length; ++i) {swap(a, s, i);permute(a, s + 1);swap(a, s, i);}}
//计算最短路径
private void countMin() {//        System.out.println("bigArray.size() " + bigArray.size());double distance = 0.0;double minDistance = Double.MAX_VALUE;for (int i = 0; i < bigArray.size(); i++) {List<int[]> list = bigArray.get(i);for (int j = 0; j < list.size(); j++) {int[] size = list.get(j);//计算总长度for (int k = 0; k < size.length - <4000span style="color:#0000ff;">1; k++) {distance = distance + getDistance(size[k], size[k + 1]);}if (distance <= minDistance) {minDistance = distance;if (endSize != null) {endSize.clear();}endSize.add(size);}//                System.out.println("minDistance " + distance);}}
这样写有点不清晰,而且懒的写注释。我就大概流程说一下,startpoint和endpoint是选中的起点和终点。在集合中先把选中的两个点删去,并记录下来。然后将剩下的点做排序
。然后将起点和终点又加回去。最后将重新排序的数组依次计算距离,取其中最短的那个
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: