文章目录
写在前面
“ 借用这个事情只是让我深刻体会到跨学科跨专业互联共通和善于借用外力实现合作互利共赢的魅力。”
学科融合是未来的趋势,没错了,让我联想到Python线上培训机构铺天盖地宣传让人交钱学习,这个时代真的是需要每个人都懂一点编程思想,基于Python编程可以衍生出许多自动化办公工具,的确是大大提高了生产力,将效率提高了N倍。我不是在给Python打广告,接下来我也不是要讲Python,我只是在感概:
不断学习真的很重要,人不应该只局限于眼前。
MBA智库&&百度百科词条
摘选【MBA智库·百科】
https://wiki.mbalib.com/wiki/%E7%A6%81%E5%BF%8C%E6%90%9C%E7%B4%A2%E7%AE%97%E6%B3%95
摘选【 百度百科词条】
https://baike.baidu.com/item/TSP/2905216
起因
起因是一位管理系物流管理专业的朋友询问我会不会matlab代码操作,实话实说,我回答:了解一些。接着他说提供数据,问我能否帮他做出一种效果图,我也如实回答:不懂M语言,所以不会写算法代码,暂时是做不出来的。后来,他应该是找了软件系或相关专业人士来帮忙写了一份代码,让我在matlab上运行。*这期间,虽稍有波折,但是最终还是能如偿得到结果的,正确与否就不知道,看起来挺专业的,思路应该是正确的,但是运行结果就 *。。。代码在最后我也会贴出来的。
这件事情能让我感触颇深的是人家一个管理系的同学努力去查阅理工科文献资料,甚至研究其中的算法,就为了得到一个合理的结果和一张清楚的效果图,可以作为论文素材的数据支撑。这严谨求学的态度和专业素养真的震撼到我了,我的确要好好地反省下自己,知耻而后勇。
这算法是禁忌搜索算法解决TSP问题,我觉得不简单,这我一看,应该是软件系同学干的活,怎么会是一个文科类同学干的事呢。不仅如此,从大局上讲,这位管理系朋友还协调了我们三者的关系,将我们串联起来,这也是真正牛批的地方,他是管理系物流管理专业的,而我是电子系自动化专业的,另一位是搞算法的,还懂M语言。可能基于某些原因,每当程序写好了,就拿来给我运行结果。
对于这个算法,可能有部分人也感兴趣想知道它到底是何方神圣。我找了一个我看过的优快云博客地址贴出来,供大家了解学习。
禁忌搜索算法(Tabu Search)
https://blog.youkuaiyun.com/zuochao_2013/article/details/72292466
某位大神根据这位同学的需求写的算法↓
close all;
clc;
clear;
tic
distance=load('新建文本文档.txt');
Dstart=distance(1,2:end);
D=distance(2:end,2:end);
city_size=size(D,1); %城市的个数
x0 = randperm(city_size); %初始线路规划
xbest = x0; %最佳线路规划
dbest = 0;
for i = 1:length(x0)-1
dbest = dbest + D(x0(i),x0(i+1));
end
dbest = dbest + Dstart(x0(end))+Dstart(x0(1)); %TSP问题是一个闭环问题
tabu = []; %禁忌表
tabusize = 80; %禁忌表长度限制
iter = 400; %迭代次数上限
A = dbest; %渴望水平
f = dbest; %当前函数值
A_iter = []; %记录渴望水平随迭代次数变化数组
f_iter = []; %记录函数值随迭代次数变化数组
for k = 1:iter
k
deltas = []; %距离差
p = []; %记录倒序两个边界序号
x = []; %记录路径
for j = 1:200
p1 = ceil(city_size*rand(1,2)); %随机1-100中两个整数
p1 = sort(p1);
if(p1(1)~=1)
x1 = [x0(1:p1(1)-1),x0(p1(2):-1:p1(1)),x0(p1(2)+1:end)];
else
x1 = [x0(p1(2):-1:1),x0(p1(2)+1:end)];
end
s1 = 0; %原始解对应的总距离
for i = 1:length(x0)-1
s1 = s1 + D(x0(i),x0(i+1));
end
s1 = s1 + Dstart(x0(end))+Dstart(x0(1));
s2 = 0; %新解对应的总距离
for i = 1:length(x1)-1
s2 = s2 + D(x1(i),x1(i+1));
end
s2 = s2 + Dstart(x1(end))+Dstart(x1(1));
deltaf = s2-s1;
deltas = [deltas,deltaf];
p = [p;p1];
x = [x;x1];
end
key = 0;
[n,m] = sort(deltas); %n是排序结果,m是对应原始索引
p = p(m,:);
x = x(m,:);
for i = 1:length(n)
if(length(tabu)==0)
x0 = x(i,:);
f = f + n(i); %更新函数值
tabu = [tabu;p(i,:)];
if(f+n(i)<A)
A = f + n(i);
xbest = x0;
end
break;
end
if(length(tabu)~=0)
for ii = 1:size(tabu,1)
if(p(i,1)==tabu(ii,1)&&p(i,2)==tabu(ii,2))
key = 1;
break;
end
end
end
if(key==1) %突破渴望水平
if(f+n(i)<A)
x0 = x(i,:);
f = f +n(i);
A = f + n(i);
xbest = x0;
break;
end
end
if(key==0) %新解变动方式不受Tabu表限制
f = f + n(i);
x0 = x(i,:);
tabu = [tabu;p(i,:)];
if(f+n(i)<A) A = f + n(i);
xbest = x0;
end
break;
end
end
%-----------禁忌表超过tabusize更新-----------%
if(length(tabu)>tabusize)
tabu = tabu(2:end,:);
end
A_iter = [A_iter,A];
f_iter = [f_iter,f];
end
disp('最短距离:');
A
disp('最佳路径规划:');
xbest=[0 xbest 0];
xbest
toc
上面这份代码只是在程序结束后命令行窗口直接显示结果,并没有用到显示图像的的函数,所以不会弹出效果图来来。
某次运行结果如下:
后来,为了得到效果图,基于第一份得到完整结果的代码,陆陆续续的发来多个版本的代码,既会在命令窗口出现结果,又可以出现效果图,同样地,我也没有深入研究这代码,结果正确与否就不知道了,
我在这里不是要深究这代码的,是要欣赏人家的态度。不过,欢迎您们搞出更漂亮的代码和效果图,然后,邮箱联系我,感兴趣的话可以彼此交流一下。邮箱地址已在文中给出。
代码就不再贴出来,我会上传优快云资源,文件夹里面包含3个子文件夹代表了3个不同版本程序,其中一个没有效果图,另外两个有效果图。下载需要的积分较多,真的有必要看又没有积分的朋友可以找人代下载,找我也行,邮箱联系:986605959@qq.com
资源地址:
https://download.youkuaiyun.com/download/weixin_42696672/12254203
我贴一张效果图出来吧。其实图片也比较粗糙哈哈,的确不像正确的效果图。期待大家自行在代码里改进。
see you!