加载中...

地址发布 老王说明书 宣传中心

RPG游戏的寻路算法——从绯月讲起

查看数: 5214 | 评论数: 29 | 收藏 53
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2023-12-25 18:31

正文摘要:

本帖最后由 navebayes 于 2023-12-26 12:02 编辑 7 [5 d- Q( \; _0 E% d. Z(欢迎访问老王论坛:laowang.vip) - Y) S& i, |: E9 D1 f. @. O最近正在玩个游戏,也算是国产之光绯月仙行录,这个游戏哪里都好就是bug ...

回复

navebayes 发表于 2023-12-25 20:31:04
Applcu 发表于 2023-12-25 20:19  X$ `8 c5 s9 z& a& L& e  {(欢迎访问老王论坛:laowang.vip)
我在想怎么算说明运作逻辑.....真贴上去么?这个编辑器到底怎么用啊
7 \' S) c  o8 s6 ~ ...

& v+ e! F% c' X5 t3 s: W有一个代码框功能,可以用那个。主要编辑的话建议用正八经的md编辑器(我用的是国产的typora)
昔有佳人公孙氏 发表于 2023-12-25 20:25:06
navebayes 发表于 2023-12-25 20:11
- K2 y8 H# s- {5 D0 }2 t申请失败,原因:对算法本身描述过少,请更具体地说明算法的运作逻辑和方式,如果可以最好给出部分低代码
# @0 c9 t8 \6 b( d3 r5 j* a# L* a1 t: }' }. T(欢迎访问老王论坛:laowang.vip)
...
( I% o6 c  S' E8 Y7 e(欢迎访问老王论坛:laowang.vip)
啊这。不如解释一下单源最短路径问题中对于负权值和负权值回路为什么不能使用上述算法9 R3 C* L( s4 @, f. B+ ^" x(欢迎访问老王论坛:laowang.vip)
. y& `& s/ g) T1 D5 _$ W(欢迎访问老王论坛:laowang.vip)
这玩意考试考得头昏脑涨,我tm 深度生成树画错了,越想越气 怎么会这么蠢
, v/ k( E- \8 e* N3 v) r
Applcu 发表于 2023-12-25 23:28:47
昔有佳人公孙氏 发表于 2023-12-25 23:084 n$ m0 H/ p6 q- Q- j* F(欢迎访问老王论坛:laowang.vip)
其实目前,本科生能接触到的寻路算法 无外乎迪杰斯特拉和弗洛伊德 一个不吃负值 一个不吃负环
1 x, G4 j& u; m! u1 w! @但其实寻找最 ...

$ ?" }, h* K3 Q" [& y: [  g黏菌那个早有耳闻,确实是大自然的力量。我之后还想写点加密算法,比如AES,RSA,ECC之类的,其实这个地铁的算法也是我的一个课设,我大概花了两天就搞完了,我的主专业课是自控/单片机/数电/模电/嵌入式之类的,更偏自动化这个方向,算法我研究的不深。这个当毕业论文可能还是有一些勉强的,个人感觉工科是要做出一点实物的东西,当然不同学校可能要求不尽相同。
1 ]7 e; M" F  f- h4 h3 @. u5 r* c8 k. W' B(欢迎访问老王论坛:laowang.vip)

# ]  @% |8 y: |" Q
Applcu 发表于 2023-12-25 21:58:28
先说说个人对于Dijkstra算法设计地铁线路规划:2 ]0 ]9 V% C5 N6 t. @% y(欢迎访问老王论坛:laowang.vip)
1.首先用爬虫爬到该城市的地铁网络,包含站点名称,该站点经纬度和线路图,并生成excel表格。用该excel表格生成pickle文件,方便直接调用。
* E0 H. _  ?  `! _6 ^2.注册高德地图开发者账号(该功能需要实名),得到一个key用于调用api(每日上限100次,超过付费,我调试到后面不让我调试了...)& x5 f: G5 V2 C5 g7 A$ o. w(欢迎访问老王论坛:laowang.vip)
3.输入始发地和目的地,并通过api返回两个位置的经纬度坐标。' y0 F6 l( O$ q% c  f(欢迎访问老王论坛:laowang.vip)
4.比较两地理位置之间的最近地铁站,并根据Dijkstra算法实现路径规划。+ l3 D5 I8 @1 _3 K9 v4 [(欢迎访问老王论坛:laowang.vip)
5.Dijkstra算法的本质就是不断选择新顶点并更新已处理表,并将他和邻居节点进行比对,当所有节点都被处理后即为最短路径- V6 B# ^$ N# Y+ W- c3 U) U9 g/ [(欢迎访问老王论坛:laowang.vip)
至此,已初步完成具体工作流程。4 B# x! T+ q; S" O; m(欢迎访问老王论坛:laowang.vip)
  1. def get_nearest_subway(data,longitude1,latitude1):' ~9 ^5 A' S9 }  }(欢迎访问老王论坛:laowang.vip)
  2.     #找最近的地铁站
    3 {0 q: ?  t% }
  3.     longitude1=float(longitude1)0 r6 F4 a. ?2 G- G- w+ D  [0 I; g$ l9 H7 Q(欢迎访问老王论坛:laowang.vip)
  4.     latitude1=float(latitude1)% i% F: B& t7 J9 l/ ~( V" s(欢迎访问老王论坛:laowang.vip)
  5.     distance=float('inf')& Q) Z$ Q8 B: Y- K(欢迎访问老王论坛:laowang.vip)
  6.     nearest_subway=None
    , K" E2 B: n4 n$ i9 a
  7.     for i in range(data.shape[0]):
      u* R0 n9 `9 K
  8.   site1=data.iloc[i]['name']    6 j- c, K# `# c& q- \2 C(欢迎访问老王论坛:laowang.vip)
  9.   longitude=float(data.iloc[i]['longitude'])5 v# b* M7 Y) @# A- ?$ f( B- P( R(欢迎访问老王论坛:laowang.vip)
  10.   latitude=float(data.iloc[i]['latitude'])    #分别将经纬度代入,计算与目标之间的欧氏距离
    % E7 L0 R& J; b1 N6 @6 n- w
  11.   temp=geodesic((latitude1,longitude1), (latitude,longitude)).m   #temp对其遍历即可,这里对比各个地铁站的欧氏距离
    3 _1 U/ N8 E. k  `/ m
  12.   if temp<distance:6 b- Y- S$ D& e# X5 E(欢迎访问老王论坛:laowang.vip)
  13.     distance=temp
    ) x' A, `) a! K4 }# ?! g% C) P
  14.     nearest_subway=site19 N3 @3 S9 O2 T" U+ F- a0 c- R(欢迎访问老王论坛:laowang.vip)
  15.     return nearest_subway  
复制代码
  1. def subway_line(start,end):    #创建点之间的距离) ^1 N/ T8 h% u7 @" |(欢迎访问老王论坛:laowang.vip)
  2.     file=open('graph.pkl','rb')
    & ^" u- a' e' L& I' B: P% Z" I
  3.     graph=pickle.load(file)   #现在我们有了各个地铁站之间的距离存储在graph% @/ P. l8 X* M) ?! O& L(欢迎访问老王论坛:laowang.vip)
  4.     costs={}    #创建节点的开销表,cost是指从start到该节点的距离9 ?; S: B0 I* f* N. I(欢迎访问老王论坛:laowang.vip)
  5.     parents={}
    & @4 P! O: U. n* b
  6.     parents[end]=None6 a# r8 p( K' l(欢迎访问老王论坛:laowang.vip)
  7.     for node in graph[start].keys():
    8 o  S: P( ]- {! ^- N$ V; O2 m
  8.   costs[node]=float(graph[start][node])2 f/ a2 \1 c$ j# `& y& v; X. g+ g(欢迎访问老王论坛:laowang.vip)
  9.   parents[node]=start9 `9 n- n1 p+ y5 A. n( h; h. i/ p1 ]* L(欢迎访问老王论坛:laowang.vip)
  10.     costs[end]=float('inf')    #终点到起始点距离为无穷大) {3 D0 G' d" p4 n" x(欢迎访问老王论坛:laowang.vip)
  11.     processed=[]      #记录处理过的节点list
    $ h2 P! T" M- M, @* u
  12.     shortest_path=dijkstra(start,end,graph,costs,processed,parents)/ F0 ~, r" h. n6 M, A(欢迎访问老王论坛:laowang.vip)
  13.     return shortest_path
复制代码
  1. #计算图中从start到end的最短路径! W6 D7 u! q2 G(欢迎访问老王论坛:laowang.vip)
  2. def dijkstra(start,end,graph,costs,processed,parents):2 R7 I* B; R; r4 F2 Q5 c(欢迎访问老王论坛:laowang.vip)
  3.     #查询到目前开销最小的节点; H7 K! d' i& Q; r(欢迎访问老王论坛:laowang.vip)
  4.     node=find_lowest_cost_node(costs,processed)
      D! q& [1 R0 `7 N
  5.     #使用找到的开销最小节点,计算它的邻居是否可以通过它进行更新4 M7 s7 w8 R4 D# x; x$ a2 v(欢迎访问老王论坛:laowang.vip)
  6.     #如果所有的节点都在processed里面 就结束
    6 K  \4 @% m; d
  7.     while node is not None:- S$ u/ H: Z5 _8 r9 y& M( P( V(欢迎访问老王论坛:laowang.vip)
  8.   #获取节点的cost9 H4 c7 r* t- k: @5 m# i& ]" b(欢迎访问老王论坛:laowang.vip)
  9.   cost=costs[node]  #cost 是从node 到start的距离, g  p3 R+ C4 q# _! m% b(欢迎访问老王论坛:laowang.vip)
  10.   #获取节点的邻居* m  h4 k0 E+ c, r% r% n4 V(欢迎访问老王论坛:laowang.vip)
  11.   neighbors=graph[node]
    / Q0 `1 j0 U2 M- h" l. O1 [  [
  12.   #遍历所有的邻居,看是否可以通过它进行更新
    " M" ~1 Q% J, N. B7 N7 M
  13.   for neighbor in neighbors.keys():
    ! h" Z4 X" z1 b" p# j  a& i
  14.     #计算邻居到当前节点+当前节点的开销
    # p% q9 R1 c5 P* I) y
  15.     new_cost=cost+float(neighbors[neighbor])6 a- U$ v/ T! F(欢迎访问老王论坛:laowang.vip)
  16.     if neighbor not in costs or new_cost<costs[neighbor]:
    0 ], c  X0 Y9 W3 J5 u/ S  F
  17.       costs[neighbor]=new_cost
    & C, {. q- ^& ]' R* ^/ g1 n
  18.       #经过node到邻居的节点,cost最少9 D- Q1 ^! h, ?(欢迎访问老王论坛:laowang.vip)
  19.       parents[neighbor]=node; t: c/ P8 g; Y(欢迎访问老王论坛:laowang.vip)
  20.   #将当前节点标记为已处理* e6 ~" k6 T9 }! f9 G" e4 M(欢迎访问老王论坛:laowang.vip)
  21.   processed.append(node)
    + G2 U  C0 M: @  @; {
  22.   #下一步继续找U中最短距离的节点  costs=U,processed=S! H: M$ g  F- Q3 A(欢迎访问老王论坛:laowang.vip)
  23.   node=find_lowest_cost_node(costs,processed)
复制代码
4 F1 i) s" \$ v* s: D! e, M/ g9 D(欢迎访问老王论坛:laowang.vip)

) c/ u# k- a# ]
  1. def find_lowest_cost_node(costs,processed):5 v7 I- T, K" O(欢迎访问老王论坛:laowang.vip)
  2.     #初始化数据
    " G3 _) @2 `2 ^2 Z
  3.     lowest_cost=float('inf') #初始化最小值为无穷大
    % d% m- @: ?" o2 `& Y3 @) Y
  4.     lowest_cost_node=None* p6 G7 I/ `! o1 a1 l(欢迎访问老王论坛:laowang.vip)
  5.     #遍历所有节点
    5 k; H) z$ H' e, t4 I6 J5 z
  6.     for node in costs:
    0 p3 t4 N! n7 V0 P# R
  7.   #如果该节点没有被处理# R  S' \) ~- ^4 x# g  l. ](欢迎访问老王论坛:laowang.vip)
  8.   if not node in processed:( A  J$ P  w, r( t" W2 X& u(欢迎访问老王论坛:laowang.vip)
  9.     #如果当前的节点的开销比已经存在的开销小,那么更新该节点为最小开销的节点" ~) g5 B& c2 _7 A+ n0 \/ h6 x(欢迎访问老王论坛:laowang.vip)
  10.     if costs[node]<lowest_cost:
    $ D' f$ [- A$ F/ N1 r6 V/ i6 y
  11.       lowest_cost=costs[node]
    & |' x# T& ?7 h% V6 b+ R' W7 {( J. A
  12.       lowest_cost_node=node7 q  S( u% W- |: }2 G(欢迎访问老王论坛:laowang.vip)
  13.     return lowest_cost_node
复制代码
上面这段基本上搬运的,主要是他代码已经写的很好了,注释也写的不错,但我写的时候爬虫调不出来(反爬虫技术可以的),最后是我手动去地图里找经纬度得到的结果。
" U4 T0 t, `# w9 }. d) @引用:https://blog.csdn.net/fengdu78/article/details/111570695
) S+ _" c- t/ V- O* F+ H" [
navebayes 发表于 2023-12-25 20:11:24

修改修改

本帖最后由 navebayes 于 2023-12-25 20:14 编辑 $ h& G. f( Q0 [, V6 ]3 X% ]+ t; {! ~8 V(欢迎访问老王论坛:laowang.vip)
1 ]( [! b2 q; m/ }3 z. F+ o(欢迎访问老王论坛:laowang.vip)
申请失败,原因:对算法本身描述过少,请更具体地说明算法的运作逻辑和方式,如果可以最好给出部分低代码( {1 r6 U: I; j8 L(欢迎访问老王论坛:laowang.vip)
5 g0 t. L5 |, h: F/ R6 d(欢迎访问老王论坛:laowang.vip)
ps:只要做滴好,王爷有赏啊
gaogao0621 发表于 2024-3-12 21:03:20
我是一个初中OIer,如有错误请指出,欢迎讨论
( v2 o, G2 Y9 y& n% m我记得之前好像看主要地图的寻路算法是A*?如果没记错的话
1 Q' j0 A2 @# T1 G' [  F, w$ K% |  g0 a# ^# B(欢迎访问老王论坛:laowang.vip)
有几点建议:* m! r; W$ N0 n/ D! n4 u7 l(欢迎访问老王论坛:laowang.vip)
1.具体算法实现可以用CPP,Python太慢了,尤其是要处理百万/千万级别的数据时,可以用python爬取数据然后由cpp进行相应处理,这样的好处是大幅减少了时间且使不会特别麻烦(CPP的网络爬虫实现太麻烦,且各种配置环境很难受)不过如果数据量不是很大的话用py很省开发时间(
; u2 e" F  X, x/ a* y: a2.关于实现算法我个人更推荐A*,由于其是启发式的,时间复杂度比Dij低,也能省下很长时间(不过也要看数据量,有些时候IDA*比A*好)至于您说的D*很抱歉我没有接触过这个算法,不予评价) H& h- [. r5 \9 j(欢迎访问老王论坛:laowang.vip)

& a& X" d8 ]" d3 h. d7 J5 R如果有很多很多线路要查询的话还可以加个多线程优化,这个用py的threading更容易些,当然cpp也不是不行3 _* F6 h$ P) l3 f(欢迎访问老王论坛:laowang.vip)
9 g& N* t0 i* ^) h1 c7 I. M8 s7 W(欢迎访问老王论坛:laowang.vip)
Applcu 发表于 2023-12-29 01:22:53
六道骸 发表于 2023-12-29 00:45
" ]4 s4 e  c6 x6 f0 h/ d. u& T$ e8 n太专业看不懂,,,

9 `' c  ^, w+ M+ O1 A7 y这个还是要对算法有一定了解才能看懂! T+ R" Y" Q; V0 `' v/ G# _(欢迎访问老王论坛:laowang.vip)
六道骸 发表于 2023-12-29 00:45:35
太专业看不懂,,,
navebayes 发表于 2023-12-27 17:14:02
Applcu 发表于 2023-12-26 22:28
9 |7 G4 P" t) f- x) h3 s$ m. k好的,下次改进一下

- t! k; _- z+ z7 k/ S8 |; W今天给你们加钱了喵,主要是感觉原来的发的还是有些少3 U) A, y' s( Q* I7 J: `: K, _(欢迎访问老王论坛:laowang.vip)
Applcu 发表于 2023-12-26 22:30:02
qwer20021125 发表于 2023-12-26 20:15# z+ i9 D) s* V8 W9 G% w(欢迎访问老王论坛:laowang.vip)
很难想象居然在这里看到了这种文章,点赞
7 g4 y" H! d! t(欢迎访问老王论坛:laowang.vip)
你可以在ghs的网站看到高数的视频,那肯定也能在这看到算法类帖子8 l+ I* w' ?9 a6 z, }$ Z5 }(欢迎访问老王论坛:laowang.vip)

评分

参与人数 1软妹币 +30 收起 理由
navebayes + 30 cheese!!补补

查看全部评分

Applcu 发表于 2023-12-26 22:28:42
navebayes 发表于 2023-12-26 13:56
2 h6 @& O) j+ Y. i8 `5 [0 D3 w下次可以的话写详细些..比如算法这类最好有深有浅

. K% y+ h+ Z1 ]好的,下次改进一下
4 m( x$ u( p7 O, X1 f& q9 k  X

评分

参与人数 1软妹币 +45 收起 理由
navebayes + 45 cheese!!补

查看全部评分

qwer20021125 发表于 2023-12-26 20:15:02
很难想象居然在这里看到了这种文章,点赞
navebayes 发表于 2023-12-26 13:56:10
Applcu 发表于 2023-12-26 13:37
+ m4 S8 H% c) p2 B! h好好好,大概就这样吧建议打钱
$ D6 t& q/ g8 |(欢迎访问老王论坛:laowang.vip)
下次可以的话写详细些..比如算法这类最好有深有浅
navebayes 发表于 2023-12-26 13:52:16

再加加些吧

本帖最后由 navebayes 于 2023-12-27 17:11 编辑
. M) @; k& u. v
! a  A3 L7 G! a- m- i6 l基础50可读50排版50内容120其他40共计235+45+30=310
Applcu 发表于 2023-12-26 13:37:01
navebayes 发表于 2023-12-26 12:03
2 q7 ]2 m+ R( d  z排版改了下喵,东西加好了喵
! t; w/ b% r7 M: S(欢迎访问老王论坛:laowang.vip)
好好好,大概就这样吧建议打钱% n7 b  ?- H: l2 S(欢迎访问老王论坛:laowang.vip)
navebayes 发表于 2023-12-26 12:03:53
Applcu 发表于 2023-12-25 23:302 b- ^: n' S4 `(欢迎访问老王论坛:laowang.vip)
可以可以

/ y! \9 {* A1 v5 J" C# P排版改了下喵,东西加好了喵
) i* @- Y' v& f$ `8 D
Applcu 发表于 2023-12-25 23:30:40
navebayes 发表于 2023-12-25 23:020 b$ U( G% r2 T8 w6 u6 Y6 ^(欢迎访问老王论坛:laowang.vip)
介意让我改一下吗
% i1 C: [4 j! T+ W(欢迎访问老王论坛:laowang.vip)
可以可以8 E$ y5 t1 ], |* W6 A(欢迎访问老王论坛:laowang.vip)
昔有佳人公孙氏 发表于 2023-12-25 23:08:15
其实目前,本科生能接触到的寻路算法 无外乎迪杰斯特拉和弗洛伊德 一个不吃负值 一个不吃负环
! @0 Z0 S0 F) x$ O5 j9 a! n" Z( G# y但其实寻找最短路径的算法里还有很知名的黏菌算法。' f! G5 n, _0 M$ G(欢迎访问老王论坛:laowang.vip)
有兴趣的可以去B站搜搜黏菌走迷宫,看看在大自然顶级的算法编辑下的单源最短路径问题的解法
: ?$ j' \) ~& j不是说将奖励放置位置对应于日本的各大城市,两天内的黏菌路线就基本和目前日本的城市规划大致相似了吗,当然不太严谨是真的 ) S; d4 Q2 t" q(欢迎访问老王论坛:laowang.vip)
就好像楼主说的做了地铁最短路径规划, 这玩意我舍友和你类似,她做的事全国铁路路径规划,涉及到价格,时间,反正做到最后是你输入起始地址和目的地,就能得出花费最少,时间最少,转站最少的路线,C++课设 我记得很清楚,我记得老师说的评价是,如果再加上运筹学的内容,说不定可以当毕业论文了,不出意外她拿了满分。
navebayes 发表于 2023-12-25 23:02:44
Applcu 发表于 2023-12-25 22:51
4 |! i9 {" S/ u- q3 w加了加了

+ H4 v' S9 J! ?) |! @介意让我改一下吗https://pic.imgdb.cn/item/6589996fc458853aef070f38.gif
& t9 c: A" _: I- {5 `
Applcu 发表于 2023-12-25 22:51:56
navebayes 发表于 2023-12-25 22:34
/ i' ?5 ?# Y+ E8 E4 z可以加入正文喵

+ p( K# N. K8 z* B8 c加了加了
+ ]0 A% b( |/ Y# f, N% W
Applcu 发表于 2023-12-25 22:42:13
昔有佳人公孙氏 发表于 2023-12-25 20:25" |$ V0 }6 g# |. n(欢迎访问老王论坛:laowang.vip)
啊这。不如解释一下单源最短路径问题中对于负权值和负权值回路为什么不能使用上述算法
$ @* x1 u1 C( m
2 b% S* B# R1 U+ @7 w这玩意考试考得头 ...

& [- D; \3 V( N4 R' d' s+ ?我也头大了.....但本质还是因为Dijkstra算法认为,如果有一条最短路线可以直达目的地,那么从旁边走另外的路将会直接不考虑,但在负权边这里,反而会减小cost,所以Dijkstra算法失效了,因为无法发现这条最短的路径
" w" Q! `, _0 m
navebayes 发表于 2023-12-25 22:34:33
Applcu 发表于 2023-12-25 21:589 S: d  U& J0 T3 I(欢迎访问老王论坛:laowang.vip)
先说说个人对于Dijkstra算法设计地铁线路规划:. _) Q: y$ A# x: L3 d(欢迎访问老王论坛:laowang.vip)
1.首先用爬虫爬到该城市的地铁网络,包含站点名称,该站点 ...

/ _  S( l0 H7 r, O; s; R0 W可以加入正文喵
3 N. W+ B9 k; N- _7 i
navebayes 发表于 2023-12-25 21:37:16
Applcu 发表于 2023-12-25 21:153 R" ~/ V( L. p(欢迎访问老王论坛:laowang.vip)
真是男童啊.....

  Z" E6 d/ J& I1 d诽谤管理封七天

我们不生产资源,只做资源的搬运工。

tags标签-春满四合院-AvGood-Archiver-小黑屋- |网站地图