JSON解决方案格式

JSON (JavaScript对象表示法)是一种轻量级、文本、语言的数据交换格式。这是来自JavaScript,但许多现代编程语言包括代码生成和解析json格式的数据。

Gurobi JSON解决方案格式是简单和标准的方法来捕捉并分享优化结果。它符合rfc - 8259标准。JSON的解决方案可以写入一个文件或捕捉到一个字符串。

JSON方法捕获各种Gurobi属性的值与解决方案相关的模型。一些相关模型整体,单个变量,和一些个人的限制。解决方案一个JSON字符串的具体内容取决于几个因素:

  • 模型解决的类型(线性、二次整数,多目标,等等)。一些解决方案信息是不用于某些问题类型(例如,双变量值MIP模型)。
  • 标记元素的集合模型。默认情况下,JSON将只包含模型的属性和变量数据的解决方案。用户可以标记变量(使用VTag(使用属性),线性约束CTag(使用属性)和二次约束QCTag属性)来请求数据更有选择性的基础上。如果使用任何这样的属性,只有标记元素将在JSON解决方案信息的解决方案。
  • JSONSolDetail参数,控制多少细节包含在JSON的解决方案。
  • 参数设置等InfUnbdInfoQCPDual,使优化过程产生更多的解决方案信息。

JSON的解决方案并不是直接由人类通常被理解。相反,您通常喂成一个JSON解析器,它提供了从字符串中提取所需的信息的工具。JSON是一种广泛使用的格式,几乎所有的现代程序语言都有图书馆,帮助解析JSON字符串和文件。如果你决心直接检查字符串,JSON解析器通常还包括精细打印工具,使它更容易。

基本结构

解决方案一个JSON字符串包含一个名为组件的集合。在其最简单的形式,它可能看起来像下面的:

{" SolutionInfo ":{“状态”:3,“运行时”:3.4289908409118652 e-01,“BoundVio”: 0,“ConstrVio”: 0,“IterCount”: 0,“BarIterCount”: 0}}
一个JSON解析器使它相对容易从这个字符串中提取的各种组件。在Python中,例如,你将能够检索通过访问的优化状态结果(“SolutionInfo”)(“状态”)在解析。

之前讨论的具体信息,可以在这种格式,让我们先谈谈数据是如何表示的。每个数据项的类型的属性类型。例如,状态是一个整数属性,所以相应的值被存储为一个整数。运行时是一个双重属性,表示为一个字符串,字符串总是捕捉准确的,双精度(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
探索branch-and-cut节点数量MIP模型。
FarkasProof
的一部分,不可能实行证书不可行模式。注意,您必须设置InfUnbdInfo参数优化前要求这些信息是可用的。
SolCount
数量的存储解决方案(只对MIP模型)。
PoolObjBound
未被发现的MIP的目标解决方案。
PoolObjVal
只对MIP模型至少有一个解决方案。简略模型,这是一个数组,其中包含的客观价值每个存储解决方案(从现任)。对于多目标模型,这是一个数组,其中包含SolCount值的数组,每个数组包含每个多目标的客观价值的特解。

这里有一个例子SolutionInfo对象MIP模型:

{" SolutionInfo ":{“状态”:2,“运行时”:5.8451418876647949 e + 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 CTag,或QCTag)已经被建立,所有的变量都包括,连同他们的名字。否则只有现代VTag将包含一组变量,和这个标签将对象的一部分。一些数据将永远存在,而其他数据将取决于问题类型或优化的结果。这个组件可能包括以下变量属性:

VarName
在模型中变量的名字。只有在没有设置标签。
VTag
数组包含变量标签。注意,这是存储为一个数组,但目前只会包含一个字符串数组。
X(总是)
变量的值对应于VarName或VTag在当前的解决方案。注意对象的零变量值将被省略了var除非数组JSONSolDetail大于零。
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)}

若干数组

若干组件是一个数组对象(可能为空)包含的信息标记线性约束。一些条目将永远存在,而其他人则依赖于问题类型或优化的结果。这个组件可能包括以下约束属性:

CTag(总是)
数组包含线性约束的标签。注意,这是存储为一个数组,但目前只会包含一个字符串数组。
松弛(总是)
松弛变量的值在当前的解决方案。
π
连续模型和双重信息,双值对应的约束。
FarkasDual
为不可行模型InfUnbdInfo启用时,法卡斯双组件与约束相关。
这对MIP模型组件将永远是空的。

只有包含以下属性JSONSolDetail大于0:CBasis,FarkasDual,π,松弛

这些对象可能看起来像:

{“CTag”:“CTag72”,“松弛”:-1.3877787807814457 e-17,“π”:-5.6530866311690423 e-02}

QConstrs数组

QConstrs组件是一个数组对象(可能为空)包含的信息标记二次约束。一些条目将永远存在,而其他人则依赖于问题类型或优化的结果。这个组件可能包括以下二次约束属性:

QCTag(总是)
数组包含二次约束的标签。注意,这是存储为一个数组,但目前只会包含一个字符串数组。
QCSlack(总是)
松弛变量的值在当前的解决方案。
QCPi
连续模型和双重信息,双值对应的约束。
这对MIP模型组件将永远是空的。

只有包含以下属性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”: [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 ":{“状态”:2,“运行时”:2.4669170379638672 e 03,“ObjVal”: 3124年,“ObjBound”: 3124年,“ObjBoundC”: 3124年,“MIPGap”: 0,“IntVio”: 1.958742 e-08,“BoundVio”: 0,“ConstrVio”: 1.002 e-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]}]}

multi-scenario模型,解决方案的JSON字符串可能看起来像

{" SolutionInfo ":{“状态”:2,“运行时”:3.5403838157653809 e + 00,“ObjVal”: 2763年,“ObjBound”: 2763年,“ObjBoundC”: 1324年,“IntVio”: 0,“BoundVio”: 0,“ConstrVio”: 0,“ScenNObjVal”: [e + 2763、3413、100],“ScenNObjBound”: [e + 2763、3413、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”: [2 1 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值的场景也是无限的,这意味着该场景已经被证明是不可行的。