十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
我这有飞机巡航的代码,本质上和旅行商问题一样,代码如下(非原创):
邵原ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!
function mySim()
disp('模拟退火求巡航路径');
data=xlsread('飞机巡航数据.xlsx','sheet1','C4:J28');
x=data(:,1:2:8);x=x(:);
y=data(:,2:2:8);y=y(:);
si=[x y]; d1=[70,40];
si=[d1;si;d1];
sj=si;
sj=sj*pi/180; %经纬度化为弧度制
d=zeros(102); %距离矩阵d
for i=1:101
for j=i+1:102
temp=cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2));
d(i,j)=6370*acos(temp);
end
end
d=d+d'; %生成距离矩阵
S0=[]; %用于存放最优路径
Sum=inf; %用于存放最优解
rand('state',sum(clock)); %设随机种子
for j=1:1000
S=[1 1+randperm(100),102]; %randperm(n)用于随机生成1到n的一个排列
temp=0;
for i=1:101
temp=temp+d(S(i),S(i+1));
end
if tempSum
S0=S;Sum=temp;
end
end
e=0.1^30;L=20000;at=0.999;T=1;
%退火过程
for k=1:L
%产生新解
c=2+floor(100*rand(1,2)); %floor向下取整,rand(m,n)生成m*n阶(0,1)随机矩阵
c=sort(c); %顺序排列
c1=c(1);c2=c(2);
%计算代价函数值
df=d(S0(c1-1),S0(c2))+d(S0(c1),S0(c2+1))-d(S0(c1-1),S0(c1))-d(S0(c2),S0(c2+1));
%接受准则
if df0
S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];
Sum=Sum+df;
elseif exp(-df/T)rand(1)
S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];
Sum=Sum+df;
end
T=T*at;
if Te
break;
end
end
% 输出巡航路径及路径长度
S0,Sum
%巡航时间
v=xlsread('飞机巡航数据.xlsx','sheet1','A2');
time=Sum/v(1,1)
%画出路径图
r=size(sj,1);
for i=1:r-1;
plot([si(S0(i),1) si(S0(i+1),1)],[si(S0(i),2) si(S0(i+1),2)],'*');
line([si(S0(i),1) si(S0(i+1),1)],[si(S0(i),2) si(S0(i+1),2)]);
hold on
end
你的,和】是中文格式的,改成半角的就好了。
,和]就对了。
模拟退火算法
Java基础06-方法的定义、声明、使用、重载
1.方法
方法是Java中一个明名的代码块,如同在数学中用到的函数,其他语言常常直接称为函数。
方法 通常是为了完成某一个特定功能,把程序中特定的代码组合到一起而构成的,其主要好处体现在两个方面:
一个是重用,另一个是使程序结构更加清晰。
方法的声明语法如下:
[修饰符] 返回值类型 方法名(形参列表){
方法体;
}
在Java 中,修饰符为访问者的权限大小,public 、protected、default、private、权限范围不同。
返回值类型 为数据类型 也就是说 你让方法完成了某项功能要不要返回一个结果,或者说你让程序做事
要不要程序给你个结果,所以返回值类型可以写成void即不需要返回什么,
返回值类型可以是基本数据类型也可以是引用类型
如果方法有返回值,那么方法体中必须写上“return 返回值;”,返回值的类型必须和方法上规定的返回值类型一致,
方法名可以重复和但不能使用关键字,方法中的形参其实就是你想让方法完成功能,给方法传输参数,形参是传入参数的类型
的一种表达,就好比你要让方法算两个人年龄的综合,你的传入两个int类型的参数,不然数据无法计算
例如:
public int all(int age1,int age2){
return age1+age2;
}
方法返回的是两个数的和。
无参数方法很简单:
注意:静态方法调用需要加上静态修饰符static
例如:
图中c=function();
说明function()本身就是一个值;
所以可以省略一定的步骤:
直接System.out.print(function());
输出的结果照样是:15
注意:方法有参数不一定有返回值,有返回值不一定有参数,并且方法执行遇到return就结束了,不会执行下面代码,并且return下面写的代码会报错。
例如:
return 0;
int a=0;
语法错误,编译不通过
2.方法的使用。
(1).注意方法的修饰符,决定了方法的使用范围,
(2).方法的调用:方法也可以自己调用自己,(递归)。
(3).方法如果没有返回值也可以return;只不过return后面不加参数
clear
clc
a = 0.95
k = [5;10;13;4;3;11;13;10;8;16;7;4];
k = -k; % 模拟退火算法是求解最小值,故取负数
d = [2;5;18;3;2;5;10;4;11;7;14;6];
restriction = 46;
num = 12;
sol_new = ones(1,num); % 生成初始解
E_current = inf;E_best = inf;
% E_current是当前解对应的目标函数值(即背包中物品总价值);
% E_new是新解的目标函数值;
% E_best是最优解的
sol_current = sol_new; sol_best = sol_new;
t0=97; tf=3; t=t0;
p=1;
while t=tf
for r=1:100
%产生随机扰动
tmp=ceil(rand.*num);
sol_new(1,tmp)=~sol_new(1,tmp);
%检查是否满足约束
while 1
q=(sol_new*d = restriction);
if ~q
p=~p; %实现交错着逆转头尾的第一个1
tmp=find(sol_new==1);
if p
sol_new(1,tmp)=0;
else
sol_new(1,tmp(end))=0;
end
else
break
end
end
% 计算背包中的物品价值
E_new=sol_new*k;
if E_newE_current
E_current=E_new;
sol_current=sol_new;
if E_newE_best
% 把冷却过程中最好的解保存下来
E_best=E_new;
sol_best=sol_new;
end
else
if randexp(-(E_new-E_current)./t)
E_current=E_new;
sol_current=sol_new;
else
sol_new=sol_current;
end
end
end
t=t.*a;
end
disp('最优解为:')
sol_best
disp('物品总价值等于:')
val=-E_best;
disp(val)
disp('背包中物品重量是:')
disp(sol_best * d)
说实话找完整的代码还是比较难的,因为一般都会保密,分享出来的很少。
不过可以到pudn程序员联合开发网上去找找。
链接: