java无向图规定顶点和节点的区别

Python014

java无向图规定顶点和节点的区别,第1张

数学意义上讲,树是图的一种,大家可以对比着学习。

1、图的定义

我们知道,前面讨论的数据结构都有一个框架,而这个框架是由相应的算法实现的,比如二叉树搜索树,左子树上所有结点的值均小于它的根结点的值,右子树所有结点的值均大于它的根节点的值,类似这种形状使得它容易搜索数据和插入数据,树的边表示了从一个节点到另一个节点的快捷方式。

而图通常有个固定的形状,这是由物理或抽象的问题所决定的。比如图中节点表示城市,而边可能表示城市间的班机航线。如下图是美国加利福利亚简化的高速公路网:

①、邻接:

如果两个顶点被同一条边连接,就称这两个顶点是邻接的,如上图 I 和 G 就是邻接的,而 I 和 F 就不是。有时候也将和某个指定顶点邻接的顶点叫做它的邻居,比如顶点 G 的邻居是 I、H、F。

int nodeNum=10//顶点数

int tu[nodeNum][nodeNum]={0}//初始化邻接矩阵

while(次数条件){

//随机生成有连接的顶点标号

int nodeBegin=random()

int nodeEnd=random()

//双向连接,实现无向

tu[nodeBegin][nodeEnd]=1

tu[nodeEnd][nodeBegin]=1

}

import javax.swing.*

import java.awt.*

import java.awt.event.*

import java.util.Random

public class GAFrame extends JFrame {

private static final long serialVersionUID = 1L

static TopologyPanel tpnl = new TopologyPanel()

private String[] ipop = new String[10]// 染色体

private int gernation = 0// 染色体代号

public static final int GENE = 9// 基因数

public GAFrame(String title) {

super(title)

}

public static void main(String args[]) {

tpnl.setLayout(null)

GAFrame frame = new GAFrame("遗传算法寻找最优路径")

frame.setContentPane(tpnl)

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

frame.setSize(370, 330)

JButton button1 = new JButton()

button1.setText("生成参数")

button1.setBounds(5, 245, 90, 25)

button1.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

tpnl.refreshPanel1()

}

})

JButton button2 = new JButton()

button2.setText("生成路径")

button2.setBounds(245, 245, 90, 25)

button2.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

tpnl.refreshPanel2()

}

})

tpnl.add(button1)

tpnl.add(button2)

frame.setVisible(true)

}

}

class TopologyPanel extends JPanel {

private static int[][] params1 = new int[8][2]

private static int[] params2 = new int[13]

private static Random rnd = new Random()

public void paint(Graphics g) {

super.paint(g)

g.fillOval(30, 120, 10, 10)

g.fillOval(100, 30, 10, 10)

g.fillOval(80, 210, 10, 10)

g.fillOval(140, 130, 10, 10)

g.fillOval(210, 50, 10, 10)

g.fillOval(260, 120, 10, 10)

g.fillOval(160, 230, 10, 10)

g.fillOval(230, 190, 10, 10)

g.drawLine(35, 125, 105, 30)

g.drawLine(105, 35, 215, 55)

g.drawLine(215, 55, 265, 125)

g.drawLine(265, 125, 235, 195)

g.drawLine(235, 195, 165, 235)

g.drawLine(85, 215, 165, 235)

g.drawLine(35, 125, 85, 215)

g.drawLine(35, 125, 145, 135)

g.drawLine(85, 215, 235, 195)

g.drawLine(105, 35, 145, 135)

g.drawLine(215, 55, 145, 135)

g.drawLine(265, 125, 145, 135)

g.drawLine(85, 215, 145, 135)

g.drawString("A", 21, 120)

g.drawString("B", 92, 30)

g.drawString("C", 70, 220)

g.drawString("D", 225, 60)

g.drawString("E", 148, 148)

g.drawString("F", 160, 253)

g.drawString("G", 245, 202)

g.drawString("H", 270, 130)

g.drawString("( " + params1[0][0] + ", " + params1[0][1] + " )", 30,

120)// A

g.drawString("( " + params1[1][0] + ", " + params1[1][1] + " )", 100,

30)// B

g.drawString("( " + params1[2][0] + ", " + params1[2][1] + " )", 80,

210)// C

g.drawString("( " + params1[3][0] + ", " + params1[3][1] + " )", 140,

130)// E

g.drawString("( " + params1[4][0] + ", " + params1[4][1] + " )", 210,

50)// D

g.drawString("( " + params1[5][0] + ", " + params1[5][1] + " )", 255,

115)// H

g.drawString("( " + params1[6][0] + ", " + params1[6][1] + " )", 160,

230)// F

g.drawString("( " + params1[7][0] + ", " + params1[7][1] + " )", 230,

190)// G

g.drawString("" + params2[0], 70, 77)// A-B

g.drawString("" + params2[1], 160, 45)// BD

g.drawString("" + params2[2], 240, 90)// DH

g.drawString("" + params2[3], 250, 160)// GH

g.drawString("" + params2[4], 200, 215)// FG

g.drawString("" + params2[5], 125, 225)// CF

g.drawString("" + params2[6], 60, 170)// AC

g.drawString("" + params2[7], 90, 130)// AE

g.drawString("" + params2[8], 160, 205)// CG

g.drawString("" + params2[9], 125, 85)// BE

g.drawString("" + params2[10], 180, 95)// DE

g.drawString("" + params2[11], 205, 140)// EH

g.drawString("" + params2[12], 115, 175)// CE

}

public void refreshPanel1() {

for (int i = 0i <params1.lengthi++) {

params1[i][0] = (rnd.nextInt(21) + 10) * 100

params1[i][1] = rnd.nextInt(41) + 20

}

for (int i = 0i <params2.lengthi++)

params2[i] = ((rnd.nextInt(91)) + 10) * 10

repaint()

}

public void refreshPanel2() {

// TopologyPanel tt = new TopologyPanel()

//

// tt.tenacc()

GAFrame.tpnl.tenacc()

}

String inialPop() {

Character s[] = new Character[9]

String[] a = new String[9]

a[0] = "1"

for (int i = 0i <s.lengthi++) {

s[i] = '-'

}

if (Math.random() <1 / 3.0) {

s[0] = 'B'

} else if (Math.random() >= 1.0 / 3.0 &&Math.random() <2.0 / 3.0) {

s[0] = 'C'

} else

s[0] = 'E'

switch (s[0]) {

case 'B': {// ss[0]选择B

a[1] = "1"

a[2] = a[6] = a[3] = "0"

if (Math.random() <0.5) {

s[1] = 'D'

} else {

s[1] = 'E'

}

switch (s[1]) {

case 'D': {

a[4] = "1"

a[5] = "0"

if (Math.random() <0.5) {

s[4] = 'H'

} else {

s[4] = 'E'

}

switch (s[4]) {

case 'H': {

a[7] = a[8] = "0"

}

break

case 'E': {

a[7] = "1"

if (Math.random() <0.5) {

s[7] = 'H'

} else {

s[7] = 'C'

}

switch (s[7]) {

case 'H': {

a[8] = "0"

}

break

case 'C': {

a[8] = "1"

if (Math.random() <0.5) {

s[8] = 'G'

} else {

s[8] = 'F'

}

}

}

}

}

}

break

case 'E': {

a[4] = a[7] = "0"

a[5] = "1"

if (Math.random() <1 / 3.0) {

s[5] = 'H'

} else if (Math.random() >= 1.0 / 3.0

&&Math.random() <2.0 / 3.0) {

s[5] = 'C'

} else

s[5] = 'D'

switch (s[5]) {

case 'H':

case 'D': {

a[8] = "0"

}

break

case 'C': {

a[8] = "1"

if (Math.random() <0.5) {

s[8] = 'G'

} else {

s[8] = 'F'

}

}

}

}

}

}

break

case 'E': {// s[0]选择E

a[2] = "1"

a[1] = a[3] = a[4] = a[5] = a[7] = a[6] = "0"

if (Math.random() <0.25) {

s[2] = 'B'

} else if (Math.random() >= 0.25 &&Math.random() <0.5) {

s[2] = 'C'

} else if (Math.random() >= 0.5 &&Math.random() <0.75) {

s[2] = 'D'

} else

s[2] = 'H'

switch (s[2]) {

case 'H':

case 'D':

case 'B': {

a[8] = "0"

}

break

case 'C': {

a[8] = "1"

if (Math.random() <0.5) {

s[8] = 'G'

} else {

s[8] = 'F'

}

}

}

}

break

case 'C': {// ss[0]选择C

a[1] = a[2] = a[4] = a[5] = a[7] = a[8] = "0"

a[3] = "1"

if (Math.random() <1 / 3.0) {

s[3] = 'G'

} else if (Math.random() >= 1.0 / 3.0 &&Math.random() <2.0 / 3.0) {

s[3] = 'F'

} else

s[3] = 'E'

switch (s[3]) {

case 'G':

case 'F': {

a[6] = "0"

}

break

case 'E': {

a[6] = "1"

if (Math.random() <1 / 3.0) {

s[6] = 'H'

} else if (Math.random() >= 1.0 / 3.0

&&Math.random() <2.0 / 3.0) {

s[6] = 'D'

} else

s[6] = 'B'

}

}

}

}

String res = ""

StringBuffer bf = new StringBuffer()

for (int i = 0i <s.lengthi++) {

bf.append(s[i])

}

res = bf.toString()

return res

}

String[] inialPops() {

String[] ipop = new String[10]

for (int i = 0i <10i++) {

ipop[i] = inialPop()

System.out.println(ipop[i])

}

for (int i = 0i <params1.lengthi++) {

System.out.print(params1[i][0] + " ")

}

return ipop

}

double calcfit() {

int bw = 0

int delay = 0

int len = 0

String ss = inialPop()

char[] s = ss.toCharArray()

switch (s[0]) {

case 'B': {// A-B

if (params1[0][0] >params1[1][0]) {

bw = params1[1][0]

} else {

bw = params1[0][0]

}

delay = params1[0][1] + params1[1][1]

len += params2[0]

switch (s[1]) {

case 'D': {// ABD

if (params1[4][0] <bw) {

bw = params1[4][0]

}

delay += params1[4][1]

len += params2[1]

switch (s[4]) {

case 'H': {// ABDH

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay += params1[5][1]

len += params2[2]

}

break

case 'E': {// ABDE

if (params1[3][0] <bw) {

bw = params1[3][0]

}

delay += params1[3][1]

len += params2[9]

switch (s[7]) {

case 'H': {// ABDEH

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay += params1[5][1]

len += params2[11]

}

break

case 'C': {// ABDEC

if (params1[2][0] <bw) {

bw = params1[5][0]

}

delay += params1[2][1]

len += params2[12]

switch (s[8]) {

case 'G': {// ABDECGH

if (params1[7][0] <bw) {

bw = params1[7][0]

}

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay = delay + params1[5][1] + params1[7][1]

len = len + params2[8] + params2[3]

}

break

case 'F': {// ABDECFGH

if (params1[6][0] <bw) {

bw = params1[6][0]

}

if (params1[7][0] <bw) {

bw = params1[7][0]

}

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay = delay + params1[5][1] + params1[7][1]

+ params1[6][1]

len = len + params2[5] + params2[4] + params2[3]

}

}

}

}

}

}

}

break

case 'E': {// ABE

if (params1[3][0] <bw) {

bw = params1[3][0]

}

delay += params1[3][1]

len += params2[9]

switch (s[5]) {

case 'H': {// ABEH

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay += params1[5][1]

len += params2[11]

}

break

case 'D': {// ABEDH

if (params1[4][0] <bw) {

bw = params1[4][0]

}

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay += params1[5][1] + params1[4][1]

len += params2[10] + params2[2]

}

break

case 'C': {// ABEC

if (params1[2][0] <bw) {

bw = params1[2][0]

}

delay += params1[2][1]

len += params2[12]

switch (s[8]) {

case 'G': {// ABECGH

if (params1[7][0] <bw) {

bw = params1[7][0]

}

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay += params1[5][1] + params1[7][1]

len += params2[8] + params2[3]

}

break

case 'F': {

if (params1[6][0] <bw) {

bw = params1[6][0]

}

if (params1[7][0] <bw) {

bw = params1[7][0]

}

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay = delay + params1[5][1] + params1[7][1]

+ params1[6][1]

len = len + params2[5] + params2[4] + params2[3]

}

}

}

}

}

}

}

break

case 'E': {// AE

if (params1[0][0] <params1[3][0]) {

bw = params1[0][0]

} else {

bw = params1[3][0]

}

delay = params1[0][1] + params1[3][1]

len = params2[7]

switch (s[2]) {

case 'H': {// AEH

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay += params1[5][1]

len += params2[11]

}

break

case 'D': {// AEDH

if (params1[4][0] <bw) {

bw = params1[4][0]

}

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay += params1[5][1] + params1[4][1]

len += params2[10] + params2[2]

}

break

case 'B': {// AEBDH

if (params1[1][0] <bw) {

bw = params1[1][0]

}

if (params1[4][0] <bw) {

bw = params1[4][0]

}

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay += params1[5][1] + params1[4][1] + params1[1][1]

len += params2[9] + params2[1] + params2[2]

}

break

case 'C': {// AEC

if (params1[2][0] <bw) {

bw = params1[5][0]

}

delay += params1[2][1]

len += params2[12]

switch (s[8]) {

case 'G': {// AECGH

if (params1[7][0] <bw) {

bw = params1[7][0]

}

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay = delay + params1[5][1] + params1[7][1]

len = len + params2[8] + params2[3]

}

break

case 'F': {// AECFGH

if (params1[6][0] <bw) {

bw = params1[6][0]

}

if (params1[7][0] <bw) {

bw = params1[7][0]

}

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay = delay + params1[5][1] + params1[7][1]

+ params1[6][1]

len = len + params2[5] + params2[4] + params2[3]

}

}

}

}

}

break

case 'C': {// AC

if (params1[0][0] <params1[2][0]) {

bw = params1[0][0]

} else {

bw = params1[2][0]

}

delay = params1[0][1] + params1[2][1]

len = params2[6]

switch (s[3]) {

case 'G': {// ACGH

if (params1[7][0] <bw) {

bw = params1[7][0]

}

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay = delay + params1[5][1] + params1[7][1]

len = len + params2[8] + params2[3]

}

break

case 'F': {// ACFGH

if (params1[6][0] <bw) {

bw = params1[6][0]

}

if (params1[7][0] <bw) {

bw = params1[7][0]

}

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay = delay + params1[5][1] + params1[7][1] + params1[6][1]

len = len + params2[5] + params2[4] + params2[3]

}

break

case 'E': {// ACE

if (params1[3][0] <bw) {

bw = params1[3][0]

}

delay += params1[3][1]

len += params2[12]

switch (s[6]) {

case 'H': {// ACEH

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay += params1[5][1]

len += params2[11]

}

break

case 'D': {// ACEDH

if (params1[4][0] <bw) {

bw = params1[4][0]

}

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay += params1[5][1] + params1[4][1]

len += params2[10] + params2[2]

}

break

case 'B': {// AEBDH

if (params1[1][0] <bw) {

bw = params1[1][0]

}

if (params1[4][0] <bw) {

bw = params1[4][0]

}

if (params1[5][0] <bw) {

bw = params1[5][0]

}

delay += params1[5][1] + params1[4][1] + params1[1][1]

len += params2[9] + params2[1] + params2[2]

}

}

}

}

}

}

double fitness1 = ((bw - 2000) + (200 - delay) * 10)

double fitness = fitness1 / len

return fitness

}

private void cross() {

String temp1, temp2

for (int i = 0i <10i++) {

if (Math.random() <0.25) {

double r = Math.random()

int pos = (int) (Math.round(r * 1000)) % 9

if (pos == 0) {

pos = 1

}

Object[] ipop = null

temp1 = ((String) ipop[i]).substring(0, pos)

+ ((String) ipop[(i + 1) % 10]).substring(pos)

temp2 = ((String) ipop[(i + 1) % 10]).substring(0, pos)

+ ((String) ipop[i]).substring(pos)

ipop[i] = temp1

ipop[(i + 1) / 10] = temp2

}

}

}

private void mutation() {

for (int i = 0i <4i++) {

int num = (int) (Math.random() * 9 * 10 + 1)

int chromosomeNum = (int) (num / 9) + 1

int mutationNum = num - (chromosomeNum - 1) * 9

if (mutationNum == 0)

mutationNum = 1

chromosomeNum = chromosomeNum - 1

if (chromosomeNum >= 10)

chromosomeNum = 9

String temp

Object[] ipop = null

if (((String) ipop[chromosomeNum]).charAt(mutationNum - 1) == '0') {

if (mutationNum == 1) {

temp = "1" + ((String) ipop[chromosomeNum]).substring

(mutationNum)

} else {

if (mutationNum != 9) {

temp = ((String) ipop[chromosomeNum]).substring(0,

mutationNum -

1)

+ "1" + ((String) ipop

[chromosomeNum]).substring(mutationNum)

} else {

temp = ((String) ipop[chromosomeNum]).substring(0,

mutationNum - 1)

+ "1"

}

}

} else {

if (mutationNum == 1) {

temp = "0" + ((String) ipop[chromosomeNum]).substring

(mutationNum)

} else {

if (mutationNum != 9) {

temp = ((String) ipop[chromosomeNum]).substring(0,

mutationNum -

1)

+ "0" + ((String) ipop

[chromosomeNum]).substring(mutationNum)

} else {

temp = ((String) ipop[chromosomeNum]).substring(0,

mutationNum - 1)

+ "1"

}

}

}

ipop[chromosomeNum] = temp

}

}

public String process() {

String str = ""

for (int i = 0i <10000i++) {

this.inialPop()

this.cross()

this.mutation()

}

return str

}

double acc() {

double qwe = calcfit()

System.out.println(qwe)

return qwe

}

private void tenacc() {

double[] ds = new double[10]

String[] ipop = new String[10]

for (int i = 0i <10i++) {

ipop[i] = inialPop()

ds[i] = calcfit()

// System.out.println(ipop[i])

// System.out.println(ds[i])

}

for (int i = 1i <ds.lengthi++) {

if (ds[0] >ds[i]) {

ipop[0] = ipop[i]

}

}

Graphics g = null

g = getGraphics()

super.paint(g)

// g.clearRect(0, 0, 400, 400)

g.fillOval(30,120,10,10)

g.fillOval(100,30,10,10)

g.drawString("E",148,148)

g.drawString("F",160,253)

g.drawString("G",245,202)

g.drawString("H",270,130)

}

}

/*

* private void paintComponent(Graphics gg) { super.paintComponent(gg)

* Graphics2D g = (Graphics2D)ggg.setStroke(new BasicStroke(10))

* g.drawOval(100,50,200,200)this.repaint()}

*/