JSON解决方案格式
JSON解决方案格式
JSON(或JavaScript对象表示法)是一种轻量级的、基于文本的、独立于语言的数据交换格式。它起源于JavaScript,但许多现代编程语言都包含生成和解析json格式数据的代码。
Gurobi JSON解决方案格式是一种捕获和共享优化结果的简单而标准的方法。它符合rfc - 8259标准。JSON解决方案可以写入文件或以字符串形式捕获。
JSON解决方案捕获与模型的解决方案相关联的各种Gurobi属性的值。有些与整个模型有关,有些与个体变量有关,有些与个体约束有关。JSON解决方案字符串的准确内容取决于以下几个因素:
- 被解模型的类型(线性、二次、混合整数、多目标等)。某些解决方案信息对于某些问题类型是不可用的(例如,MIP模型的双变量值)。
- 模型中标记元素的集合。对象可以标记变量(使用VTag属性),线性约束(使用CTag属性)和二次约束(使用QCTag属性)。JSON解决方案中只有标记的元素才有解决方案信息。
- 的JSONSolDetail参数,它控制JSON解决方案中包含多少细节。
- 参数设置,例如InfUnbdInfo或QCPDual,使优化过程产生更多的解决方案信息。
JSON解决方案通常不会被人类直接解释。相反,您通常将它们馈入JSON解析器,其提供用于从字符串中提取所需信息的工具。JSON是一种广泛使用的格式,几乎所有现代程序语言都有可用于帮助解析JSON字符串和文件的库。如果您决定直接检查该字符串,则JSON解析器通常还包括漂亮打印实用程序,使其更容易这样做。
基本结构
JSON解决方案字符串由一组命名组件组成。在最简单的形式下,它可能看起来如下:
{"SolutionInfo": {"Status": 3, "Runtime": "3.4289908409118652e-01", "BoundVio": "0", " construcvio ": "0", "IterCount": "0", "BarIterCount": 0}}JSON解析器使得从这个字符串中提取各种组件相对容易。例如,在Python中,您可以通过访问来检索优化状态
结果(“SolutionInfo”)(“状态”)
在解析。在讨论以这种格式提供的具体信息之前,让我们先介绍一下数据是如何表示的。每个数据项的类型在属性类型之后。例如,状态是一个整数属性,因此相应的值存储为整数。运行时是一个double属性,它被表示为一个字符串,并且该字符串总是捕获该属性的精确的双精度值(IEEE754)。
指定组件
一个JSON解决方案总是至少有一个命名对象:SolutionInfo。它最多可以包含三个可选的命名数组:var,若干,QConstrs。一个JSON解决方案字符串可能看起来像:
{" SolutionInfo ":{…},“var”:[…),“若干”:[…),“QConstrs”:[…]}这三个可选部分的确切内容将取决于标记了什么模型组件以及可用的解决方案信息。例如,如果没有标记变量,则
var
数组将不存在。对于MIP模型,若干
数组将不会出现,因为MIP解决方案不包含任何约束信息。SolutionInfo对象
的SolutionInfo
对象包含有关为此模型计算的解决方案的高级信息。一些条目将始终存在,而另一些则取决于问题类型或优化的结果。该组件可能包括以下模型属性:
- 状态(总是)
- 优化状态(最优、不可行、达到时间限制等)。
- 运行时(总是)
- 优化的运行时(以秒为单位)。
- ObjVal
- 解决方案客观价值。
- ObjBound
- 最著名的临界值。
- ObjBoundC
- 已知的最客观值的界(在使用完整性信息加强界之前)。
- MIPGap
- 最优性差距。
- IntVio
- 最大完整性违背。
- BoundVio
- 最大界限违反。
- ConstrVio
- 最大约束违背。
- ObjNVal(多目标)
- 一组客观值,每个目标对应一个。
- ScenNObjVal(仅multi-scenario)
- 一组客观值,每个场景一个。
- ScenNObjBound(仅multi-scenario)
- 一组目标边界,每个场景一个。
- IterCount
- 单纯迭代次数。
- BarIterCount
- 障碍迭代的数量。
- NodeCount
- MIP模型中探索的分支-切割节点数。
- FarkasProof
- 不可行模型的部分不可行证明。请注意,您必须设置InfUnbdInfo参数,以便在优化调用之前提供此信息。
- SolCount
- 存储的解决方案数量(仅针对MIP模型)。
- PoolObjBound
- 未发现的MIP解决方案的目标。
- PoolObjVal
- 仅适用于具有至少一个解决方案的MIP模型。对于单目标模型,这是一个数组,其中包含每个存储解决方案的目标值(从现有解决方案开始)。对于多目标模型,这是一个包含SolCount数组的值,每个数组包含每个多目标的目标值为特定的解决方案。
这里有一个例子SolutionInfo
对象的MIP模型:
{"SolutionInfo": {"Status": 2, "Runtime": "5.8451418876647949e+00", "ObjVal": "3089", "ObjBound": "3089", "ObjBoundC": "3089", "MIPGap": "0", "IntVio": "0", "BoundVio": "0", "ConstrVio": "0", "IterCount": "32", "BarIterCount": 0, "NodeCount": "1", "SolCount": 1, "PoolObjBound": "3089", "PoolObjVal": ["3089"]}}
var数组
的var
组件是一个对象数组(可能为空),其中包含关于标记变量的信息。一些条目将始终存在,而另一些则取决于问题类型或优化的结果。这个组件可能包括以下变量属性:
- VTag(总是)
- 包含变量标记的数组。注意,它被存储为一个数组,但该数组目前只包含一个字符串。
- X(总是)
- 当前解决方案中变量的值。
- Xn
- 所有存储解决方案的值,包括现有解决方案(仅针对MIP)。
- ScenNX
- 对于多个场景,所有场景解决方案的值。
- 钢筋混凝土
- 对于具有双重信息的连续模型,为变量减少的成本。
- VBasis
- 对于解是基本的连续模型,变量的基本状态。
- UnbdRay
- 对于无界模型InfUnbdInfo启用时,与该变量关联的无限射线组件。
以下属性仅包含在JSONSolDetail
大于0:钢筋混凝土
,UnbdRay
,VBasis
,Xn
。
这些物体看起来像:
{“VTag”:“VTag7”,“X”:“1”}{“VTag”:“VTag12”,“X”:“3.6444895037909271 e-02”,“钢筋混凝土”:“0”}{“VTag”:“VTag2747”,“X”:“0”,“Xn”:[“0”,“1”,“1”,“1”,“0”,“1”,“1”," 0 "," 0 "," 0 ")}
若干数组
的若干
Component是一个对象数组(可能为空),其中包含关于标记线性约束的信息。一些条目将始终存在,而另一些则取决于问题类型或优化的结果。这个组件可能包括以下约束属性:
- CTag(总是)
- 包含线性约束标记的数组。注意,它被存储为一个数组,但该数组目前只包含一个字符串。
- 松弛(总是)
- 值为当前解中的松弛变量。
- π
- 对于具有对偶信息的连续模型,对偶值为相应的约束。
- FarkasDual
- 对于不可行的模型InfUnbdInfo启用,与约束相关联的Farkas双组件。
以下属性仅包含在JSONSolDetail
大于0:CBasis
,FarkasDual
,π
,松弛
。
这些物体看起来像:
{“CTag”:“CTag72”,“松弛”:“-1.3877787807814457 e-17”,“π”:“-5.6530866311690423 e-02”}
QConstrs数组
的QConstrs
Component是一个对象数组(可能为空),其中包含关于标记的二次约束的信息。一些条目将始终存在,而另一些则取决于问题类型或优化的结果。该组件可能包括以下二次约束属性:
- QCTag(总是)
- 包含二次约束标记的数组。注意,它被存储为一个数组,但该数组目前只包含一个字符串。
- QCSlack(总是)
- 值为当前解中的松弛变量。
- QCPi
- 对于具有对偶信息的连续模型,对偶值为相应的约束。
以下属性仅包含在JSONSolDetail
大于0:QCPi
,QCSlack
。
JSON解决方案示例
对于连续模型,JSON解决方案字符串看起来像
{" SolutionInfo ":{“状态”:2,“运行时”:“9.9294495582580566 e-01”、“ObjVal”:“5.2045497375374854 e-07”、“BoundVio”:“0”,“ConstrVio”:“1.002 e-07”、“IterCount”:“0”,“BarIterCount”:3},“var”:[{“VTag”:“VTag7”,“X”:“-3.0187172916263982 e-09”,“钢筋混凝土”:“0”},{“VTag”:“VTag1340”,“X”:“-3.0696132844593768 e-09”,“钢筋混凝土”:“0”},{“VTag”:[" VTag2673 "],“X”:“-4.8134359014615295 e-09”,“钢筋混凝土”:“0”},{“VTag”:“VTag4006”,“X”:“-7.1652420015125937 e-02”,“钢筋混凝土”:“0”},{“VTag”:“VTag5339”,“X”:“-1.5815441619302997 e-02”,“钢筋混凝土”:“0”},{“VTag”:“VTag6672”,“X”:“1.4945278866946186 e-02”,“钢筋混凝土”:“0”}],“若干”:[{“CTag”:“CTag7”,“松弛”:“4.85722506 e-17”,“π”:“2.3140310696 e-06”},{“CTag”:“CTag673”,“松弛”:“0”,“π”:“-1.4475853138350041 e-06”},{“CTag”:“CTag1339”,“松弛”:“-2.7758914 e-17”,“π”:“-3.7443785 e-06”},{“CTag”:“CTag2005”,“松弛”:“4.3420177 e-18”,“π”:“-1.0277524 e-06”},{“CTag”:“CTag2671”,“松弛”:“-1.3895245 e-17”,“π”:“8.0012944 e-07”},{“CTag”:“CTag3337”,“松弛”:“6.39465 e-16”、“π”:“-5.3368958 e-06”}]}
对于多目标LP, JSON解决方案字符串可能如下所示
{" SolutionInfo ":{“状态”:2,“运行时”:“2.2838807106018066 e-01”、“ObjNVal”:“10”,“339”,“IterCount”:“112”,“BarIterCount”:0,“NodeCount”:“0”},“var”:[{“VTag”:“VTag7”,“X”:“0”},{“VTag”:“VTag569”,“X”:“0”},{“VTag”:“VTag1131”,“X”:“0”},{“VTag”:“VTag1693”,“X”:“0”},{“VTag”:“VTag2255”,“X”:“0”},{“VTag”:[" VTag2817 "],“X”:“0”},{“VTag”:“VTag3379”,“X”:“0”},{“VTag”:“VTag3941”,“X”:“0”},{“VTag”:“VTag4503”,“X”:“0”},{“VTag”:“VTag5065”,“X”:“1”},{“VTag”:“VTag5627”,“X”:“1”},{“VTag”:“VTag6189”,“X”:“1”}]}
对于常规的MIP问题,JSON解决方案字符串可能如下所示
{"SolutionInfo": {"Status": 2, "Runtime": "2.4669170379638672e-03", "ObjVal": "3124", "ObjBound": "3124", "ObjBoundC": "3124", "MIPGap": "0", "IntVio": "1.958742e-08", "BoundVio": "0", " construcvio ": "1.002e-07", "IterCount": "465", "BarIterCount": 0, "NodeCount": "1", "SolCount": 4, "PoolObjBound": "3124", "PoolObjVal": "(“3124”、“3124”、“3124”、“3124”]},“var”:[{“VTag”:“VTag7”,“X”:“1”,“Xn”:(“1”,“1”,“1”,“1”)},{“VTag”:“VTag466”,“X”:“0”,“Xn”:[" 0 "," 1 "," 1 "," 0 ")},{“VTag”:“VTag925”,“X”:“0”,“Xn”:[" 0 "," 0 "," 0 "," 0 ")},{“VTag”:“VTag1384”,“X”:“0”,“Xn”:[“0”、“0”、“1”,“1”)},{“VTag”:“VTag1843”,“X”:“0”,“Xn”:[" 0 ", " 1 ", " 0 ", " 0 ")},{“VTag”:“VTag2302”,“X”:“0”,“Xn”:[" 0 "," 1 "," 1 "," 0 ")}]}
对于多目标MIP, JSON解决方案字符串可能如下所示
{" SolutionInfo ":{“状态”:2,“运行时”:“3.5403838157653809 e + 00”、“ObjNVal”:“2763”,“704”,“IterCount”:“595”,“BarIterCount”:0,“NodeCount”:“1”,“SolCount”:6“PoolObjVal”:[“2763”,“704”,“2763”,“705”,“2763”,“716”,“2763”,“718”,“2763”,“769”,[“2763”,“1060”]]},“var”:[{“VTag”:“VTag7”,“X”:“1”,“Xn”:(“1”,“1”,“1”,“1”,“1”,“1”)},{“VTag”:“VTag466”,“X”:“0”,“Xn”:[" 0 "," 1 "," 0 "," 0 "," 0 "," 0 ")},{“VTag”:“VTag925”,“X”:“0”,“Xn”:[" 0 "," 0 "," 0 "," 0 "," 1 "," 1 ")},{“VTag”:“VTag1384”,“X”:“0”,“Xn”:[" 0 "," 0 "," 0 "," 0 "," 0 "," 0 ")},{“VTag”:“VTag1843”,“X”:“0”,“Xn”:[" 0 "," 0 "," 1 "," 1 "," 0 "," 0 ")},{“VTag”:[" VTag2302 "],“X”:“0”,“Xn”:[" 0 "," 1 "," 0 "," 0 "," 0 "," 0 ")}]}
对于多场景模型,JSON解决方案字符串可能如下所示
{" SolutionInfo ":{“状态”:2,“运行时”:“3.5403838157653809 e + 00”、“ObjVal”:“2763”,“ObjBound”:“2763”,“ObjBoundC”:“1324”,“IntVio”:“0”,“BoundVio”:“0”,“ConstrVio”:“0”,“ScenNObjVal”:[“2763”、“3413”、“1 e + 100”),“ScenNObjBound”:[“2763”、“3413”、“1 e + 100”),“IterCount”:“595”,“BarIterCount”:0,“NodeCount”:“1”,“SolCount”:3,“PoolObjBound”:“2763”,“PoolObjVal”:[“2763”、“2763”、“2763”]},“var”:[{“VTag”:“VTag7”,“X”:“1”,“ScenNX”:[“1”、“0”、“1 e + 101”),“Xn”:[" 1 "," 0 "," 1 ")},{“VTag”:“VTag466”,“X”:“0”,“ScenNX”:(“1”,“1”,“1 e + 101”),“Xn”:(“1”,“1”,“1”)},{“VTag”:“VTag925”,“X”:“0”,“ScenNX”:[“0”、“0”、“1 e + 101”),“Xn”:[" 0 ", " 0 ", " 0 ")},{“VTag”:“VTag1384”,“X”:“0”,“ScenNX”:[“2”,“1”,“1 e + 101”),“Xn”:(“1”“2”,“0”)},{“VTag”:“VTag1843”,“X”:“0”,“ScenNX”:[“0”、“2”、“1 e + 101”),“Xn”:[“0”、“2”、“1”)},{“VTag”:“VTag2302”,“X”:“0”,“ScenNX”:[“0”,“1”,“1 e + 101”),“Xn”:[" 0 "," 1 "," 0 ")}]}如果方案目标值ScenNObjVal是无限的(GRB_INFINITY = 1 e + 100最小化,-GRB_INFINITY = 1 e + 100对于最大化),那么对于这个场景没有找到可行的解决方案。相应的ScenNX每个变量的值GRB_UNDEFINED = 1 e + 101。此外,如果ScenNObjBound情景的值也是无限的,这意味着情景已经被证明是不可行的。