MicroCity的一点介绍-标号法、最小费用流

2023-11-11 06:38

本文主要是介绍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的一点介绍-标号法、最小费用流的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/388204

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri

poj 2175 最小费用最大流TLE

题意: 一条街上有n个大楼,坐标为xi,yi,bi个人在里面工作。 然后防空洞的坐标为pj,qj,可以容纳cj个人。 从大楼i中的人到防空洞j去避难所需的时间为 abs(xi - pi) + (yi - qi) + 1。 现在设计了一个避难计划,指定从大楼i到防空洞j避难的人数 eij。 判断如果按照原计划进行,所有人避难所用的时间总和是不是最小的。 若是,输出“OPETIMAL",若