字节跳动算法面试题库蚂蚁群算法求解最短路径问题(Python&Matlab实现,砥砺前行

%% 导入数据,导入方式,看个人习惯

zuobiao=[1304 2312

3639 1315

4177 2244

3712 1399

3488 1535

3326 1556

3238 1229

4196 1004

4312 790

4386 570

3007 1970

2562 1756

2788 1491

2381 1676

1332 695

3715 1678

3918 2179

4061 2370

3780 2212

3676 2578

4029 2838

4263 2931

3429 1908

3507 2367

3394 2643

3439 3201

2935 3240

3140 3550

2545 2357

2778 2826

2370 2975];

%% 计算城市间相互距离

n = size(zuobiao,1);%城市个数

jl = zeros(n,n);%首先求得各个坐标点的距离,这里是矩阵初始化

for i = 1:n

for j = 1:n

if i ~= j %~=是不等于的意思,zuobiao矩阵中每行都有个坐标,坐标相减用i和j区分不同的坐标点,然后求两点距离

jl(i,j) = sqrt(sum((zuobiao(i,:) - zuobiao(j,:)).^2));

%上式运算如a=[2,2;1,1]=>a(1,:)-a(2,:)=>ans =1 1,然后1?+1?=2,最后开根号

else

jl(i,j) = 1e-4;%相等的点相减准确说是等于0的,这里设置成了一个很小的数,是为了避免后面程序运算出错

end

end

end

%% 初始化参数

m = 50; % 蚂蚁数量,视情况而定,坐标点多的话可以适当增加蚂蚁数量

a= 1; % 信息素重要程度因子

b= 5; % 启发函数重要程度因子

r = 0.1; % 信息素挥发因子

Q = 1; % 常数

qfhs = 1./jl; % 启发函数,将jl矩阵中每个元素转化为倒数

xxsjz = ones(n,n); % 信息素矩阵初始化

ljjl = zeros(m,n); % 路径记录表矩阵初始化

ddcs = 1; % 迭代次数初值

ddcs_max = 200; % 最大迭代次数

Lujin_best = zeros(ddcs_max,n); % 各代最佳路径

L_best = zeros(ddcs_max,1); % 各代最佳路径的长度

L_ave = zeros(ddcs_max,1); % 各代路径的平均长度

%% 迭代寻找最佳路径

while ddcs <= ddcs_max%在ddcs小于ddcs_max前,一直循环

%% 随机产生各个蚂蚁的起点

start = zeros(m,1);

for i = 1:m

temp = randperm(n);%功能是随机打乱一个数字序列,也就是现将坐标点排号再打乱,相当于将蚂蚁随机分布在各个地点

start(i) = temp(1);

end

ljjl(:,1) = start;

%% 构建解空间

zuobiao_index = 1:n;

% 逐个蚂蚁路径选择

for i = 1:m

% 逐个地点路径选择

for j = 2:n

yfw = ljjl(i,1:(j - 1)); % 已访问的地点集合(禁忌表)

allow_index = ~ismember(zuobiao_index,yfw);%ismember用于判断矩阵某个元素是否存在,用法详见后文函数讲解

allow = zuobiao_index(allow_index); % 待访问的城市集合

P = allow;

% 计算城市间转移概率

for k = 1:length(allow)

P(k) = xxsjz(yfw(end),allow(k))^a * qfhs(yfw(end),allow(k))^b;%见文中公式

end

P = P/sum§;

% 选择下一个访问城市

Plj = cumsum§; %cumsum函数用于累加,具体用法详见后文函数讲解

yidong_index = find(Plj >= rand);

yidong = allow(yidong_index(1));

ljjl(i,j) = yidong;

end

end

% 计算各个蚂蚁的路径距离

L = zeros(m,1);

for i = 1:m

Lujin = ljjl(i,:);

for j = 1:(n - 1)

L(i) = L(i) + jl(Lujin(j),Lujin(j + 1));

end

L(i) = L(i) + jl(Lujin(n),Lujin(1));

end

% 计算最短路径距离及平均距离

if ddcs == 1

[min_L,min_index] = min(L);

L_best(ddcs) = min_L;

L_ave(ddcs) = mean(L);

Lujin_best(ddcs,:) = ljjl(min_index,:);

else

[min_L,min_index] = min(L);

L_best(ddcs) = min(L_best(ddcs - 1),min_L);

L_ave(ddcs) = mean(L);

if L_best(ddcs) == min_L

Lujin_best(ddcs,:) = ljjl(min_index,:);

else

Lujin_best(ddcs,:) = Lujin_best((ddcs-1)😅;

end

end

%% 更新信息素

S = zeros(n,n);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
img

做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。

别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。

我先来介绍一下这些东西怎么用,文末抱走。


(1)Python所有方向的学习路线(新版)

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

(4)200多本电子书

这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。

基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。

(5)Python知识点汇总

知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。

在这里插入图片描述

(6)其他资料

还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。

在这里插入图片描述

这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

都是可以拿到的。**

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蚁群算法是一种基于蚁找食物的行为模拟的优化算法,可以用来求解最优化问题,其中包括求解最短路径问题。下面是使用Python实现蚁群算法求解最短路径的示例代码: ```python import numpy as np import random # 定义城市距离矩阵 distance = np.array([ [0, 1, 2, 3], [1, 0, 4, 5], [2, 4, 0, 6], [3, 5, 6, 0] ]) # 初始化参数 ant_count = 5 alpha = 1 beta = 5 rho = 0.1 Q = 1 iterations = 10 # 初始化信息素矩阵 pheromone = np.ones((4, 4)) # 定义求解最短路径的函数 def calculate_path(city_distance, ant_count, alpha, beta, rho, Q, iterations, pheromone): shortest_distance = float('inf') shortest_path = [] for i in range(iterations): # 每个蚁的起点随机选择 start_node = random.randint(0, len(city_distance) - 1) ant_path = [start_node] distance_travelled = 0 for j in range(len(city_distance) - 1): # 计算下一个节点的概率 probabilities = np.zeros(len(city_distance)) current_node = ant_path[-1] for k in range(len(city_distance)): if k not in ant_path: probabilities[k] = (pheromone[current_node][k] ** alpha) * ((1 / city_distance[current_node][k]) ** beta) probabilities = probabilities / probabilities.sum() next_node = np.random.choice(range(len(city_distance)), p=probabilities) ant_path.append(next_node) distance_travelled += city_distance[current_node][next_node] # 加上回到起点的距离 distance_travelled += city_distance[ant_path[-1]][ant_path[0]] # 更新最短路径和距离 if distance_travelled < shortest_distance: shortest_distance = distance_travelled shortest_path = ant_path # 更新信息素矩阵 pheromone *= (1 - rho) for l in range(len(city_distance) - 1): i = ant_path[l] j = ant_path[l + 1] pheromone[i][j] += (Q / distance_travelled) pheromone[j][i] = pheromone[i][j] return shortest_distance, shortest_path # 调用函数求解最短路径 shortest_distance, shortest_path = calculate_path(distance, ant_count, alpha, beta, rho, Q, iterations, pheromone) # 打印结果 print("Shortest Distance:", shortest_distance) print("Shortest Path:", shortest_path) ``` 在上面的代码中,我们首先定义了城市距离矩阵,然后初始化了算法需要的一些参数,包括蚁数量、信息素的重要程度、距离的重要程度、信息素挥发率、信息素常数和迭代次数。然后,我们初始化了信息素矩阵,并定义了一个函数来求解最短路径。在函数内部,我们首先随机选择起点,然后每个蚁按照一定的概率选择下一个节点,直到经过所有的节点,最后回到起点。在选择下一个节点的过程中,我们根据信息素和距离的重要程度计算每个节点被选择的概率,并使用numpy的random.choice函数来选择下一个节点。在蚁完成一次完整的遍历之后,我们更新最短路径和距离,并更新信息素矩阵。最后,我们调用该函数并打印出最短路径和距离的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值