选址问题java_学习使用分治算法来解决邮局选址问题(Java实现)

邮局选址问题(分治算法)

前言

提示:在算法的学习过程中我们会遇到各种各样的算法思想,其中最常见的就有分治算法思想,而本文的问题邮局选址问题就是基于分治思想而去实现的一个日常问题

提示:以下是本文内容,我将对该问题进行详细的描述

一、分治算法是什么?

总体而言,分治算法是将一个难以直接解决的规模较大的问题分解为若干个规模较小的子问题,并各个击破,分而治之。

23aad313f182993d69e4f138c9ef0932.png

将求出的较小规模的问题解合并成一个较大规模的问题解,并自底向上地求出原问题的解。

cd1369848cc142d5ae6f51931876f30a.png

二、分治算法的基本思想

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

运行说明:

邮局选址问题通过对居民点的坐标位置已经居民数量权值来进行分析,在输入数据中,先输入该测试样例共有几个居民点,再依次输入各个居民点的坐标位置以及居民的数量,运行程序之后会返回输出结果邮局所在的坐标位置,以及邮局到所有居民点的最短路径之和。

运行结果:

af81f6c0767d97d4f2886d4056447b5e.png

总结算法设计思路

该程序主要采用了分治的思想,包含有快速排序的方法,将所输入数据值中的x坐标按从小到大依次进行排序,使得该x坐标相对应的权值也进行相应的排序。然后通过权值的总和一半来选择所对应的x坐标,求出带权中位数,并通过同样的方式求出数据y坐标,最后通过得到的邮局坐标对每一居民点坐标进行求距离操作,所累加的结果就是邮局到所有居民点的最短距离之和。

文章来源: blog.csdn.net,作者:九墨、,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Xiao_ni_tongxue/article/details/109255860

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新学期新开始

新学期&#xff0c;新开始&#xff01;告诉自己&#xff0c;一定要坚持走自己的路。太多的事情&#xff0c;太多的诱惑。我们要坚持自己的脚步&#xff0c;要知道&#xff1a;坚持就是胜利。终将会有自己的一片天地。不能被中间的事情分神&#xff0c;忘了自己远方的那盏明灯&a…

210板wince键盘驱动分析和移植

主要是bsp包里面的3个cpp文件的分析。 首先是pddlist.cpp文件 这个文件介绍了3种键盘的wince的api入口函数名前面加winapi&#xff09;&#xff0c;本文只关心第二种矩阵键盘。 然后在kbd.cpp文件中可以找到这个入口函数Matrix_Entry。 这里值得注意的是&#xff0c;本驱动…

【转】各种消息下wParam及lParam值的含义

01、WM_PAINT消息 LOWORD(lParam)是客户区的宽&#xff0c;HIWORD(lParam)是客户区的高 02、滚动条WM_VSCROLL或WM_HSCROLL消息 LOWORD(wParam)指出了鼠标对滚动条的操作。比如上、下、左、右、翻页、移动等。 03、击键消息&#xff0c;有WM_SYSKEYDOWN、WM_SYSKEYUP、WM_KEY…

WinAPI: GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId

{返回当前线程的虚拟句柄} GetCurrentThread: THandle;{返回当前线程 ID} GetCurrentThreadId: DWORD;{返回当前进程的虚拟句柄} GetCurrentProcess: THandle;{返回当前进程 ID} GetCurrentProcessId: DWORD;提示:ID 是系统唯一的标识.所谓虚拟句柄, 就是该句柄只在调用进程的进…

Windows Embedded CE 6.0开发初体验(一)Windows CE概述

这篇文章的目的并不是介绍Windows Embedded CE开发的方方面面&#xff0c;只是用一个初涉嵌入式领域的软件开发者的视角来介绍Windows CE开发中最常用的概念和知识&#xff0c;解决大家会在实际开发中碰到的一些小问题&#xff0c;让大家了解嵌入式开发与应用程序开发&#xff…

【转】C++学习一 结构与结构体

转自&#xff1a;https://www.cnblogs.com/fantianliang/category/1574590.html https://www.cnblogs.com/fantianliang/p/11620328.html 结构体属于C与C区别之一。 代码例子如下&#xff08;来自《C程序设计》&#xff09;&#xff1a; #include <iostream> #includ…

Windows Embedded CE 6.0开发初体验(二)CE开发环境

CE开发环境 下面就要让今天的主角闪亮登场了——Digi CC 9P开发板。为了感谢Digi提供的开发板&#xff0c;还是给他们做个广告吧&#xff1a;这是一家以WiFi相关产品为主营业务的公司&#xff0c;也生产ARM架构的CPU&#xff0c;所以做开发板也是他们公司份内的事情了。总的感…

请问 CType和DirectCast函数有何区别

DirectCast 关键字引入类型转换操作。该关键字的使用方法与 CType 关键字相同&#xff0c;如下列所示&#xff1a; Dim Q As Object 2.37 Requires Option Strict to be Off. Dim I As Integer CType(Q, Integer) Succeeds. Dim J As Integer DirectCast(Q, Integer) …

【转】C++学习二 vector的用法(使用sort对于vector排序)

一、vector的介绍 vector是C里面的一个容器&#xff0c;也是我们数学上面理解的向量&#xff0c;有一些比较常见的操作。 二、vector的定义 #include<vector> using namespace std;//int 说明的是vector存储的数据类型 vector<int> odd_vector; 三、vector的一些…

java syncr_JAVA基础—Synchronized线程同步机制

Synchronize的使用场景Synchronize可以使用在一下三种场景&#xff0c;对应不同的锁对象场景synchronized代码块synchronized方法synchronized静态方法锁对象任意对象this 对象该类的字节码对象 *.class没有同步代码实例public class SyncSample {public static void main(Stri…

Windows Embedded CE 6.0开发初体验(三)设置Boot-loader

在Digi CC 9P开发板中已经预置了Boot-loader和一个CE 6.0的系统&#xff0c;所以&#xff0c;我们直接启动开发板&#xff0c;就可以运行一个CE 6.0的操作系统。不过&#xff0c;我们的最终目的是要开发一个自己的CE 6.0平台&#xff0c;所以我们需要对Boot-loader中的一些系统…

【转】C++学习三 模板类出错总结(Missing template arguments before ‘L‘)

一、模板类的说明 模板类有一个好处是可以放宽你输入的数据类型。 比如有这样的一个函数&#xff1a; int add(int x, int y) {return xy; } 这个函数对于int类型的x,y才适合&#xff0c;但是如果我们希望计算float类型的呢&#xff1f; 这必须重新定义一个函数&#xff…

Flex 学习站点汇总,(FLEX学习站点、博客、论坛)

来自&#xff1a;http://www.zhuoqun.net/article.asp?id501不错的整理&#xff01;感谢原作者。今天把收藏夹共享出来&#xff0c;希望对学习Flex的人有所帮助。一、国外站点1.资源类Adobe Flex 2 Component Explorer&#xff1a; 官方的&#xff0c;展示了各种组件的用法&am…

java 延迟实例化_延迟初始化Spring Bean的几种方式

XML 配置:Java 注解:Lazy(true)Spring 中默认是非延迟加载Bean的,也就是提前把Bean初始化好,用的时候直接用. 优点是运行的时候比较快(提前初始化了,直接用). 缺点是启动慢和占用内存,因为要初始化很多Bean.延迟加载是需要的时候再去初始化Bean. 优点是解约内存,启动快(不需要提…

Windows Embedded CE 6.0开发初体验(四)跑个应用程序先

因为我们的开发板上已经预置了Windows CE 6.0的系统&#xff0c;所以我们可以先创建一个.NET CF的应用程序&#xff0c;来看一下如何将.NET CF程序部署到Digi开发板上。 第一步&#xff0c;首先在Visual Studio 2005中创建一个新的工程。这一步和开发普通的Windows Mobile应用…

【转】C++学习四 冒泡排序法的一些改进

冒泡排序法需要两次扫描&#xff0c;所以从时间复杂度来说&#xff0c;是O(n2). 如果用图形表示&#xff0c;是这样的&#xff1a; 但是我们可以加以改进。 首先是&#xff0c;如果在排序中间&#xff0c;整个向量已经达到了有序状态&#xff0c;可以直接跳出来。 这样它的复…

java中的jgroup_JGroups实现聊天小程序

本文实例为大家分享了JGroups实现聊天小程序的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下效果图&#xff1a;代码部分&#xff1a;package com.lei.jgoups;import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;impor…

Windows Embedded CE 6.0开发初体验(五)构建CE平台

接下来的一节会有非常多的图&#xff0c;因为我们要在Visual Studio 2005里创建一个CE 6.0的平台&#xff08;Platform&#xff09;了。创建CE平台的方法和创建普通工程的方法类似。在完成了Platform Builder之后&#xff0c;我们打开Visual Studio 2005后&#xff0c;选择File…

est.java 2 错误 找不到符号_找不到Cython/Python符号PyString\u Typ

我试图调用Cython的C代码&#xff0c;并遵循official guide。在但是&#xff0c;当在python中导入已编译的模块时&#xff0c;我得到以下错误。在---------------------------------------------------------------------------ImportError Traceback (most recent call last)i…

一步一步学Silverlight 2系列(31):图形图像综合实例—实现水中倒影效果

概述 Silverlight 2 Beta 1版本发布了&#xff0c;无论从Runtime还是Tools都给我们带来了很多的惊喜&#xff0c;如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython&#xff0c;对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlig…