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;
}