来源于一次课程设计,课设源码位置:https://github.com/treeandgrass/Algorithm-Course-Design
2.7.1题目描述
学校要选择一个地方作为超市的位置,学校每个有K个部门,每个部门去超市的频率不一样,要求在可以设置的地点中选择一个最优的地点。
1)设计核心算法,计算出超市可选位置和最优位置
2)已图像化界面的方式显示学校超市可选点和最优位置,显示学校超市和部门之间的路径和距离。
2.7.2程序使用说明
Java version:1.8.0_111
IDE:eclipse
直接编译Graph.java,然后运行即可
2.7.3简要分析和设计
算法步骤可以分为如下:
1)将部门和超市之间的通路转化为矩阵的形式,在程序中使用二维数组的形式表示,例如将部门和商店作为节点,然后可以把整个问题抽象成一个加权无向图的问题,A表示图中每个顶点之间的通路。A(i,j)表示点i,j之间的距离
2)使用floyd方法计算超市节点到每个部门之间的最短距离
3)在步骤2)的基础上计算每个超市到所有部门的花费。
Floyd算法伪代码:
输入:权重矩阵W[1...n,1...n],权重为每两个点之间的距离
输出:每两个点之间的最短距离矩阵D[1...n,1...n]
Floyd(W[1...n,1...n])
D<—W
For k<—1 to n do
For i <—1 to n do
For j <— 1 to n do
D[i,j]=min( D(i,j),D[i,k]+D[k,j] )
Return D
计算超市到各个部门之间的距离使用加法模型。设所有超市的点为P=(p1,p2,...,pk)
所有部门点为S=(s1,s2,....,sn),超市pk到所有部门的代价为Cost(pk),部门到超市的频率为F[1..k,1....n],F(k,i)表示部门i到超市k的频率,则可以得到如下计算式:
由上述不走计算出了各个商店到部门之间的距离。使用Floyd方法计算的过程中同时记录下了每两个点之间路径的中间点。然后再图像界面上画出整个图,在将超市和部门之间的路径用红色标识。并且在超市标识旁标识出相应大代价。
2.7.4测试用例
权重矩阵W:{ {0,4,7,5,12},{4,0,5,6,9},
{7,5,0,-1,10},{5,6,-1,0,9},
{12,9,10,9,0}}
超市和部门名字数组:{ "办公区1","超市选址1","超市选址2","办公区2","办公区3"}
超市和部门对应坐标:
{ {50,50},{200,100},{80,400},{300,30},{400,300}}
超市ID,在{1,2},部门ID{0,3,4}
结果:
2.7.5源代码
package four.three;
import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* 无向图
* @author ym
*
*/
public class Graph extends JPanel{
/**
* 序列号