代价一致算法 swift3.0 寻找最小路径 无中间节点

最近在研究仓库沙盘,在多点内寻找最短路径,从迪杰斯特拉到A*都有尝试,最终用了代价一致搜索这个算法。

推荐这个算法的是我的同事,他告诉我能够扩展到中间节点,中间路过点,可我尝试了半天, 最终还是放下中间节点的写法,因为会有bug。

废话不多说了,直接上swift代码。

classGraph{

//从初始点到当前地点的距离之和

vardis =0

//是否被访问

varflag =0

//当前节点的上一个节点

varbef =0

}

classGraphString {

varcities = [String]()//地址名

varpath = [[NSInteger]]()//地址距离

}

classpriceIsConsistentAlgorithm {

//

init(notes:GraphString,beginIndex:Int,endIndex:Int) {

varGraphArray = [Graph]()

foriin0..

letgraph =Graph()

graph.dis=0* i//单纯去掉警告

graph.bef=-1

graph.flag=0

GraphArray.append(graph)

}

ucs_search(notes: notes, begin: beginIndex,end: endIndex, graph: GraphArray)

display(notes: notes, begin: beginIndex, end: endIndex, graph: GraphArray)

}

funcucs_search(notes:GraphString,begin:Int,end:Int,graph:[Graph]){

varlist = [NSInteger]()

//给数组添加起点

list.append(begin)

graph[begin].flag=1

//数组不为空时扩展节点

while!list.isEmpty{

//给数组排序最小到前面

list =sorTLiset(list: list,graph: graph)

letnod = list.removeFirst()//单独拿出最小节点最小节点移除

graph[nod].flag=1

//如果当前节点为目标节点则返回

ifnod == end{return}

foriin0..

//当某个节点和初始点有结合路径,并且不在数组队列里,则加入数组并更新

if(notes.path[nod][i] >=0)&&(graph[i].flag==0) {

if!IsListArray(i:i, list:list){//多点的算法在这里判断!!!!

list.insert(i,at:0)//插入在第一位

graph[i].dis= graph[nod].dis+ notes.path[nod][i]

graph[i].bef= nod

}elseif(graph[nod].dis+notes.path[nod][i] < graph[i].dis){

//如果此节点在队列里面但是从上一个结点到此节点的总路程小于直接到达此节点的路程,则更新dis数组使

//到达此节点的路程为现今的最短,并更新父节点的值

graph[i].dis= graph[nod].dis+ notes.path[nod][i]

graph[i].bef= nod

print("执行了")

}

}

}

}

}

//判断是否在list中

funcIsListArray(i:NSInteger,list:[NSInteger])->Bool{

forjinlist{

ifj == i {

returntrue

}

}

returnfalse

}

//将dis中最小的距离的结点移动至队列最前

funcsorTLiset(list:[NSInteger],graph:[Graph])->[NSInteger]{

vararray = list

varmin = graph.first?.dis

varidx =0

for(i,a)inlist.enumerated(){

ifgraph[a].dis< min!{

min = graph[a].dis

idx = i

}

}

lettemp = list[idx]

array.remove(at: array.index(of:temp)!)

array.insert(temp,at:0)

returnarray

}

funcdisplay(notes:GraphString,begin:Int,end:Int,graph:[Graph]){

varstack = [NSInteger]()//数组容器充当栈先进后出

vargoal = end

whilegoal != begin {

stack.append(goal)

goal = graph[goal].bef

}

stack.append(begin)

print("进过的路为:")

while!stack.isEmpty{

print("-->",notes.cities[stack.removeLast()])

}

print("经过的总长度为:",graph[end].dis)

}

}

以上是算法核心代码  调用代码为

graph.cities= ["1","2","3","4","5","6","7","8","9","10",

"11","12","13","14","15","16","17","18","19","20"]

graph.path=

[[0,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],// 1 - 6

[-1,0,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1],// 2 - 519

[-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1],// 3 - 17

[-1,-1,-1,0,-1,3,-1,3,3,-1,-1,3,-1,-1,3,-1,-1,3,3,-1],// 4 - 6 8 1812 19 15 9

[-1,3,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3],// 5 -2 20

[3,-1,-1,4,-1,0,-1,-1,-1,-1,3,-1,-1,3,-1,-1,-1,-1,-1,-1],// 6 -1 11 14 4

[-1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3],// 7 - 20

[-1,-1,-1,3,-1,-1,-1,0,-1,-1,3,-1,-1,-1,-1,-1,-1,3,-1,-1],// 8 - 11 18 4

[-1,-1,-1,3,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],// 9 - 4

[-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,3,-1,-1,-1,-1],// 10 - 16

[-1,-1,-1,-1,-1,3,-1,3,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1],// 11 - 68

[-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,3,-1,-1],// 12 - 18 4

[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,3,3,3,-1,-1,-1],// 13 - 15 16 17

[-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,-1],// 14 - 6

[-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,0,-1,-1,-1,-1,-1],// 15 - 4 13

[-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,3,-1,-1,0,-1,-1,-1,-1],// 16 - 10 13

[-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,0,-1,-1,-1],// 17 - 3 13

[-1,-1,-1,3,-1,-1,-1,3,-1,-1,-1,3,-1,-1,-1,-1,-1,0,-1,-1],// 18 - 4 8 12

[-1,3,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1],// 19 - 2 4

[-1,-1,-1,-1,3,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0]]// 20 - 5 7

_=priceIsConsistentAlgorithm(notes:graph, beginIndex:0, endIndex:18)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,719评论 0 33
  • Ⅰ. 一眨眼2017已经过去了很多个周末,下个周末就是4月份了。书稿已经整理了一半,书名一直在《有个故事》《人人心...
    张善良_阅读 128评论 0 0
  • 我不知道自己每天学习是为了什么,我想着我要好好学习,可终会被身边的诱惑所吸引,我不知道该怎么办?我很困惑,突然觉得...
    易耳朵阅读 113评论 0 0
  • 青果上线已经快4个月了。
    青呱骑士阅读 390评论 4 0