展會信息港展會大全

vrp幾種算法的matlab源代碼(掃描算法,禁忌搜索算法,節(jié)約里程
來源:互聯(lián)網(wǎng)   發(fā)布日期:2011-09-19 10:45:23   瀏覽:14971次  

導(dǎo)讀:vrp幾種算法的matlab源代碼(掃描算法,禁忌搜索算法,節(jié)約里程算法)...

vrp幾種算法的matlab源代碼(掃描算法,禁忌搜索算法,節(jié)約里程

  • wf219uc14 | 2009-10-15 10:44:20
  • 找不到翻譯,給你一個(gè)算法吧!
    該程序試圖對具有31個(gè)城市的VRP進(jìn)行求解,已知的最優(yōu)解為784.1,我用該程序只能優(yōu)化到810左右,應(yīng)該是陷入局部最優(yōu),但我不知問題出在什么地方。請用過蟻群算法的高手指教。
    蟻群算法的matlab源碼,同時(shí)請指出為何不能優(yōu)化到已知的最好解

    %
    %
    % the procedure of ant colony algorithm for VRP
    %
    % % % % % % % % % % %

    %initialize the parameters of ant colony algorithms
    load data.txt;
    d=data(:,2:3);
    g=data(:,4);

    m=31; % 螞蟻數(shù)
    alpha=1;
    belta=4;% 決定tao和miu重要性的參數(shù)
    lmda=0;
    rou=0.9; %衰減系數(shù)
    q0=0.95;
    % 概率
    tao0=1/(31*841.04);%初始信息素
    Q=1;% 螞蟻循環(huán)一周所釋放的信息素
    defined_phrm=15.0; % initial pheromone level value
    QV=100; % 車輛容量
    vehicle_best=round(sum(g)/QV)+1; %所完成任務(wù)所需的最少車數(shù)
    V=40;

    % 計(jì)算兩點(diǎn)的距離
    for i=1:32;
    for j=1:32;
    dist(i,j)=sqrt((d(i,1)-d(j,1))^2+(d(i,2)-d(j,2))^2);
    end;
    end;

    %給tao miu賦初值
    for i=1:32;
    for j=1:32;
    if i~=j;
    %s(i,j)=dist(i,1)+dist(1,j)-dist(i,j);
    tao(i,j)=defined_phrm;
    miu(i,j)=1/dist(i,j);
    end;
    end;
    end;

    for k=1:32;
    for k=1:32;
    deltao(i,j)=0;
    end;
    end;

    best_cost=10000;
    for n_gen=1:50;


    print_head(n_gen);

    for i=1:m;
    %best_solution=[];
    print_head2(i);
    sumload=0;
    cur_pos(i)=1;
    rn=randperm(32);
    n=1;
    nn=1;
    part_sol(nn)=1;
    %cost(n_gen,i)=0.0;
    n_sol=0; % 由螞蟻產(chǎn)生的路徑數(shù)量
    M_vehicle=500;
    t=0; %最佳路徑數(shù)組的元素?cái)?shù)為0

    while sumload<=QV;

    for k=1:length(rn);
    if sumload+g(rn(k))<=QV;
    gama(cur_pos(i),rn(k))=(sumload+g(rn(k)))/QV;
    A(n)=rn(k);
    n=n+1;
    end;
    end;

    fid=fopen('out_customer.txt','a+');
    fprintf(fid,'%s %i\t','the current position is:',cur_pos(i));
    fprintf(fid,'\n%s','the possible customer set is:')
    fprintf(fid,'\t%i\n',A);
    fprintf(fid,'------------------------------\n');
    fclose(fid);

    p=compute_prob(A,cur_pos(i),tao,miu,alpha,belta,gama,lmda,i);
    maxp=1e-8;
    na=length(A);
    for j=1:na;
    if p(j)>maxp
    maxp=p(j);
    index_max=j;
    end;
    end;

    old_pos=cur_pos(i);
    if rand(1)<q0
    cur_pos(i)=A(index_max);
    else
    krnd=randperm(na);
    cur_pos(i)=A(krnd(1));
    bbb=[old_pos cur_pos(i)];
    ccc=[1 1];
    if bbb==ccc;
    cur_pos(i)=A(krnd(2));
    end;
    end;

    tao(old_pos,cur_pos(i))=taolocalupdate(tao(old_pos,cur_pos(i)),rou,tao0);%對所經(jīng)弧進(jìn)行局部更新

    sumload=sumload+g(cur_pos(i));

    nn=nn+1;
    part_sol(nn)=cur_pos(i);
    temp_load=sumload;

    if cur_pos(i)~=1;
    rn=setdiff(rn,cur_pos(i));
    n=1;
    A=[];
    end;

    if cur_pos(i)==1; % 如果當(dāng)前點(diǎn)為車場,將當(dāng)前路徑中的已訪問用戶去掉后,開始產(chǎn)生新路徑
    if setdiff(part_sol,1)~=[];
    n_sol=n_sol+1; % 表示產(chǎn)生的路徑數(shù),n_sol=1,2,3,..5,6...,超過5條對其費(fèi)用加上車輛的派遣費(fèi)用
    fid=fopen('out_solution.txt','a+');
    fprintf(fid,'%s%i%s','NO.',n_sol,'條路徑是:');
    fprintf(fid,'%i ',part_sol);
    fprintf(fid,'\n');
    fprintf(fid,'%s','當(dāng)前的用戶需求量是:');
    fprintf(fid,'%i\n',temp_load);
    fprintf(fid,'------------------------------\n');
    fclose(fid);

    % 對所得路徑進(jìn)行路徑內(nèi)3-opt優(yōu)化
    final_sol=exchange(part_sol);

    for nt=1:length(final_sol); % 將所有產(chǎn)生的路徑傳給一個(gè)數(shù)組
    temp(t+nt)=final_sol(nt);
    end;
    t=t+length(final_sol)-1;

    sumload=0;
    final_sol=setdiff(final_sol,1);
    rn=setdiff(rn,final_sol);
    part_sol=[];
    final_sol=[];
    nn=1;
    part_sol(nn)=cur_pos(i);
    A=[];
    n=1;

    end;
    end;

    if setdiff(rn,1)==[];% 產(chǎn)生最后一條終點(diǎn)不為1的路徑
    n_sol=n_sol+1;
    nl=length(part_sol);
    part_sol(nl+1)=1;%將路徑的最后1位補(bǔ)1

    % 對所得路徑進(jìn)行路徑內(nèi)3-opt優(yōu)化
    final_sol=exchange(part_sol);

    for nt=1:length(final_sol); % 將所有產(chǎn)生的路徑傳給一個(gè)數(shù)組
    temp(t+nt)=final_sol(nt);
    end;

    cost(n_gen,i)=cost_sol(temp,dist)+M_vehicle*(n_sol-vehicle_best); %計(jì)算由螞蟻i產(chǎn)生的路徑總長度

    for ki=1:length(temp)-1;
    deltao(temp(ki),temp(ki+1))=deltao(temp(ki),temp(ki+1))+Q/cost(n_gen,i);
    end;

    if cost(n_gen,i)<best_cost;
    best_cost=cost(n_gen,i);
    old_cost=best_cost;
    best_gen=n_gen; % 產(chǎn)生最小費(fèi)用的代數(shù)
    best_ant=i; %產(chǎn)生最小費(fèi)用的螞蟻
    best_solution=temp;
    end;

    if i==m; %如果所有螞蟻均完成一次循環(huán),,則用最佳費(fèi)用所對應(yīng)的路徑對弧進(jìn)行整體更新
    for ii=1:32;
    for jj=1:32;
    tao(ii,jj)=(1-rou)*tao(ii,jj);
    end;
    end;

    for kk=1:length(best_solution)-1;
    tao(best_solution(kk),best_solution(kk+1))=tao(best_solution(kk),best_solution(kk+1))+deltao(best_solution(kk),best_solution(kk+1));
    end;
    end;

    fid=fopen('out_solution.txt','a+');
    fprintf(fid,'%s%i%s','NO.',n_sol,'路徑是:');
    fprintf(fid,'%i ',part_sol);
    fprintf(fid,'\n');
    fprintf(fid,'%s %i\n','當(dāng)前的用戶需求量是:',temp_load);
    fprintf(fid,'%s %f\n','總費(fèi)用是:',cost(n_gen,i));
    fprintf(fid,'------------------------------\n');
    fprintf(fid,'%s\n','最終路徑是:');
    fprintf(fid,'%i-',temp);
    fprintf(fid,'\n');
    fclose(fid);
    temp=[];
    break;
    end;
    end;

    end;
    end;
    我現(xiàn)在也在研究它,希望能共同進(jìn)步.建義可以看一下段海濱的關(guān)于蟻群算法的書.講的不錯(cuò),李士勇的也可以,還有一本我在圖書館見過,記不得名字了.
  • 贊助本站

    相關(guān)熱詞: keywords String

    相關(guān)內(nèi)容
    AiLab云推薦
    展開

    熱門欄目HotCates

    Copyright © 2010-2024 AiLab Team. 人工智能實(shí)驗(yàn)室 版權(quán)所有    關(guān)于我們 | 聯(lián)系我們 | 廣告服務(wù) | 公司動態(tài) | 免責(zé)聲明 | 隱私條款 | 工作機(jī)會 | 展會港