1. 旅行家演算法代碼 ABCDE 5個點的
我這有遞歸版的,有興趣的話自己改下吧。城市多了遞歸的效率低
Class Cities
{
privateint[][]cities;//各城市表示為(X,Y)X,Y為0到99之間的值
privateint[]shortestPath;//保存最短路程對應的經歷順序
privateintnum;//保存N(城市個數)
privatelongshortestLength=100000000;//N個城市遍歷時可能最大路程
privatelonggetLength(int[]tPath){...}//計算以tPath為經歷順序的路程
publicCities(intn)//構造n個城市的坐標,假設為0到99之間的隨機數
{
...
}
publicint[]getShortestPath()//獲得最短路徑
{
int[]tempPath=newint[num];
shortestPath=newint[num];
int[]citiesToured=newint[num];//保存第I個城市是否已經經歷
intcitiesNum=0;//已經經歷城市的個數
for(inti=0;i<num;i++)
citiesToured[i]=0;
goThrough(tempPath,citiesNum,citiesToured);//遍歷各城市
for(inti=0;i<num;i++)
tempPath[i]=shortestPath[i];//得到遍歷順序
returntempPath;//返回結果
}
privatevoidgoThrough(int[]tPath,intcNum,int[]cToured)//遍歷N個城市
{
if(cNum==0)//無經歷城市時,選擇第1個城市
{
cNum++;
tPath[0]=0;
cToured[0]=1;
goThrough(tPath,cNum,cToured);
}
elseif(cNum==num)//各個城市已經經歷,結束
{
longtempLength=getLength(tPath);//計算此經歷順序所走的路程
if(tempLength<shortestLength)//比較路程
{
shortestLength=tempLength;//更新最短路程及其經歷順序
for(inti=0;i<num;i++)
shortestPath[i]=tPath[i];
}
}
else
{
for(inti=0;i<num;i++)
if(cToured[i]!=1)//選擇未經歷的城市
{
cToured[i]=1;//加入已經歷城市
tPath[cNum]=i;
cNum++;//已經歷城市個數+1
goThrough(tPath,cNum,cToured);//調用下一層
cToured[i]=0;//恢復本層的狀態:
cNum--;//已經歷城市及個數
}//Endifinfor(i)
}//Endelse
}
privatelonggetLength(int[]tPath)//以指定順序計算遍歷路程
{
longlength=0;//路程
intnowPoint=0;//當前城市,第一次取0
for(inti=1;i<num;i++)
{
intj=tPath[i];
length+=(long)Math.sqrt((cities[j][0]-cities[nowPoint][0])*(cities[j][0]-cities[nowPoint][0])+(cities[j][1]-cities[nowPoint][1])*(cities[j][1]-cities[nowPoint][1]));//加上當前、下一城市間的距離
nowPoint=j;//更新當前城市
}
length+=(long)Math.sqrt((cities[0][0]-cities[nowPoint][0])*(cities[0][0]-cities[nowPoint][0])+(cities[0][1]-cities[nowPoint][1])*(cities[0][1]-cities[nowPoint][1]));//加上首尾城市間的距離
return length;
}
}//Cities類定義結束
2. 生命密碼分析三角形外面的怎麼算
生命密碼作為一種娛樂性質的性格預測,可以在閑暇時玩一玩放鬆身心,而生命密碼分析三角形的演算法如下:
1、確定陽歷出生日,因為生命密碼學說來源於西方,而西方只有陽歷沒有陰歷。你的生日包含了你出生時的空間,那一刻,各大行星的運轉與你之間存在特殊的磁場。
2、確定陽歷生日後,將年月日的每位數字相加,得到的總數如果大於9,則再將數字相加,得出最後一個各位數字(生命密碼只有1-9),這個數字就是你的生命密碼主性格數啦
(2)旅行家演算法擴展閱讀:
生命密碼各個數字的含義(僅供娛樂)
1、天生的領導人,有本事,喜標新立異,滿腦子新點子,總在發掘新事務,比較主觀及沖動價值觀,是非分明。
2、天生具有敏銳分析及觀察的能力,愛批評、擅指正,具男女雙重性格,情感豐富,為人溫和親切,天生依賴。
3、聰明、天賦異稟的藝術家,充滿理想,立於不敗之地。溝通、學習力強,太理想化,不夠實際。
4、擅長看穿事情真相,有條理,給人安全感,擅於組織與生產,務實,穩定,可靠,天生缺乏安全感,過於頑固,不喜歡改變。
5、擁有演說與促銷的天分,崇尚自由及品味,喜歡新奇。
6、樂於付出及承擔,具有豐富的愛心,勇於分擔他人困難,敢於面對自己的困難,凡事應量力而為。
7、直覺敏銳,精於研究、調查,尋找事實的真相,能力強。除非百分百的肯定,否則對答案難滿意。追求至高無上的真理及精神,多疑,較懶惰。
8、天生領導人,善於開發,資質聰明,獨具慧眼,具建設力,相信白手起家,善用投機天分坐擁權力。
9、想像與人道(天使、服務人群)。擅長服務、娛樂,照顧及幫助他人,擁有常人無法想像的能量,與宗教有緣分。
3. C++演算法,動態規劃法實現TSP問題
c++listmatrixiteratoriostream演算法
[cpp] view plainprint?
#include
#include
using namespace std ;
typedef list<</SPAN>int> LISTINT;
LISTINT listAnother;
LISTINT list_result;
int d[4][4]={{-1,3,6,7},{2,-1,8,6},{7,3,-1,5,},{7,3,7,-1}}; //路徑權值
int matrix_length=4;
int getPath(int n,LISTINT list_org)
{
LISTINT::iterator i;
int minValue;
if(n==1)
{
i=list_org.begin();
minValue= d[*i-1][0];
if(list_org.size()==matrix_length-1)
{
list_result=list_org;
}
}
else
{
int temp;
i=list_org.begin();
temp=*i;
list_org.erase(i);
i=list_org.begin();
minValue=d[temp-1][*(i)-1]+getPath(n-1,list_org);
if(list_org.size()==matrix_length-1)
{
list_result=list_org;
}
for(int j=2;j
{
i=list_org.begin();
for(int k=1;k
{
i++;
}
int tempvalue=*i;
list_org.erase(i);
list_org.push_front(tempvalue);
i=list_org.begin();
tempvalue=d[temp-1][*(i)-1]+getPath(n-1,list_org);
if(tempvalue
{
if(list_org.size()==matrix_length-1)
{
list_result=list_org;
}
minValue=tempvalue;
}
}
}
return minValue;
}
int main(int argc, char* argv[])
{
LISTINT list_org;
LISTINT::iterator h;
list_org.push_front(4);
list_org.push_front(3);
list_org.push_front(2);
list_org.push_front(1);
cout<<"旅行商問題動態規劃演算法"<<endl;
cout<<"路線長度的矩陣表示如下 (-1表示無限大)"<<endl;
for(int j=0;j
cout<<endl;
for(int k=0;k
cout<<" "<<d[j][k];
}
}
cout<<endl;
cout<<"計算結果:"<<getPath(4,list_org)<<endl;
list_result.push_front(1);
list_result.push_back(1);
cout<<"要走的路徑:---->:";
for (h = list_result.begin(); h != list_result.end(); ++h)
cout << *h << " ";
cout << endl;
int i;
cin>>i;
return 0;
}
4. 旅行者一號的速度多少是34萬公里每秒嗎
^解一下唄
將地球繞太陽近似為勻速圓周運動,有
GMm/r^2=F=mv^2/r
其中r為日地距離,八版分鍾光程,約權1.5×10的11次方m/s
M為太陽質量,即2×10的30次方kg
G為引力常量,約6×10的負11次方(單位我就不寫了)
計算得,地球速度v約30千米每秒,選C
(還有另一種簡單演算法)
繞日周期為一年,摺合為秒很容易
即T易得,而vT=2πr,也可解得答案為C,很簡單
5. 數字的來歷
數字的起源有兩種說法:
1、數字起源於我國,史書上說中天皇君兄弟十三人,號曰天靈,其中一人發明了數字,繼而又發明了天干、地支。發明數字:零、一、二、三、四、五、六、七、八、九、十、廿、卅、卌、百、千、萬。
2、亦有另一種說法,數字是發源於古印度,並不是阿拉伯人發明創造的。數字後來被阿拉伯人用於經商而掌握,經改進,並傳到了西方。
(5)旅行家演算法擴展閱讀:
1、阿拉伯數字傳入歐洲
十個數字元號後來由阿拉伯人傳入歐洲,被歐洲人誤稱為阿拉伯數字。由於採用計數的十進位法,加上阿拉伯數字本身筆畫簡單,寫起來方便,看起來清楚,特別是用來筆算時,演算很便利。因此隨著歷史的發展,阿拉伯數字逐漸在各國流行起來,成為世界各國通用的數字。
2、阿拉伯數字傳入中國
阿拉伯數字傳入我國,大約是13到14世紀。由於我國古代有一種數字叫「算籌」,寫起來比較方便,所以阿拉伯數字當時在我國沒有得到及時的推廣運用。
20世紀初,隨著我國對外國數學成就的吸收和引進,阿拉伯數字在我國才開始慢慢使用,阿拉伯數字在我國推廣使用才有100多年的歷史。阿拉伯數字已成為人們學習、生活和交往中最常用的數字了。
6. matlab蟻群演算法旅行者問題中,螞蟻數目多了,搜索的隨機性為什麼會減少
明明寫的是螞蟻數量增加,隨機性變強了啊,你怎麼說是減少了呢。
7. 現在技術能計算出旅行者號的准確位置嗎
發個信號個旅行者號再等旅行者號傳回信號,把這之間所花的時間除以2再乘以光速就差不多了,旅行者號的軌道是經過精密計算的,不然就不可能超太陽系外的銀河中心前進了,用距離再綜合一下大概位置是能出來的,雖然不可能很准確的,畢竟它的速度已經到達了第三宇宙速度。
8. 關於演算法分析與設計的題目,請各位高高手幫幫忙.小女子感激不盡
數據結構沒學好吧。
9. 旅行家的預算
看到題目後,很容易想到遞推,但是又不知道具體怎樣做。我們可以先分析一下題目,用手工算
幾個數據,看能不能受到啟發(注意:這是一個很重要的思路!!)
例如可以先分析樣例數據(這是理解題意思必須的,因為樣例不會錯)
算了一下嗎?好了,我問你,如果你是司機,你會怎麼辦呢?
盡量買便宜的,貴的就買「剛剛可以到下一站」?對不對呢?
舉出反例很容易,但是我們不能輕易放棄這個思路,可以接著想下去。
不能保證全局最優,我們就試著改進我們的方法。
事實上,要用的油是確定的(D1/D2),價錢最便宜的油的站Q的油顯然應該多買,至少:
到達Q這個油站時汽車剩油不為0的方案一定不是最優的。
這是因為,如果剩下P升油,顯然不如當初少買P升,改在Q這里買P升劃算!(Q最便宜嘛!)
哈哈,有一點思路了吧!就是把較優解改進為最優解啦!
演算法如下:
每次都假裝裝滿油,用的時候先用便宜的,因為把貴的留在後面「反悔」(被替換成更便宜的油)不是更爽嗎?!
這樣計算費用時只考慮真正使用的,假裝裝滿時就不要再算一次了。你看看程序中是不是只有兩處修改了cost?
我很懶,因此就默認油站是按離起點由近及遠給出的。
輸入後面是先把油費由貴到便宜排序,第i貴的站是place[i],以便選擇。
下面的程序中主要部分是那個循環,它做了以下事情:
1)假裝裝滿油:gas[i]:=c-nowp; nowp是現在有的油,gas[i]是車上第i站的油的體積。
2)替換:現有的油如果有比當前站(第i站)貴的,改為i號油:gas[i]:=gas[i]+gas[j]; gas[j]:=0;
3)行駛:依次選擇最便宜的油行駛路程distance,就是個循環for j:=n downto 0
經過這樣分析,程序是不難寫出了,程序長一點,是為了寫得更易懂。
基礎較好的同學也可以用優先隊列(例如用堆來實現)來進行替換和使用油,這里只用了最簡單的方法模擬,
效率並不高。
program FenQuPrepare_Day4_Task3_FQ99P3;
type
real=extended;
const
fn_in='input.txt';
maxn=100;
var
ans,c,d1,d2:real;
can:boolean;
n:Integer;
d:array[0..maxn] of real;
p:array[0..maxn] of real;
procere init;
var s:string;
i:Integer;
begin
assign(input,fn_in);
reset(input);
readln(d1,c,d2,p[0],n);
for i:=1 to n do readln(d[i],p[i]);
end;
procere main;
var cur,i,j:Integer;
rest,min:real;
begin
can:=true;
for i:=1 to n do
if (d[i]-d[i-1])>c*d2 then can:=false;
if d1-d[n]>c*d2 then can:=false;
if not can then exit;
rest:=0;
ans:=0;
for cur:=0 to n do
begin
min:=1e10;
i:=cur;
while (i<=n) and ((d[i]-d[cur])<=c*d2) do
begin
if p[i]<min then
begin
min:=p[i];
j:=i;
end;
inc(i);
end;
if j=cur then
begin
if c*d2>(d1-d[cur]) then
begin
if rest*d2<d1-d[cur] then
begin
ans:=ans+p[cur]*((d1-d[cur])/d2-rest);
rest:=(d1-d[cur])/d2;
end;
end else
begin
ans:=ans+p[cur]*(c-rest);
rest:=c;
end
end else
begin
if rest*d2<d[j]-d[cur] then
begin
ans:=ans+p[cur]*((d[j]-d[cur])/d2-rest);
rest:=(d[j]-d[cur])/d2;
end;
end;
rest:=rest-(d[cur+1]-d[cur])/d2;
end;
end;
procere out;
begin
if can then
begin
ans:=round(ans*100)/100;
writeln(ans:0:2);
end else writeln('No solution');
end;
begin
init;
main;
out;
end.
10. NOIP1999 提高組 旅行家的預算 dp最後一個測試點老是過不了
抱歉,你用的動態規劃的演算法不正確。
因為我從你的代碼里發現,每到一個加油站,你只考慮了兩種選擇選擇加油(並且正好保證能開到今後遇到的某一個加油站)或者不加油。請問,我這樣理解對不對?如果我沒有說錯的話,你這個思路就有問題了。
我把你的代碼改成了貪心演算法,在oj上通過了。
#include<stdio.h>
#defineMAX12000
intmain()
{
doubled1,c,d2,p0,d[MAX]={0},p[MAX]={0},m,f[MAX],s[MAX],fa,ft,sa;
intn,i,j,b,t;
scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&p0,&n);
d[n+1]=d1;
p[0]=p0;
for(i=1;i<=n;i++)
{
scanf("%lf%lf",&d[i],&p[i]);
}
m=0;
b=0;
t=0;
for(i=0;i<=n;i++)
{
sa=0;
fa=0;
ft=(d[i+1]-d[i])/d2;
if(ft>c)
{
printf("NoSolution ");
return0;
}
while(b<t)
{
if(p[i]<=s[t-1])
t--;
else
break;
}
while(b<t&&fa<ft)
{
fa+=f[b];
sa+=f[b]*s[b];
b++;
}
if(fa<ft)
{
sa+=(ft-fa)*p[i];
}
elseif(fa>ft)
{
b--;
f[b]=fa-ft;
sa-=f[b]*s[b];
}
m+=sa;
if(ft<c)
{
f[t]=c-ft;
s[t]=p[i];
t++;
}
}
printf("%.2lf ",m);
return0;
}