function [S,aa,sample]=adjust(sample,a,vh,vm)
%调整函数
[S,aa,sample]=decode(sample);
[c,r]=size(S);
index=find(aa(:,1)<2|aa(:,1)>5); %初始档位不是加速档的索引,修改为加速档
for i=1:length(index)
ran=ceil(rand()*4);
ran=dec2bin(ran,3);
sample(index(i),11)=logical(str2double(ran(1)));
sample(index(i),12)=logical(str2double(ran(2)));
sample(index(i),13)=logical(str2double(ran(3)));
end
%先计算各点v值
v=zeros(c,r);
for i=2:r
as=a(aa(:,i-1));
as=as';
v(:,i)=sqrt(2*as.*(S(:,i)-S(:,i-1))+v(:,i-1).^2);
end
log=angle(v)~=0|v>vm; %选出速度小于0或大于vm的节点
log(:,end-1)=log(:,end-1)|v(:,end-1)>vh;
log(:,end)=log(:,end)*0;%忽略末段速度为0,转为修改节点值
logs=sum(sum(log)); %逻辑和
k=1;
while logs %如果逻辑和不为0,则证明有速度小于0或大于vm
index=find(log); %异常速度的索引
for i=1:length(index)
[x,y]=i2s([c,r],index(i)); %异常速度的位置
if y==r %如果是结尾段速度小于0,就不改了
break
end
if v(x,y)>vm %如果超速,则降档
ran=bin2dec(num2str(sample(x,y*13-15:y*13-13)));
if ran==0
ran=8;
end
ran=ran-1;
ran=dec2bin(ran,3);
sample(x,y*13-15)=logical(str2double(ran(1)));
sample(x,y*13-14)=logical(str2double(ran(2)));
sample(x,y*13-13)=logical(str2double(ran(3)));
elseif y>=9&&v(x,y)>vh %如果末段超速,则修改上一个档位为减速档111 110 101
if k>50 %如果实在无法减速,限定他全程惰性档(变相杀死)
% aa(x,2:end)=0*aa(x,2:end)+1;
% S(x,2)=100;
% sample(x,:)=d_decode(S(x,:),aa(x,:));
sample(x,:)=zeros(1,13*r,'single');
end
ran=ceil(rand()*3)+4;
ran=dec2bin(ran,3);
sample(x,y*13-15)=logical(str2double(ran(1)));
sample(x,y*13-14)=logical(str2double(ran(2)));
sample(x,y*13-13)=logical(str2double(ran(3)));
else %如果没超速,那么速度肯定为负值,修改上一个档位为加速档或者惰性档
ran=floor(rand()*5);
ran=dec2bin(ran,3);
sample(x,y*13-15)=logical(str2double(ran(1)));
sample(x,y*13-14)=logical(str2double(ran(2)));
sample(x,y*13-13)=logical(str2double(ran(3)));
end
end
[S,aa,sample]=decode(sample);
v=zeros(c,r);
for i=2:r
as=a(aa(:,i-1));
as=as';
v(:,i)=sqrt(2*as.*(S(:,i)-S(:,i-1))+v(:,i-1).^2);
end
log=angle(v)~=0|v>vm; %选出速度小于0或大于vm的节点
log(:,end-1)=log(:,end-1)|v(:,end-1)>vh;
log(:,end)=log(:,end)*0;%忽略末段速度为0,转为修改节点值
logs=sum(sum(log)); %逻辑和
k=k+1;
if k>60
disp('Error')
pause
end
end
log=angle(v(:,end))~=0;
index=find(log(:,end)); %找见所有末段速度小于0的点,修改他们的节点值
for i=1:length(index)
as=a(aa(index(i),end-1));
aim=floor(S(index(i),end-1)-v(index(i),end-1)^2/2/as);
ran=dec2bin(aim,10);
sample(index(i),end-12)=logical(str2double(ran(1)));
sample(index(i),end-11)=logical(str2double(ran(2)));
sample(index(i),end-10)=logical(str2double(ran(3)));
sample(index(i),end-9)=logical(str2double(ran(4)));
sample(index(i),end-8)=logical(str2double(ran(5)));
sample(index(i),end-7)=logical(str2double(ran(6)));
sample(index(i),end-6)=logical(str2double(ran(7)));
sample(index(i),end-5)=logical(str2double(ran(8)));
sample(index(i),end-4)=logical(str2double(ran(9)));
sample(index(i),end-3)=logical(str2double(ran(10)));
% ran=ceil(rand()*3)+4;
% ran=dec2bin(ran,3);
% sample(index(i),end-2)=logical(str2double(ran(1)));
% sample(index(i),end-1)=logical(str2double(ran(2)));
% sample(index(i),end)=logical(str2double(ran(3)));
end
index=find(aa(:,1)<6); %末档位不是减速的索引,修改为减速档
for i=1:length(index)
ran=ceil(rand()*3)+4;
ran=dec2bin(ran,3);
sample(index(i),end-2)=logical(str2double(ran(1)));
sample(index(i),end-1)=logical(str2double(ran(2)));
sample(index(i),end)=logical(str2double(ran(3)));
end
[S,aa,sample]=decode(sample);