“凡用兵之法:十则围之,五则攻之,倍则分之;敌则能战之,少则能逃之,不若则能避之。” ——《孙子兵法·谋攻篇》
从模拟效果可以看出增加数量、提升战斗力都是减小损失的可行方案
但是
一百个段子里那种富商绑在一起也怼不过马克吐温这类人
还有可能出现一百个互相怼起来的悲剧
双方数量一致、战斗力一致的情况
绿方数量多于红方、双方战斗力一致的情况
双方数量一致、绿方战斗力优于红方的情况
绿方数量多于红方、绿方战斗力优于红方的情况
修改双方数量、战斗力进行不同情况的模拟
b_num =100;
r_num =100;
b_power =30;
r_power =30;
alim = [100 200];
spacing = [10 10];
maxrectsize = [10 10];
step_size = 3;
step_rate = 0.1;
%%
dx = spacing(1); dy = spacing(2);
[x,y] = meshgrid(dx:dx:alim(1)-1,dy:dy:alim(2)-1);
x = x(:);
y = y(:);
wid = ones(size(x));
hei = ones(size(y));
b_wid=wid;
b_hei=hei;
for b_i=1:1:b_num
index=randi(size(x,1));
b_wid(index)=b_wid(index)+step_size;
b_hei(index)=b_hei(index)+step_size;
end
r_wid=wid;
r_hei=hei;
for r_i=1:1:r_num
index=randi(size(x,1));
r_wid(index)=r_wid(index)+step_size;
r_hei(index)=r_hei(index)+step_size;
end
b_cost = r_power*step_rate;
r_cost = b_power*step_rate;
color=[repmat([0,1,0],size(wid,1),1);repmat([1,0,0],size(wid,1),1)];
%%
while any(b_wid>1) && any(r_wid>1)
for b_i=1:1:b_cost
temp=b_wid;
[~,index_arr]=sort(temp,'descend');
temp(temp<=1)=[];
if isempty(temp)
temp=1;
end
index=index_arr(randi(size(temp,1)));
b_wid(index)=b_wid(index)-step_size;
b_hei(index)=b_hei(index)-step_size;
end
b_wid(b_wid<=0)=1;
b_hei(b_hei<=0)=1;
b_pos = [x-b_wid/2,y-b_hei/2,b_wid,b_hei];
for r_i=1:1:r_cost
temp=r_wid;
[~,index_arr]=sort(temp,'descend');
temp(temp<=1)=[];
if isempty(temp)
temp=1;
end
index=index_arr(randi(size(temp,1)));
r_wid(index)=r_wid(index)-step_size;
r_hei(index)=r_hei(index)-step_size;
end
r_wid(r_wid<=0)=1;
r_hei(r_hei<=0)=1;
r_pos = [x-r_wid/2+100,y-r_hei/2,r_wid,r_hei];
b_num=b_num-b_cost;
r_num=r_num-r_cost;
pause(0.5)
axes; set(gca,'XTick',[],'YTick',[],'Box','on','XLim',[0 alim(1)*2],'YLim',[0 alim(2)]);
axis equal;
rectangles([b_pos;r_pos],'FaceColor',color,'EdgeColor','none');
end
绘图rectangles函数借助
https://ww2.mathworks.cn/matlabcentral/fileexchange/59243-rectangles
相关文件下载
链接:https://pan.baidu.com/s/15FT-H3lJ_kEXHgrhJoOhVA
提取码:ydst