遗传算法求最短路径
发布网友
发布时间:2022-05-11 20:45
我来回答
共3个回答
热心网友
时间:2023-10-19 22:10
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<string>
using namespace std;
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define INFINITY 200//最大值
#define MAX_VERTEX_NUM 20//最大顶点个数
typedef char VertexType;//定义为char类型
//以下是全局变量,用于保存弗洛伊德算法的路径和长度
int D[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//记录最短路径长度
int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NUM];//记录最短路径标记
//以下是全局变量,用于保存迪杰斯特拉算法的路径和长度
int Distance[MAX_VERTEX_NUM];
VertexType former[MAX_VERTEX_NUM];//终点的前一个顶点
bool final[MAX_VERTEX_NUM];//记录顶点是否在V-S中
typedef struct ArcCell
{
int adj; //顶点关系类型
int weight; //该弧相关信息的指针,在此记录为权值
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
VertexType vexs[MAX_VERTEX_NUM]; //顶点向量
AdjMatrix arcs; //邻接矩阵
int vexnum; //顶点数
int arcnum; //弧数
}MGraph;
void InitialMGraph(MGraph &G)//初始化
{
G.arcnum=G.vexnum=0; //初始化边数跟顶点数都为零
for(int i=0;i<MAX_VERTEX_NUM;i++)
for(int j=0;j<MAX_VERTEX_NUM;j++)
{
if(i==j)
G.arcs[i][j].weight=0;
else
G.arcs[i][j].weight=INFINITY; //初始化为200,以200认为是无穷大
}
}
void InsertVex(MGraph &G,VertexType v)//插入顶点
{
if(G.vexnum<=MAX_VERTEX_NUM)
G.vexs[G.vexnum++]=v;
}
void InsertArc(MGraph &G,VertexType v1,VertexType v2)//插入边
{
int m,n;
G.arcnum++;
for(int k=0;k<G.vexnum;k++)
{
if(G.vexs[k]==v1)
m=k;
if(G.vexs[k]==v2)
n=k;
}
//插入
ArcCell A;
cout<<"请输入权值:";
cin>>A.weight;
G.arcs[m][n].weight=A.weight;
}
//迪杰斯特拉最短路径,假设始点就存储在数组中的第一个
void ShortestPath_DIJ(MGraph G,int v0)
{
//初始化距离
for(int v=0;v<G.vexnum;++v)
{
final[v]=false;
Distance[v]=G.arcs[v0][v].weight;
if(Distance[v]<INFINITY&&Distance[v]!=0)
{
former[v]=G.vexs[v0];
}
else
former[v]='#';
}
final[v0]=true;
former[v0]=G.vexs[v0];
for(int i=1;i<G.vexnum;++i)//剩余的G.vexnum-1个顶点
{
int w;
int min=INFINITY;
int v=-1;
for(w=0;w<G.vexnum;++w)
{
if(!final[w]&&Distance[w]<min)
{
v=w;
min=Distance[w];
}
}
if(v!=-1)
{
final[v]=true;//将离顶点V0最近的顶点v加入S集合中
for(w=0;w<G.vexnum;++w)//更新当前的最短路径及距离
{
if(!final[w]&&(min+G.arcs[v][w].weight<Distance[w])&&G.arcs[v][w].weight<INFINITY)
{
Distance[w]=min+G.arcs[v][w].weight;
former[w]=G.vexs[v];
}
}
}
}
}
//输出迪杰斯特拉中的最短路径
void output_ShortestPath_DIJ(MGraph G,int v0)
{
int i;
for(i=1;i<G.vexnum;i++)
{
cout<<G.vexs[v0]<<"->"<<G.vexs[i]<<":";
if(Distance[i]!=INFINITY)
{
cout<<"最短路径长度为:"<<Distance[i]<<" 最短路径的前一个顶点为:"<<former[i];
cout<<endl;
}
else
cout<<"此两顶点之间不存在路径"<<endl;
}
}
//弗洛伊德最短路径
void shortestPath_FLOYD(MGraph G)
{
for(int v=0;v<G.vexnum;++v)
{
for(int w=0;w<G.vexnum;++w)
{
D[v][w]=G.arcs[v][w].weight;
for (int k=0;k< G.vexnum;k++)
P[v][w][k]=-1;
if(D[v][w]<INFINITY) //从v到w有直接路径
P[v][w][v]=w;
}
}
for(int k=0;k<G.vexnum;++k)
{
for(int v=0;v<G.vexnum;v++)
for(int w=0;w<G.vexnum;++w)
if(D[v][w]>D[v][k]+D[k][w])
{
D[v][w]=D[v][k]+D[k][w];
for(int i=0;i<G.vexnum;i++)
{
if(P[v][k][i]!=-1)//原来存了顶点
P[v][w][i]=P[v][k][i];
else
P[v][w][i]=P[k][w][i];
}
}
}
}
//输出弗洛伊德中的最短路径
void output_shortestPath_FLOYD(MGraph G)
{
for(int i=0;i<G.vexnum;++i)
{
for(int j=0;j<G.vexnum;++j)
{
if(i!=j)//自己不能到达自己
{
cout<<G.vexs[i]<<"->"<<G.vexs[j]<<":";
if(D[i][j]==INFINITY)
{
cout<<"此两顶点之间不存在路径"<<endl;
}
else
{
cout<<"最短路径长度为:"<<" "<<D[i][j]<<" ";
cout<<"最短路径为:";
cout<<G.vexs[i];
for(int k=i;k!=-1;k=P[i][j][k])
{
if(k!=i)
cout<<G.vexs[k];
}
cout<<endl;
}
}
}
}
}
int main()
{
int num1;//顶点个数
int num2;//弧个数
cout<<"请输入顶点个数:";
cin>>num1;
cout<<"请输入弧个数:";
cin>>num2;
VertexType v;
MGraph G;
InitialMGraph(G);
cout<<"请输入顶点的信息:"<<endl;
for(int i=0;i<num1;++i)
{
cin>>v;;
InsertVex(G,v);
}
VertexType v1,v2;
for(int j=0;j<num2;++j)
{
cout<<"请输入两个结点数据来表示的边:";
cin>>v1>>v2;
InsertArc(G,v1,v2);
}
ShortestPath_DIJ(G,0);
cout<<"迪杰斯特拉中的最短路径如下:"<<endl;
output_ShortestPath_DIJ(G,0);
cout<<endl<<endl;
shortestPath_FLOYD(G);
cout<<"弗洛伊德中的最短路径如下:"<<endl;
output_shortestPath_FLOYD(G);
return 0;
}
热心网友
时间:2023-10-19 22:10
#include "stdafx.h"
#include "stdio.h" //标准输入输出库
#include "stdlib.h" //标准函数库
#include "time.h"
#include "iostream.h"
#include "iomanip.h"
#include "math.h" //数学函数库
#define MAX 1 //设定求最大适应值
#define MIN 2
#define CHROMLENGTH 15 //染色体长度,注意编码变化时,要随时修改
#define MAXNUM 1000
#define Cmax 30 //估计最大值
#define Cmin 0 //估计最小值
int PopSize = 150; //每代最大个体数
int FunctionMode = MIN;
double m_fPc = 0.9; //交叉概率
double m_fPm = 0.009; //变异概率
int MaxGeneration = 20; //最大世代数
int d[150][15]; //找到染色体并拷贝到这个数组中
int s[150][15];
int generation; //世代数
int Best_Index; //最好个体下标
int Worst_Index; //最坏个体下标
struct indivial //定义个体数据结构
{
double chrom[CHROMLENGTH+1]; //染色体
double value; //函数值
double fitness; //适应度
};
struct indivial
BestIndivial; //当代最佳个体
struct indivial
WorstIndivial;
struct indivial
Group[150]; //种群
double Random(double Low, double High)//本函数实现随机产生Low-High之间的实数 .意思:随机
{
return((double)rand()/RAND_MAX)*(High-Low)+Low;
}
double Max(double a, double b)
{
if(a>=b) return a;
else return b;
}
void GenerateInitialPopulation()//种群初始化,二进制编码初始化其中'1'表示路径顶点在最短路径中,'0'则反之
{
int i,j;
for(i = 0; i < PopSize; i++)
{
for(j = 1; j < CHROMLENGTH-2; j++)
{
Group[i].chrom[j] = (int)(Random(1,10)
热心网友
时间:2023-10-19 22:11
我很纳闷,求两点间最短路径,为何要用遗传算法,而不用A*算法或Dijkstra算法或Floyd算法?
这几种算法的代码,网上可以找到很多。
网上也可以找到很多JGAP的使用说明和使用实例。
你找不到JGAP求最短路径的实例,可能是因为用遗传算法解决最短路径问题的确实不多。
参考资料:http://www.pudn.com/downloads378/sourcecode/java/detail1631327.html
遗传算法解TSP问题
遗传算法在TSP问题求解中的应用 本文主要探讨了如何使用遗传算法来解决旅行商问题(TSP),即寻找一条经过所有城市且总路径最短的路线。实验的核心目标是通过遗传算法的策略,包括选择、交叉和变异操作,来寻找最佳路径。实验环境为Windows 10,采用Python 3和Flask开发框架。在Flask.py的后端代码中,用户可以...
pmx中文是什么意思?
PMX中文翻译成中文是“最短路径交换”,是一种基于遗传算法的优化算法。这种算法最初被应用于解决电子设计自动化中的布线问题,以求得最短的电路连线路径,同时具有高度的效率和准确性。如今,PMX已广泛应用于其他领域,如图像处理、数据挖掘等。PMX算法的实现原理是将两个父代染色体进行重组,从而生成子代...
求最短路径问题 送货郎问题
现在0-1-3-4-5这四个送货点之间的最优访问路径安排就是一个典型的单回路问题。可以通过单回路运输模型-TSP模型求解。一般而言,比较简单的启发式算法求解TSP模型求解有最邻近法和最近插入法两种。由RosenkrantzStearns等人在1977年提出的最近插入法,能够比最近邻点法,取得更满意的解。由于0-1-3-0 已经先构成了一个...
遗传算法解决旅行商(TSP)问题附Matlab代码
例如,对于10个城市,主函数main1.m中的citys矩阵就是2x10的,通过randperm方法生成随机路线,再通过crossover、fitness和mutate等函数进行优化处理。尽管如此,遗传算法并非总能找到全局最优解,可能会陷入局部最优,例如在数据集dsj10.tsp中的实验结果就可能并非最短路径。要理解遗传算法在解决TSP问题上的...
遗传算法和蚁群算法的区别
遗传算法(Genetic Algorithm,GA)是由Holland J.H.于20世纪70年代提出的一种优化方法,其最优解的搜索过程模拟达尔文的进化论和“适者生存”的思想。蚁群算法(Ant Colony Optimization, ACO),是一种用来在图中寻找优化路径的机率型算法。两种算法从概念上都属于随机优化算法,遗传算法是进化算法,主要...
python多个起点不交叉最短路径
如果要求起点之间不交叉,那么存在最短路径。2 因为起点之间不交叉,可以将问题简化为多个单起点单终点的问题,可以使用 Dijkstra 算法或者 A* 算法等求解最短路径的算法。3 如果需要考虑多个起点之间的交叉情况,可以考虑使用遗传算法等启发式算法,不过这样的算法复杂度较高,需要更长的计算时间。
请问哪位高手会用遗传算法求解组合优化问题,并且变量是整数。帮忙用MATL...
遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法,它最初由美国Michigan大学 J.Holland教授于1975年首先提出来的,并出版了颇有影响的专著《Adaptation in Natural and Artificial Systems》,GA这个名称才逐渐...
什么时候使用遗传算法 vs 什么时候使用神经网络
神经网络是非线性统计数据建模工具。可以用来建模输入和输出之间复杂的关系,或者为数据中的查找模式 。当有一个条目的数量在不同的类中,神经网络可以"学习"分类项还没有"看见"之前。 比如,人脸识别,语音识别。遗传算法可以执行定向搜索解决方案的空间。比如:查找两点之间的最短路径。
数学建模中,给出非常多的节点,求这些节点的最短路径(类似一条线的路径...
下面是我自己编写的一段代码,用来求过包含两千多个点的最短路,速度很快,比遗传、蚁群快而且最短路更短。你可以试试看,有问题再问我。function [S,len]=short(P)此程序用来求相同类型点间的最短路 P表示某一类型的点的坐标矩阵 p是最短路径 d是路径权值和 建立权值矩阵 n=length(P);%求该...
求货郎担问题的matlab算法
C为停止代数,遗传到第 C代时程序停止,C的具体取值视问题的规模和耗费的时间而定 m为适应值归一化淘汰加速指数 ,最好取为1,2,3,4 ,不宜太大 alpha为淘汰保护指数,可取为0~1之间任意小数,取1时关闭保护功能,最好取为0.8~1.0 R为最短路径,Rlength为路径长度 function [R,Rlength]=genetic...