首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 求助。。。asp中实现最短路径 [已结贴,结贴人:k85705]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 18:43:12 楼主
    我在用asp做物流配送网页,要用dijkstra算法求最短路径,用access数据库存储起始点和重点还有他们之间的距离,a到b距离10,a到d距离30,a到e距离100,b到c距离50,c到e距离10,d到c距离20,d到e距离60...这些数据都输入在access数据表中...asp页面中a为起点...下拉按钮中可以选择b,c,d,e点..选择相应的点,点击查询就能打印出a点到该店的路径.例如:选择c..那么下面显示最短的路径是a-->d-->c 距离50  路线是中文的,求完整代码。。真俄很急需。。。我看了C和VB的程序。。但是我却是做asp。。vbscript或javascript都可以。。帮帮我吧。。。一定重谢的。。可以给我发信息

    200  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 18:56:251楼 得分:0
    帮帮我吧。。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 19:33:382楼 得分:0
    dijkstra算法阿‘。。。。55555555555555高手快来
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bhtfg538
    • 等级:
    发表于:2008-05-16 21:00:003楼 得分:0
    引用楼主 k85705 的帖子:
    我在用asp做物流配送网页,要用dijkstra算法求最短路径,用access数据库存储起始点和重点还有他们之间的距离,a到b距离10,a到d距离30,a到e距离100,b到c距离50,c到e距离10,d到c距离20,d到e距离60...这些数据都输入在access数据表中...asp页面中a为起点...下拉按钮中可以选择b,c,d,e点..选择相应的点,点击查询就能打印出a点到该店的路径.例如:选择c..那么下面显示最短的路径是a-->d-->c 距离50  路线是中文的,求完整代码。。真俄很…

    这个应该不叫算法吧 很简单的
    用纯JS写的话会有点点麻烦
    推荐用AJAX
    其实你个距离就是把
    "a-d"+"d-c"只要查询下数据库就好了的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 21:34:494楼 得分:0
    写一个函数,取这些始点到终点的和的最小值就可以了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 21:37:495楼 得分:0
    给你大概的思路:a为始点,b为终点
    function minnum(a,b)
    '在这里计算所有a为始点,b为终点的路线的和再取最小值
    end function
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 21:44:186楼 得分:0
    中间部分的写法还要看你的数据库结构
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 21:46:407楼 得分:0
    你的数据库是否这么设计的?
    始点 终点 距离
    a    b  10
    a    d  30
    是不是这样设计的?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 21:48:128楼 得分:0
    引用 7 楼 chinmo 的回复:
    你的数据库是否这么设计的?
    始点 终点 距离
    a    b  10
    a    d  30
    是不是这样设计的?


    对。。是这样的。。但老师规定要dijkstra算法阿
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 21:51:389楼 得分:0
    ID StartName EndName     PathLength
    1 商城仓库         天山路     10
    2 商城仓库         仙霞路     30
    3 商城仓库         凯旋路     100
    4 天山路         长宁路     50
    5 长宁路         凯旋路     10
    6 仙霞路         长宁路     20
    7 仙霞路         凯旋路     60


    这是我的数据库。。。起点就是商城仓库。。要求打印到其他地方的最短路径
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 21:52:5910楼 得分:0
    -_-!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 22:01:3011楼 得分:0
    怎么了哇???我不是很懂得。。。。刚学。。。做不好急死了俄
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 22:03:1412楼 得分:0
    只能告诉你思路
    如我5楼所说的,然后中间部分引用你的算法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 22:05:5413楼 得分:0
    因为起点有时候不能直接到目的地的。。。所以这应该是可达的两点间距离。。我是参考的一个vb程序的数据库这样写的。。他那个程序可以选择起点终点。。但是我只要求起点固定。选择重点就可以了。。。我想应该一样就这样写数据表了。。。。帮帮写个dijkstra算法吧。。。。郁闷死了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 22:08:0614楼 得分:0
    其实就是利用一维数组和二维数组
    dijkstra算法你应该很清楚的了
    算法引入这样两个集合S和T,S是那些已经确定了到I结点的最短路径的结点,T为全集U和S的差集,即那些还
    未确定最短路径的结点。而且S的初值是{i},T的初值是U-{i}。另外再引入一个标记数组
    D[N],其中在某一步D[k]表示当前从i到k的较短路径,D[k]的初值为M[i][k],整个算法
    过程如下:
      1、 在T中选择一个D[k]最小的结点k,将k并入S,并从T中去掉,如果T为{}则
      转到3;
      2、 用k结点和T中其余结点进行一遍比较,如果D[i]>D[k]+M[k][i],则用D[k]+M[k][i]
      取代原来的D[i],重复1;
      3、 算法结束,此时D[k]中保存的就是从I到k结点的最短路径。
      算法就以这样非常简单的形式完成了求解,时间复杂度是O(n^2),确定了从I到其余
    各结点的最短路径,如果要求记录路径,也很容易,可以引入一个路径标记数组P[k][m],
    如果P[k][m]为0则说明从i到k的当前最短路径中不含有m结点作为中间结点,如果为1
    则m成为其路径的所经结点。
    这就是dijkstra算法的大致

    在ASP种也就是一维数组和二维数组的应用
    自己根据这个取组合吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 22:15:2115楼 得分:0
    起始我还是有很多不懂的。。。虽然知道算法的大致原理。。但是主要不太会弄asp。。。。
    我下拉多选框都搞半天。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 22:22:4216楼 得分:0
    Option Explicit
    Public sAddList() As String
    Public iAddCount As String
    Public iAddMap() As Long  '地址地图
    Public iAddSelect() As String '选择的点的集
    Public iPathLength() As Long '路径距离集
    Public iPath() As Integer '路径集合

    Const NoPath = 999999999
    Dim sResult() As String
    Dim iResultSize As Integer '结果数据

    Dim iLoop As Integer
    Dim jLoop As Integer

    Public Sub CreateMap()
        Dim conn As New ADODB.Connection
        Dim rs As New ADODB.Recordset
        Dim sConn As String
        '打开路径列表
        sConn = App.Path & "\db.mdb"
        sConn = "provider=microsoft.jet.oledb.4.0;data source= " & sConn & ";persist security info=false "

        conn.ConnectionString = sConn
        conn.Open
       
        rs.Open "Select DISTINCT  StartName From tmpPath", conn, adOpenStatic
       
        '地点数量
        iAddCount = rs.RecordCount
        ReDim sAddList(1 To iAddCount)
        ReDim iAddMap(1 To iAddCount, 1 To iAddCount)
        ReDim iAddSelect(1 To iAddCount)
        ReDim iPathLength(1 To iAddCount)
        ReDim iPath(1 To iAddCount)
        ReDim sResult(1 To iAddCount)
        iLoop = 1
        While Not rs.EOF
            sAddList(iLoop) = rs.Fields(0).Value
            iLoop = iLoop + 1
            rs.MoveNext
        Wend
        '关掉
        rs.Close

        Dim sStartName As String
        Dim sEndName As String
        Dim sPathLength As String
        Dim iEndIndex As Integer
        rs.Open "Select * From tmpPath ", conn, adOpenStatic
        While Not rs.EOF
            sStartName = rs.Fields("StartName").Value & ""
            sEndName = rs.Fields("EndName").Value & ""
            sPathLength = rs.Fields("PathLength").Value & ""
            iAddMap(GetNameIndex(sStartName), GetNameIndex(sEndName)) = sPathLength
            rs.MoveNext
        Wend
       
        rs.Close
        Set rs = Nothing
        '把没有数据的地方填充成0
        For iLoop = 1 To iAddCount
            For jLoop = 1 To iAddCount
                If iAddMap(iLoop, jLoop) = Null Then
                    iAddMap(iLoop, jLoop) = 0
                End If
            Next
        Next
        For iLoop = 1 To iAddCount
            iAddSelect(iLoop) = "False"
            iPathLength(iLoop) = NoPath
            iPath(iLoop) = 0
        Next
    End Sub
    '算法
    Public Function SearchPath(iStartName As Integer, iEndName As Integer)
        'iStartName  '开始点
        'iEndName  '结束点
       
        Dim iCurrename As Integer
        Dim iTotalLength As Integer

        Dim bCanSearch As Boolean
       
       
        iCurrename = iStartName
        iTotalLength = 0            '设定开始距离
        bCanSearch = True
       
        Dim min As Long
       

        '//下面的代码初始化其他数组
        For iLoop = 1 To iAddCount
            '初始化选择点:1表示没有选中,0表示被选中
            iAddSelect(iLoop) = "False"
            iPathLength(iLoop) = NoPath
            iPath(iLoop) = 0
        Next
       
        '从图上显示当前第一个节点被搜索
        iAddSelect(iCurrename) = "True"
        iPathLength(iCurrename) = 0
        iResultSize = 0
        Do While bCanSearch
            '/* 更改数组中的距离 */
            For iLoop = 1 To iAddCount
                If ((iAddMap(iCurrename, iLoop) <> 0) And _
                    ((iPathLength(iLoop)) > (iAddMap(iCurrename, iLoop)) + iTotalLength)) Then
                    iPathLength(iLoop) = iAddMap(iCurrename, iLoop) + iTotalLength
                    iPath(iLoop) = iCurrename
                End If
            Next iLoop
           
           
            min = NoPath

            For iLoop = 1 To iAddCount
                If ((iPathLength(iLoop) < min) And (iAddSelect(iLoop) = "False")) Then
                    min = iPathLength(iLoop)
                    iCurrename = iLoop
                    iTotalLength = iPathLength(iLoop)
                End If
            Next iLoop
            iAddSelect(iCurrename) = "True"
       
            '/* 处理完成所有的顶点之后停止 */
            If (min = NoPath) Then
                bCanSearch = False
            End If
            '测试代码
            DoEvents
        Loop

    End Function
    Private Function GetNameIndex(sName As String) As Integer
        '获得当前的地址在数组中的编号
        Dim iIndex As Integer
        For iLoop = 1 To iAddCount
            If sAddList(iLoop) = sName Then
              iIndex = iLoop
              GetNameIndex = iIndex
              Exit Function
            End If
        Next
        GetNameIndex = iIndex
    End Function
    Public Sub GetResult(index As Integer)
        iResultSize = iResultSize + 1
        sResult(iResultSize) = index
    End Sub


    这是vb程序里弄下来的。。。不知可否修改用到asp里??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 22:23:5417楼 得分:0
    我不会javascript语言和vbscript语言。。。。。会我就自己弄了。。。。。急啊。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 02:20:4418楼 得分:200
    假设 数据库名:test.mdb,表名为: map,列名分别为:s、e、v

    "s"          "e"          "v"

    长宁路        凯旋路        10
    商城仓库      凯旋路        100
    商城仓库      天山路        10
    商城仓库      仙霞路        30
    天山路        长宁路        50
    仙霞路        长宁路        20
    仙霞路        仙霞路        60

    给个 JScript 的代码你。
    JScript code
    <%@ LANGUAGE="JScript" CodePage="936"%> <% var COBJ = function(progid) { return Server.CreateObject(progid) }; var println = function(s) { Response.Write(Server.HTMLEncode(s+"\n").replace(/\n/g, "<br />")); }; var alert = function(s) { Response.Write("<script type='text/javascript'>alert(unescape(\"" + escape(s+"") + "\"));</script>"); }; var MAX = 999999999999; //获取所有顶点 function getVS(conn) { var vs = []; vs.get = function(name) { return this[this[name]]; }; var rs = conn.Execute("SELECT DISTINCT * FROM (SELECT DISTINCT [s] FROM [map] UNION ALL SELECT DISTINCT [e] FROM [map])"); while (!rs.EOF) { vs[rs(0).Value] = vs.length; vs.push({name:rs(0).Value, pre:null, v:MAX}); rs.MoveNext(); } rs.Close(); rs = null; return vs; } // 初始化数据 function initVS(vs, start, OVS, CVS, conn) { var rs = conn.Execute("SELECT * FROM [map]"); while (!rs.EOF) { var s = vs.get(rs("s").Value); s.to = s.to || {}; s.to[rs("e").Value] = rs("v").Value; rs.MoveNext(); } rs.Close(); rs = null; var s = vs.get(start); s.v = 0; CVS.push(s); for (var i in s.to) { var t = vs.get(i); t.v = s.to[i]; t.pre = s; } for (var i=0; i<vs.length; i++) if (i!=vs[start]) OVS.push(vs[i]); } // 寻找开启列表中 F 值最低的顶点 function findMinV(OVS) { var min = MAX; if (OVS.length < 1) return false; var pos = 0; for (var i=0; i<OVS.length; i++) { if (OVS[i].v < min) { min = OVS[i].v pos = i; } } return OVS.splice(pos, 1)[0]; } function find(a, b, conn) { var OVS = []; // 开启列表 var CVS = []; // 关闭列表 var vs = getVS(conn); initVS(vs, a, OVS, CVS, conn); var target = findMinV(OVS); while (target) { for (var i in target.to) { var t = vs.get(i); if (t.v > target.v + target.to[i]) { t.pre = target; t.v = target.v + target.to[i]; } } CVS.push(target); target = findMinV(OVS); } target = vs.get(b) var total= target.v; var res = target.name; while (target.pre != null) { res = target.pre.name + " -> " + res; target = target.pre; } return "距离:" + total + "。\n路线:" + res + ""; } var conn = COBJ("ADODB.Connection") conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("test.mdb"); conn.Open(); var res = find("商城仓库", "长宁路", conn); conn.Close(); conn = null; alert(res); println(res); %>
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 09:45:3219楼 得分:0
    VB和VBS很像的!很多写法差不多一样!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 09:51:1620楼 得分:0
    痞子厉害!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 11:50:1521楼 得分:0
    18楼的老大...我先去试一下...等一下来问你哦~~~先拜谢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 12:20:2422楼 得分:0
    在luxian.asp文件里是这样的
    <!-- #include file = "include/sysbase.asp" -->
    <!-- #include file = "include/config.asp" -->

    <form method="get" >
    <font size="3"> 起始地点:
    <select name="StartName"  >
                        <option value="商城仓库" selected>商城仓库 </option>
    </select>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <font size="3"> 请选择配送目的地:
    <select name="EndName"  >
                        <option value="天山路" selected>天山路 </option>
                        <option value="仙霞路">仙霞路 </option>
                        <option value="凯旋路">凯旋路 </option>
    <option value="长宁路">长宁路 </option>
                    </select>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <input type = "submit" name = "find" value = "查找配送最短路径" >

    </form>
    写的很烂很烂....按钮点了按钮..应该有action="dijkstra.asp"的这个代码..放哪里= = ¦ ¦ ¦还有我选择的目的地的值应该反馈个dijkstra.asp文件吧,,,这样他才知道输出哪个路吧......我问的问题很傻不要鄙视我饿,,,郁闷..

    那段算法代码我要放到dijkstra.asp文件中..选择相应的终点...通过点击luxian.asp中的查询按钮,下面就打印出仓库到终点的最短路径


    这是我数据库..
    数据库 shop.mdb 表名 path
    ID  StartName      EndName    PathLength
    1    商城仓库          天山路        10
    2    商城仓库          仙霞路        30
    3    商城仓库          凯旋路        100
    4    天山路            长宁路        50
    5    长宁路            凯旋路        10
    6    仙霞路            长宁路        20
    7    仙霞路            凯旋路        60


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 13:07:3823楼 得分:0
    我不会阿~~~好痛苦~~我QQ176540552....帮忙的加我啊!!!真的生死攸关的.....我会非常感激俄.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 13:20:0924楼 得分:0
    你把你VB那个稍微改下就可以了
    JScript的连接服务器数据库这个很复杂的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 13:24:2725楼 得分:0
    引用 24 楼 chinmo 的回复:
    你把你VB那个稍微改下就可以了
    JScript的连接服务器数据库这个很复杂的


    我真的不会.....vb的是网上找来的...你能帮帮我吗???
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 13:43:0026楼 得分:0
    VBScript code
    <% dim sAddList() dim iAddCount dim iAddMap() '地址地图 dim iAddSelect() '选择的点的集 dim iPathLength() '路径距离集 dim iPath() '路径集合 Const NoPath = 999999999 Dim sResult() Dim iResultSize '结果数据 Dim iLoop Dim jLoop Sub CreateMap() sjbyDB="db.mdb" connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&sjbyDB&"") Set conn = Server.CreateObject("ADODB.Connection") conn.open connstr rs.Open "Select DISTINCT StartName From tmpPath",conn,1,1 '地点数量 iAddCount = rs.RecordCount ReDim sAddList(iAddCount) ReDim iAddMap(iAddCount,iAddCount) ReDim iAddSelect(iAddCount) ReDim iPat