问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

遗传算法求最短路径

发布网友 发布时间: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...

求最短路径的算法 有哪些求最短路径的算法 floyed算法求最短路径 迪杰斯特拉算法求最短路径 用标号法求最短路径 标号法求最短路径过程 最短路径算法 遗传算法求最优解 遗传算法求最大值
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我做3D图时渲染提示VR内存不足,然后我再我的电脑属性里修改了/PAE, vr游戏需要电脑吗_玩vr游戏需要什么配置的电脑 VRay对显卡要求高吗 广州理工和广东理工学院哪个好 广州理工学院好不好怎么样 广州理工学院好还是广州工商学院好? 广东白云学院和广州理工哪个好 广州理工学院值得读吗 宿迁市尚呈医药咨询有限公司怎么样? 宿迁盛基医药科技有限公司怎么样? 求教如何制作滚动的字幕式的GIF,例如把 【一二三四】这几个字从左往右移动最后消失。 二进制中都是怎么算的呀,各位大哥帮帮忙说详细点我不懂谢谢了!!! 地址码长度为二进制24位时 其寻址范围是16M怎么计算的? 地址码长度为二进制24位时,其寻址范围是16MB,是怎么计算的?要具体的过程, 什么是等长码?为什么用等长码传10000个数字需要40000个二进制码? 怎样计算一个二进制编码的长度 等长二进制编码 认定事后恶意抵押应考虑哪些因素 关于《物权法》191条,抵押财产转让时,抵押权人的权利救济? 已经抵押房产,该房东串通朋友恶意按抵押之前的日期伪造了10年的租赁合同. 抵押和租赁的冲突如何解决? 抵押合同无效的情形包括哪些,签订质押合同需要注意什么 有一位母亲和儿子相依为命.儿子长大后,深深得爱上了一位漂亮姑娘,可是这个姑娘为了 上internet,必须安装的软件是 抵押人转让抵押物行为无效怎么确定 Internet上最重要的信息资源是WEB网页,浏览网页最常用的软件是?1Word 2InternetExpIorer3OutIooExpres 从internet上获得软件最常采用什么 六年级下册语文,课本第一课北京的春天,哪段是详写哪段是略写 北京空调移机多少钱 六年级冀教版下册语文第一课课文 怎么让幻灯片放一首歌放到结束啊 买投影仪要影布好还是支架划算? 我主要放投影仪用的,这两款柜哪个柜子最合适? 还想把那个投影仪放在沙发靠背后面? 投影仪支架在哪儿买更可靠? 为什么突然尿裤子,有这样的情况吗 投影仪,那投影仪是要放在墙上还是放在桌上呢?然后墙上就挂着一个挺大的大白布,放在墙上的时候还要在墙 之前一直不尿裤子,最近突然有点尿裤子了怎么回事 几天突然故意尿裤子拉裤子,愁死了,怎么办 我老公突然尿裤子是怎么回事 打算在家里买个投影机。一般是吊起来好的还是就这么放桌子上,有啥区别吗? 丫头这几天突然开始尿裤子了,怎么回事呀。 当贝投影仪支架大家知道吗?入手哪款好? 10岁女孩晚上洗脚突然尿裤子怎么回事,自己不自觉就尿了 女,26岁,晚上涮碗洗手时突然憋不住尿裤子,已连续五天了,是怎么回事? 建设银行实习介绍信怎么写 听说每年空调在使用前都要给空调洗个‘澡’,空调清洗保养有什么好处? 地税的纳税人识别号和国税纳税人识别号一样吗 纳税人识别号国税地税是否应该号码相同?不一样可以吗? 现在实习了,但公司要学校的介绍信,谁知道这个介绍信怎么写? 请问开专用*的时候,提供的纳税人识别号 如何区分地税与国税识别号呢?(什么情况提供地税的,什么情况下提