隨機貪心演算法簡介(搜出一個自己高中的時候寫的程式)

來源:互聯網
上載者:User

高三的時候準備資訊學奧賽,到處做編程題。。

 

當時自己為AC了這道題得意了好一陣子…… 是TOJ上的一道題目,

其解題思路涉及到 隨機貪心。。

 

什麼是隨機貪心?這裡用我自己的話給個簡單的介紹吧。

貪心演算法就是根據問題的本質,給出一個最優解導向,然後不斷的去迭代進而求出最優解。

而在很多時候,未必能準確的找到這個最優解導向(或者根本不存在,比如NP問題),但卻可以找到一個近似的導向演算法(近似貪心演算法)。那麼我們也可以在迭代若干次之後得到一個最優解的近似解。

假如我們打亂整個系統的初始狀態為其等效狀態,然後再進行上述迭代,又可以求到一個近似解。

如果我們能窮舉出所有的等效初始狀態,然後從所有的近似解裡取最優解,那麼就可以得到整個問題的最優解了。

而在實際情況中,可能無法枚舉所有情況(複雜度太高),那麼我們可以不斷的隨機去類比初始狀態,然後從該狀態求近似解。

然後我們多次隨機取其中的最佳值。這樣,我們隨機次數越高,結果就越準確。

我們把這種演算法叫做隨機貪心演算法。

 

發上來紀念一下,這段青澀的代碼,哈哈

記得當初我還寫了個小解題報告,存在 yeah.net的郵箱裡。。今天去看,居然因為我長期不登陸把我的刪掉了。。可惡

 

{$N+}<br />program tju1033;<br />const<br />limit=18;<br />var<br />Ham:array[0..limit+1] of integer;<br />n,i,u:integer;<br />min:double;<br />cost:array[1..limit,1..limit] of double;<br />x,y:array[1..limit] of double;</p><p>procedure init;<br />var<br />i,j:integer;<br />begin<br />readln(n);<br />for i:=1 to n do readln(x[i],y[i]);<br />for i:=1 to n do<br />for j:=1 to n do<br />cost[i,j]:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));<br />for i:=0 to n+1 do Ham[i]:=i;<br />end;</p><p>procedure Hamilton_Change;<br />var<br />finish:boolean;<br />i,j,k,tmp:integer;<br />begin<br />finish:=false;<br />Ham[0]:=Ham[1];<br />Ham[n+1]:=Ham[n];<br />while not finish do<br />begin<br />finish:=true;<br />for i:=1 to n do<br />for j:=i+1 to n do<br />if cost[ Ham[i-1],Ham[i] ]+cost[ Ham[j],Ham[j+1] ]<br />> cost[ Ham[i-1],Ham[j] ]+cost[ Ham[i],Ham[j+1] ] then<br />begin<br />for k:=0 to (j-i) div 2 do<br />begin<br />tmp:=Ham[i+k];<br />Ham[i+k]:=Ham[j-k];<br />Ham[j-k]:=tmp;<br />end;<br />finish:=false;<br />Ham[0]:=Ham[1];<br />Ham[n+1]:=Ham[n];<br />end;<br />end;<br />end;</p><p>procedure Count_Ans;<br />var<br />total:double;<br />i:integer;<br />begin<br />total:=0;<br />for i:=1 to n-1 do<br />total:=total+cost[ Ham[i],Ham[i+1] ];<br />if total<min then min:=total;<br />end;</p><p>procedure Random_adjust;<br />var<br />i,a,b,tmp:integer;<br />begin<br />for i:=1 to 1000 do<br />begin<br />a:=random(n+1);<br />b:=random(n+1);<br />if (a<>b) and (a<>0) and (b<>0) then<br />begin<br />tmp:=Ham[a];<br />Ham[a]:=Ham[b];<br />Ham[b]:=tmp;<br />end;<br />end;<br />end;</p><p>begin<br />randomize;<br />while not eof do<br />begin<br />init;<br />min:=maxint;<br />Hamilton_Change;<br />Count_Ans;<br />for i:=1 to 500 do<br />begin<br />Random_adjust;<br />Hamilton_Change;<br />Count_Ans;<br />end;<br />writeln(min:0:2);<br />end;<br />end.</p><p>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.