※ 引述《JACK19920102 ()》之銘言:
: 程式目的敘述如下
: 目前有20個變數 是20個不同的機台要排序
: 每種排序 會用適應函數算出一個數值(OFV) 越小越好
: 現在要做區域搜尋
: 位置1跟位置2的機台交換位子 看看OFV有沒有比較小
: 如果沒有 換回來 往下輪到位置2跟3交換 看看OFV有沒有比較小
: 如果為置1跟2的機台交換後 OFV值比較小
: 則保留交換 從頭開始再做一次
: 1跟2交換 看有沒有OFV比較小
: 有比較小就保留交換 從頭開始做
: 沒有比較小就換回來 換下面兩個位置交換
外圍上一個while,如果全部跑過一遍都沒有比較好的就停止這個while
如果有換,就跳出迴圈,從頭來過
XTEMP(sol,:)=factoradic_to_per(X,sol,Nvar); %把變數轉成排序
conUpdate = true;
while conUpdate
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
break
else
XTEMP(sol,var+1) = XTEMP(sol,var);
XTEMP(sol,var) = temp; %如果沒比較好就換回來
end
if var == Nvar-1
conUpdate = false;
end
end
end