線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:945
推到 Plurk!
推到 Facebook!

請問...寫一個最佳化的問題.(使用do..while迴圈)..要怎摸將過程show出來!!

尚未結案
Kioarena
一般會員


發表:3
回覆:12
積分:3
註冊:2005-03-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-02 16:38:29 IP:61.228.xxx.xxx 未訂閱
我寫的是PSO(粒子群最佳化),是使用do..while迴圈。 假設停止的條件是步驟到達一定的要求,那要如何show出一段間隔(例如100個步驟)之內數值變化的情形,是否是使用Timer元件?是的話該如何使用呢? 謝謝!!
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-02 16:58:43 IP:61.66.xxx.xxx 未訂閱
你如果可以用步驟的話,給你一個簡單的方式 例如每隔100個while迴圈做一次顯示    
BYTE Cnt = 0;    do
{
    ....//你要做的事
    Cnt  ;
    if ( Cnt == 100 )
    {
        Cnt = 0;//歸零
        ....//看你要如何顯示
    }
}while(1); 
Kioarena
一般會員


發表:3
回覆:12
積分:3
註冊:2005-03-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-02 21:07:04 IP:61.228.xxx.xxx 未訂閱
那在請問一下,為啥摸我將Timer元件開啟之後, 整個程式就跑不停。我顯現的東西就一直沒停過, 也沒有辦法在我設定的規則下停止, 是我還需要加上啥摸東西,還是我的code有寫錯呢? 謝謝!!
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-03 08:49:45 IP:61.66.xxx.xxx 未訂閱
引言: 那在請問一下,為啥摸我將Timer元件開啟之後, 整個程式就跑不停。我顯現的東西就一直沒停過, 也沒有辦法在我設定的規則下停止, 是我還需要加上啥摸東西,還是我的code有寫錯呢? 謝謝!!
顯示的東西一直沒停過??我不是很了解你的意思 不過你在while迴圈中作一些事,Timer裡頭發生的是可能沒有傳入 建議你在迴圈中加入Application->ProcessMessages() 這一行能讓你接受其他元件的訊息,你在Timer所做的事就會有影響了 如果還不行,再把你有問題的CODE傳上來吧
Kioarena
一般會員


發表:3
回覆:12
積分:3
註冊:2005-03-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-03 12:04:35 IP:61.228.xxx.xxx 未訂閱
   gbest=0;
   iter=0 ;
   firsttime=1;
   finish=0;
BYTE Cnt = 0;
    do
    {
     iter  ;
    //----------calculate fitness value---------//
      for(int a=0;aItemIndex)
        {
        case 0:
             minval=sphere(a,Dimension);
             break;
        case 1:
             minval=rosenbrock(a,Dimension);
             break;
         }
      if (firsttime==1)
       pbest[a]=minval;
 //-----找尋每一個粒子過程中最佳的位置-----//
       if(minvalMaxV)
        v[a][b]=MaxV;
       else if(v[a][b]<-MaxV)
        v[a][b]=-MaxV;
      }
      for(int b=0;bMaxP)
        p[a][b]=MaxP;
       else if(p[a][b]<-MaxP)
        p[a][b]=-MaxP;
      }
     }
    Application->ProcessMessages();
     Cnt  ;
     if ( Cnt == 100 )
     {
        Cnt = 0;//歸零
        Edit13->Text=IntToStr(iter);
        Edit10->Text=FloatToStr(pbestp[gbest][0]);
        Edit11->Text=FloatToStr(pbestp[gbest][1]);
        Edit12->Text=FloatToStr(minval);
     }
     if((minval<=MinError)||(iter>=MaxIter)||(Timer1>Enabled==false))
        finish=1;
     firsttime=0;
    }
     while(finish!=1);
我發現還是無法每隔100個iter就停止顯現一次, 感覺都是將整個程式跑完又再繼續run。 不曉得哪邊出現錯誤,麻煩大大指教一下。 非常感謝!!
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-03 13:18:30 IP:61.66.xxx.xxx 未訂閱
 
        Application->ProcessMessages();
        Cnt  ;
        if ( Cnt == 100 )
        {
            Cnt = 0;//歸零
            Edit13->Text=IntToStr(iter);
            Edit10->Text=FloatToStr(pbestp[gbest][0]);
            Edit11->Text=FloatToStr(pbestp[gbest][1]);
            Edit12->Text=FloatToStr(minval);
        }
改成
 
        Cnt  ;
        if ( Cnt == 100 )
        {
            Cnt = 0;//歸零
            Edit13->Text=IntToStr(iter);
            Edit10->Text=FloatToStr(pbestp[gbest][0]);
            Edit11->Text=FloatToStr(pbestp[gbest][1]);
            Edit12->Text=FloatToStr(minval);
            Application->ProcessMessages();//接收改變VCL
        }
以上的方式,你試一下吧 另外,要先用中斷點確認有進入if ( Cnt == 100 )的判斷式中喔
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-03 13:22:48 IP:61.66.xxx.xxx 未訂閱
引言: 我發現還是無法每隔100個iter就停止顯現一次, 感覺都是將整個程式跑完又再繼續run。
我寫的方式是每100次顯示一次,如果你是要停止,就改一下條件 至於感覺都是將整個程式跑完又再繼續run不是很了解你的需求
Kioarena
一般會員


發表:3
回覆:12
積分:3
註冊:2005-03-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-03 14:01:27 IP:61.228.xxx.xxx 未訂閱
我試過之後發現, 程式都是100的倍數會顯現出來, 不過不是照著100->200->300...的順序, 而是亂跳,可能一開始就顯現900->200->1100->100...之類的順序, 最終也沒停下來,一直run下去。 不知道是否存在啥摸問題? 感謝大大的指教!!
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-03-03 14:44:16 IP:61.66.xxx.xxx 未訂閱
引言: 我試過之後發現, 程式都是100的倍數會顯現出來,因為Cnt == 100才顯現 不過不是照著100->200->300...的順序, 而是亂跳,可能一開始就顯現900->200->1100->100...之類的順序, 最終也沒停下來,一直run下去。因為你的值亂跳 不知道是否存在啥摸問題? 感謝大大的指教!!
我想,你這個問題要用中斷點慢慢trace(手動) 或是用
 
建立一個Edit15(自動)
Edit15->Text=IntToStr(iter);
Application->ProcessMessages();
Sleep(100);
每做完一個迴圈,顯示iter的值,並停留0.1秒
看你的iter在每一次回圈時的變化 理論上,你的iter應該要每次加1才對,如果不是的話 那就是你在別的地方干擾到了(你把iter設成全域變數,並被改變了)
Kioarena
一般會員


發表:3
回覆:12
積分:3
註冊:2005-03-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-03-03 16:45:29 IP:61.228.xxx.xxx 未訂閱
我用此方法是了一下我的iter, 我發現一個很奇妙的問題, 起初iter怎摸跑都只會跑到9 or 10就從1又開始重新跑, 但是我突然下達Timer1->Enabled=false; iter就會很順的一路跑,跑到我設定的規則下停止, 然後一切的顯示也都很順利, 實在是令我百思不解, 不曉得大大可否幫我解答一下。 感謝!!
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-03-04 08:29:48 IP:61.66.xxx.xxx 未訂閱
那就是你的Timer做了什麼事了 如果你看不出來,就把Timer1的事件Post上來吧
Kioarena
一般會員


發表:3
回覆:12
積分:3
註冊:2005-03-02

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-03-04 13:40:16 IP:140.124.xxx.xxx 未訂閱
 
 int iter,gbest,firsttime,finish;
  int a;
  double minval;
    gbest=0;
    iter=0 ;
    firsttime=1;
   finish=0;
 BYTE Cnt = 0;
     do
    {
     iter  ;
     Edit14->Text=IntToStr(iter);
     Application->ProcessMessages();
     Sleep(100);
    //----------calculate fitness value---------//
      for(int a=0;aItemIndex)
        {
        case 0:
             minval=sphere(a,Dimension);
             break;
        case 1:
             minval=rosenbrock(a,Dimension);
             break;
         }
     if (firsttime==1)
       pbest[a]=result;
   //-----找尋每一個粒子過程中最佳的位置-----//
       if(minvalMaxV)
        v[a][b]=MaxV;
       else if(v[a][b]<-MaxV)
        v[a][b]=-MaxV;
      }
      for(int b=0;bMaxP)
        p[a][b]=MaxP;
       else if(p[a][b]<-MaxP)
        p[a][b]=-MaxP;
      }
     }
     Cnt  ;
        if ( Cnt == 100 )
        {
            Cnt = 0;//歸零
            Edit13->Text=IntToStr(iter);
            Edit10->Text=FloatToStr(pbestp[gbest][0]);
            Edit11->Text=FloatToStr(pbestp[gbest][1]);
            Edit12->Text=FloatToStr(minval);
            Application->ProcessMessages();//接收改變VCL
            Sleep(100);
        }
     if((minval<=MinError)||(iter>=MaxIter))
      {
       finish=1;
       Edit13->Text=IntToStr(iter);
       Edit10->Text=FloatToStr(pbestp[gbest][0]);
       Edit11->Text=FloatToStr(pbestp[gbest][1]);
       Edit12->Text=FloatToStr(minval);
       Application->ProcessMessages();//接收改變VCL
       }
     firsttime=0;
    }
     while(finish!=1);
這就是我寫在Timer裡面的code.. 按照這個code去run,就會出現iter只會跑到9 or 10就從頭開始從跑。 如果加上Timer1->Enabled=false;就很順的會一直跑下去。
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-03-04 16:50:39 IP:61.66.xxx.xxx 未訂閱
那就對了,你不應該把段程式碼寫在Timer中 或是說一進入Timer就要Timer->Enabled = false 做完之後再Timer->Enabled = true    原因是Timer會一直被執行 當你做到iter =9 or 10時 又引發一次事件 iter又會從0開始做了    你可以做一個小實驗如下
 
int i = 0;
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    i = 0;;//試試看第一次加這行,第二次不要加有什麼不同
    do
    {
        Edit1->Text = i  ;
        Application->ProcessMessages();
        Sleep(200);
    }while(i<1000);
}
Kioarena
一般會員


發表:3
回覆:12
積分:3
註冊:2005-03-02

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-03-05 00:53:08 IP:61.228.xxx.xxx 未訂閱
大大實在不好意思!! 可不可以再稍微講清楚一點。 我試過了你的例子, 不過我倒是還不太清楚怎摸修改我的。 麻煩再給我一些提示! 感謝感謝~~~
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-03-06 00:29:21 IP:61.31.xxx.xxx 未訂閱
我其實不是非常明白你想怎麼做 就我猜的狀況跟你說吧    1.在進入Timer的事件時先加入   Timer->Enabled = false;=>避免發生iter又被設為零 2.加入你原本的程式碼 3.事情都做完了,要離開Timer事件了,再把   Timer->Enabled = true; =>迎接下一次又發生的事件    這樣就會跟你做 如果加上Timer1->Enabled=false;就很順的會一直跑下去。 一樣的意思
Kioarena
一般會員


發表:3
回覆:12
積分:3
註冊:2005-03-02

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-03-06 12:57:00 IP:61.228.xxx.xxx 未訂閱
相當感謝大大的熱情幫忙。 我已經得到滿意的答覆了。 謝謝!!
系統時間:2024-05-11 13:20:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!