本文主要是介绍MicroCity的一点介绍-标号法、最小费用流,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- Lua语言
- 一、Lua简单程序
- 二、物流信息的处理
- 1.标号法求最短路
- 2.最小费用流模型代码
- 总结
Lua语言
MicroCity的脚本用的是Lua语言,提到Lua大家想到的大多是游戏的制作,然而通过MicroCity这个软件,Lua语言可以辅助进行物流信息的处理。
一、Lua简单程序
用二维数组打印1~100孪生质数
s={}
k={}
d=0 --计算李生质数组数
for i=2,100 do --判断2~100的素数isPrime = truefor a=2,i-1 doif i%a == θ thenisprime = falseendendif isPrime thenb=i+2for c=2,b-1 do--判断+2是否为质数if b%c ==0 thenisPrime = falseendendif isPrime thend=d+1 --组数, 共8组table. insert(s,i) -- 每组李生质数中较小的质数组成的数组endend
end
for e=1,d dok[e]={}for i=1,#s dok[e][1]=s[i]k[e][2]=s[1]+2print(k[e][1],"和",k[e][2],"为李生质数")endbreak
end
二、物流信息的处理
1.标号法求最短路
标号法求解最短路的思想是运筹学中所学解决最短路问题的方法,从起点开始对各点临时标号,找到最短路后永久标号直至所有点检查完毕。
代码如下(示例):
local Links=GetControl("xian.shp")
local Points=GetControl("dian.shp")
local marked ={}
local stpdis= {}
local preid= {}
local startid =24 --设置起点
local endid=5 --设置终点for N=1,GetRecCount(Points) do --GetRecCount:获得表格记录数量 stpdis[N] = 100000000 --初始化各点距离为正无穷
endcrtid = startid --设置当前节点
marked[crtid]=true --标记当前点(永久标号)
stpdis[crtid]=0 --初始化当前点距离为零
preid[crtid]=-1 --当前点前溯节点设为-1
while crtid ~= endid do --从当前点搜索直到终点for id = 1, GetRecCount(Links) do --搜索所有链接local o = GetValue(Links, "O", id) --分别得到各条线的三个属性local d = GetValue(Links, "D", id)local dis = GetValue(Links, "DIS", id)if o == crtid then --如果与当前节点邻接tmpid =d --并且另一端点的最短距离较大if stpdis[crtid] + dis < stpdis[tmpid] then stpdis[tmpid] = stpdis[crtid] + dis preid[tmpid] = crtid --修改另一端点的最短距离和前溯节点end elseif d==crtid then --如果与当前节点邻接tmpid =o --并且另一端点的最短距离较大if stpdis[crtid] + dis < stpdis[tmpid] then stpdis[tmpid] = stpdis[crtid] + dis preid[tmpid] = crtid --修改另一端点的最短距离和前溯节点end endendcrtid = endid --设置下一个当前节点for nodeid = 1,GetRecCount(Points) do --搜索所有节点if not marked[nodeid] and stpdis[nodeid] < stpdis[crtid] then --找到未标记的有最小距离的节点crtid = nodeid --重新设置当前节点end end marked[crtid] = true --标记新的当前节点
endlocal m={} --设置一个数组
c=endid --将所有前溯节点存在数组里面
local i = 1
while c~=-1 do --当反推前溯节点回到-1时,结束循环m[i]=cc=preid[c]i=i+1
end
print("经过的ID为:")
while i~=1 doprint("id:",m[i-1]) --正向输出所有点i=i-1
endprint("最短距离:",stpdis[endid])
2.最小费用流模型
代码如下:
lp = CreateLP()
SetobjFunction(lp, {2,2,1,3,1}, "min")--各边的费用
AddConstraint(lp,{1,1,0,0,0}, "=", 3)--起点的流出
AddConstraint(lp, {-1,0,1,1,0}, "=", 0)--流出等于流入
AddConstraint(lp, {0,-1,-1,0,1},"=", 0)
AddConstraint(lp, {0,0,0,-1,-1}, "=", -3)--终点的流入
AddConstraint(lp, {1,0,0,0,0}, "<=", 4)--各点的容量
AddConstraint(lp, {0,1,0,0,0}, "<=", 2)
AddConstraint(lp, {0,0,1,0,0}, "<=", 2)
AddConstraint(lp, {0,0,0,1,0}, "<=", 3)
AddConstraint(lp, {0,0,0,0,1}, "<=", 5)
for i=1,5 dolocal W = {}for j=1,5 doif i==j thenw[j]=1elsew[j] =0endendAddConstraint(lp, w, ">=", 0)
end
SolveLP(lp)
Print("最小费用为", Getobjective(1p))
Print("1-2流量是" , GetVariable(1p,1), ",",
"1-3流量是",GetVariable(lp,2),",",
"2-3流量是",GetVariable(lp,3),",",
"2-4流量是",GetVariable(lp,4),",",
"3-4流量是",GetVariable(lp,5))
具体最小费用流问题可以用线性规划求解,缺点代码繁琐,不方便适用于各类问题,比较适合小型最小费用流模型。
总结
可以在https://microcity.github.io上更新一下MicroCity,最近更新了能在地图上用尺子工具直接量出两点的真实距离,里面也有很多伪代码和函数介绍。
这篇关于MicroCity的一点介绍-标号法、最小费用流的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!