作者JACK19920102 ()
看板MATLAB
标题[讨论] for回圈中有点复杂的巢状结构...(送P币)
时间Wed Nov 9 22:27:29 2016
程式目的叙述如下
目前有20个变数 是20个不同的机台要排序
每种排序 会用适应函数算出一个数值(OFV) 越小越好
现在要做区域搜寻
位置1跟位置2的机台交换位子 看看OFV有没有比较小
如果没有 换回来 往下轮到位置2跟3交换 看看OFV有没有比较小
如果为置1跟2的机台交换後 OFV值比较小
则保留交换 从头开始再做一次
1跟2交换 看有没有OFV比较小
有比较小就保留交换 从头开始做
没有比较小就换回来 换下面两个位置交换
--
目前用for 回圈写
假设发现机台交换位置後有比较小
则要保留交换 然後从头开始再做交换
我目前用方法是在回圈里面 去改最外面回圈的计数值
是可以正常跑 但我不太确定这样的方法是不是符合逻辑
想请板上大大帮忙看一下有没有错
或是有更好的写法 可以提供
(本来想用goto之类的函数 但matlab好像没有)
--
XTEMP(sol,:)=factoradic_to_per(X,sol,Nvar);
%把变数转成排序
for var=1:Nvar-1
temp = XTEMP(sol,var);
%用temp来暂存值 作两两交换
XTEMP(sol,var)=XTEMP(sol,var+1);
XTEMP(sol,var+1)=temp;
tempOFV2 = fitness_TEMP(XTEMP,sol);
%用函数计OFV值
if tempOFV2 < pF(1,sol)
%pF是目前这个排序的OFV值
mm=permutation_to_dec(XTEMP,sol,Nvar);
X(sol,:)=dec_to_factoradic(mm,Nvar);
%这两行把交换过後的排序 存起来
if tempOFV2 < pF(1,sol)
pF(sol) = tempOFV2;
if pF(sol) < pF(gBest)
gBest=sol;
genBest=gen;
end
end
var=1;
%从回圈内改写回圈的计数器
else
XTEMP(sol,var+1) = XTEMP(sol,var);
XTEMP(sol,var) = temp;
%如果没比较好就换回来
end
end
感谢大家帮忙 前十个留言的ID各送200P
以表感谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.114.54.67
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MATLAB/M.1478701652.A.2AE.html
1F:推 sunev: matlab的for-loop没办法「从回圈内改写回圈的计数器」 11/10 07:11
2F:推 YoursEver: 推楼上,这很重要,上次也靠实验确认过了. 11/10 10:24
3F:→ JACK19920102: 那用while回圈会比较好吗? 11/10 13:09
4F:→ JACK19920102: 可以从while里面去改写while的条件吗? 11/10 14:55
5F:→ JACK19920102: might be used incompatibly or redefined 11/10 14:56
6F:→ JACK19920102: 我用while 出现这样 11/10 14:56
7F:→ JACK19920102: 发钱结束 晚点发钱给前两楼大大 11/16 21:20
8F:→ JACK19920102: 钱已发毕 11/21 11:18