求推销员问题的完整代码,to:leechange能给出注释吗?谢谢了。我看不懂深奥的东东 (200分)

  • 主题发起人 主题发起人 jingyi
  • 开始时间 开始时间
J

jingyi

Unregistered / Unconfirmed
GUEST, unregistred user!
我的这个问题不知道该是什么分类。放在别的地方也没人回答。关于人工智能的。
有个推销员从A出发,要求经过B,C,D,E然后回到A,每个城市只能走一次。各个城市间的距离给出了。要求解出,最短的距离。
什么语言的都可以。给出完整的程序最好了。急需,我等!
 
研究一下《图论》
应该属于最短路径算法吧!
 
我研究了好长时间了,由于本人对编程很不在行。特别对于这些数学问题较强的东西。我一点头绪都没有。能不能给出完整代码。开学要交作业!
 
放到數據結構去吧。
那裡有高手。
好象得一步步的試探。
如果城市一多就麻煩了。
 
同志,你这个问题难啰
在算法上称为“货郎问题”,属于NPC类,没有多项式时间算法。
回去给你找找看
 
先谢谢大家了。
 
我想到数据结构里找答案,可是我没分了。哎!这里必须都给吗?
 
没找到答案也要给分吗?这里给了,我就没分了。
 
老兄,您的问题的分类不对。可以通过“编辑”来修改分类的——把这个问题转移到数据
结构版去吧。
算法思路以及C语言代码: http://shada.ocnc.net/laf/suanfa/fenzd5.htm
 
谢谢creation_zy,我刚来,不知道怎么转移。现在知道了。嘿嘿。
 
给你提个思路
1〉生成该图的最小生成树
2〉将该树的每条边原样复制一次,形成欧拉图
3〉找出该欧拉图的欧拉回路
4〉在该欧拉图上,从一点出发,寻找到另一点的权最短的边,把该点加入到路径中,重复,直到为一条回路。
 
to 落木:
如果我没记错,欧拉是回路是遍历边,而楼主要遍历顶点,应该是哈密顿回路。
到是有“货郎问题”这么种提法,没什么有效的算法,不过楼主的问题总共才5顶点,没什么吓人的。
 
是利用欧啦回路找哈密尔顿回路。
找哈密尔顿回路也是NPC的
当然,5个顶点可以用穷举法,但这不叫有效的算法,时间复杂度太高
我提的算法A(I)/OPT(I)<2


















































 
creation_zy给出的代码编译不出来。在VC里面
其他高手都谈算法,我也不懂,能不能给出具体的程序呢?
 
没仔细找Bug,效率也只能对付5个顶点,将就用吧。
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TNode = record
d: Integer;
Len: Integer;
Arrived: set of Byte
end;

var
Graph: array [1..5, 1..5] of Integer;
Stack: array [0..4] of TNode;
Top: Integer;
BestLen: Integer;
BestWay: array [1..4] of Integer;
i: Integer;
procedure Init;
var
i, j: Integer;
begin
for i:=1 to 4do
for j:=i+1 to 5do
begin
Write(Chr(Ord('A')+i-1)+'到'+Chr(Ord('A')+j-1)+'的距离:');
ReadLn(Graph[i, j]);
Graph[j, i]:=Graph[i, j]
end;
Stack[0].d:=1;
Stack[0].Len:=0;
Stack[0].Arrived:=[1];
Stack[1]:=Stack[0];
Top:=1;
BestLen:=MaxInt
end;

procedure Print;
var
i: Integer;
begin
Write('路线:A - ');
for i:=1 to 4do
Write(Chr(Ord('A')+BestWay-1)+' - ');
WriteLn('A');
WriteLn('总长度:', BestLen)
end;

begin
Init;
while Top>0do
begin
while Stack[Top].d<5do
begin
Inc(Stack[Top].d);
if not (Stack[Top].d in Stack[Top-1].Arrived) then
if (Graph[Stack[Top-1].d, Stack[Top].d]>0) then
begin
Stack[Top].Len:=Stack[Top-1].Len+Graph[Stack[Top-1].d, Stack[Top].d];
Stack[Top].Arrived:=Stack[Top-1].Arrived+[Stack[Top].d];
if Top=4 then
begin
if Graph[Stack[Top].d, 1]>0 then
if Stack[Top].Len+Graph[Stack[Top].d, 1]<BestLen then
begin
BestLen:=Stack[Top].Len+Graph[Stack[Top].d, 1];
for i:=1 to 4do
BestWay:=Stack.d
end
end
else
begin
Inc(Top);
Stack[Top].d:=1
end
end
end;
Dec(Top)
end;
Print;
ReadLn
end.
 
回去调试看行不,如果可以,就多谢谢。LENCHANGE了。行了就结束问题。嘿嘿,好高兴!
 
to :leechange能给出注释吗?我也看不懂。谢谢了!
 
跟走迷宮差不多。
能理解棧的特性就可以了。
頂點一多的確是夠麻煩的。
 
典型的数据结构问题,非得好好把大学读的书籍般出来看看才行。
 
后退
顶部