回溯 matlab,for循环中m次循环内如根据条件如何回溯m-1次循环,continue.....

function [ vio_greedy,ty_greedy,vio_Cp1] = ini16_greedy( ty_ini )

global A_read car_num B type_num

ty_greedy=zeros(size(A_read,1),car_num);

static_ratios=zeros(5,1);

% [static_ratios]=arrayfun(@(x)dot(A_read(:,2),A_read(:,x))/(min(mod(car_num,B(x-2,2)),B(x-2,1))+B(x-2,1)*floor(car_num/B(x-2,2))),3:size(A_read,2))

[static_ratios]=arrayfun(@(x)dot(A_read(:,2),A_read(:,x))/(B(x-2,1)*car_num/B(x-2,2)),3:size(A_read,2))

%% 第一辆车选择方法

ty_greedy(:,1)=A_read(:,1);

b=repmat(A_read(:,2)',type_num,1);

b(1:type_num+1:end) = b(1:type_num+1:end)-1;

%% 其它各辆车选择1

for i=1:type_num

Cp2=zeros(size(B,1),1);

for j=2:car_num

[~,idx]=find(b(i,:)>0);

[ vio_add_cell,Cp2_cell ] = arrayfun(@(x)vio_add_cons( nonzeros(ty_greedy(i,:))',idx(x),Cp2 ),1:size(idx,2),'uni',0);    % 计算违约数最少时可选车型

vio_add = cell2mat(vio_add_cell);

[~,r] = find(vio_add == min(vio_add));               %  r是指不违反比率约束的下标

if numel(r)>1

[avail_unused_filter]=arrayfun(@(x)avail_unused_filter_cons(nonzeros(ty_greedy(i,:))',idx(r(x)),b(i,:)),1:size(r,2));      %选任一个保证后面存在不违约的可能性

[~,r1]=find(avail_unused_filter==1);

if numel(r1)>1

[avail_after_filter]=arrayfun(@(x)avail_after_filter_cons(nonzeros(ty_greedy(i,:))',idx(r(r1(x))),b(i,:)),1:size(r1,2));

[~,r2]=find(avail_after_filter==1);

if numel(r2)>1

[ratios_add]=arrayfun(@(x)ratios_add_cons(idx(r(r1(r2(x)))),static_ratios),1:size(r2,2));

[~,r3]=find(ratios_add == max(ratios_add));

if numel(r3)>1

[ratios_remains]=arrayfun(@(x)ratios_remains_cons(idx(r(r1(r2(r3(x))))),b(i,:)),1:size(r3,2));

[~,r4]=find(ratios_remains == min(ratios_remains));

if numel(r4)>1

[ ratios_complex ] = arrayfun(@(x)ratios_complex_cons((nonzeros(ty_greedy(i,:)))',idx(r(r1(r2(r3(r4(x)))))),static_ratios,b(i,:)),1:size(r4,2));

[~,r5]=find(ratios_complex==max(ratios_complex),1);

idx_b=idx(r(r1(r2(r3(r4(r5))))));

else

idx_b=idx(r(r1(r2(r3(r4)))));

end

else

idx_b=idx(r(r1(r2(r3))));

end

elseif numel(r2)==1

idx_b=idx(r(r1(r2)));

else

[ ratios_complex ] = arrayfun(@(x)ratios_complex_cons((nonzeros(ty_greedy(i,:)))',idx(r(r1(x))),static_ratios,b(i,:)),1:size(r1,2));

[~,r1_1]=find(ratios_complex==max(ratios_complex),1);

idx_b=idx(r(r1(r1_1)));

end

elseif numel(r1)==1

idx_b=idx(r(r1));

else

[ ratios_complex ] = arrayfun(@(x)ratios_complex_cons((nonzeros(ty_greedy(i,:)))',idx(r(x)),static_ratios,b(i,:)),1:size(r,2));

[~,r_1]=find(ratios_complex==max(ratios_complex));

if numel(r_1)>1

factor=[2 1.5 3 2.5 5];

[sum_power]=arrayfun(@(x)dot(factor,A_read(idx(r(r_1(x))),3:end)),1:size(r_1,2));

[~,r_2]=find(sum_power==max(sum_power),1);

idx_b=idx(r(r_1(r_2)));

else

idx_b=idx(r(r_1));

end

end

else

idx_b=idx(r);

end

ty_greedy(i,j)=idx_b;

b(i,idx_b)=b(i,idx_b)-1;

[~,Cp2]=vio1_m(ty_greedy(i,1:j),Cp2);

end

[vio_greedy(i),~,~,vio_Cp1(i)]=vio_m(A_read(ty_greedy(i,:),3:end)',B)

[vio_stand(i)]=vio_add_standard(ty_greedy(i,:))

end

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值