如何使用.sol文件设置多个MIP开始?
回答亲爱的所有,
根据下面的例子在这个页面(https://support.gurobi.com/hc/en-us/articles/360043834831-How-do-I-use-MIP-starts-),
模型。NumStart = 2
#遍历所有MIP开始
年代的范围(model.NumStart):
#设置StartNumber
model.params。StartNumber =年代
#现在使用start属性设置MIP开始值,例如:
在model.getVars v ():
v。开始= <值>
我试图设置多个MIP开始使用.sol文件检索通过设置SolFiles参数。我只改变了代码,
模型。NumStart = 2
#遍历所有MIP开始
年代的范围(model.NumStart):
#设置StartNumber
model.params。StartNumber =年代
#设置MIP开始值使用.sol文件,例如:
model.update ()
model.read / solution_ % d('解决方案。索尔' % (16))
PS:我16通过设置SolFiles .sol文件。
不幸的是,我得到了以下信息
没有开始MIP中指定的值开始
没有开始MIP中指定的值开始
没有开始MIP中指定的值开始
没有开始MIP中指定的值开始
没有开始MIP中指定的值开始
所以,我想知道如果我能使用.sol文件设置多个MIP开始?以及如何做呢?
-
一种方法使用.sol文件设置多个MIP开始是通过阅读.sol文件和直接使用Start属性,
模型。NumStart = 10
#遍历所有MIP开始
model.update ()
年代的范围(model.NumStart):
#设置StartNumber
model.params。StartNumber =年代打开({}_ {}.sol .format(模型。ModelName s),“r”) f:
f的线:
line.strip ()
(名字,xn) = line.split ()
在model.getVars var ():
如果var.varName = =的名字:
var.Start = np.array (xn)该方法包含两个循环,这可能是低效的。我会非常感激如果有人能给我一个更好的方式。
0 -
嗨Jiongjian,
只是一定要理解你的工作流程:
- 你解决MIP和通过设置\ \ texttt {SolFiles} \)参数你写所有的解决方案在解决过程中出现一个文件。
- 再然后,你解决相同的MIP和希望使用溶胶文件获得第一作为MIP开始运行。
这是正确的吗?
你的代码看起来ok(我猜循环内的行缩进)。注意,您不一定需要\ (\ texttt {model.update ()} \)。你确定两个索尔文件数量15和16存在文件格式是有效的,看到了吗在这里吗?
最好的问候,
马里奥0 -
嗨Jiongjian,
我的答案上面指的是你的第一个消息。应该工作使用的方法,我试过。你能告诉Gurobi输出的更多细节吗?
最好的问候,
马里奥0 -
你好马里奥,
非常感谢你的帮助。实际上,我的完整的模型包含一个quadartic约束,大大地增加了他们的困难我的问题(10000年代第一个可行点)。但幸运的是,在我的问题,我可以先忽略quadartic约束,计算几个可行的解决方案(300年代)的子和完整的模型。然后我使用它们作为完整的MIP开始问题加速计算过程。
至于解决方案编号和格式,我只是使用参数。PoolSolutions控制解决方案的数量我需要和使用以下代码改编自你的网站恢复解决方案,
全球之声= LCB.getVars ()
= LCB名字。getAttr (VarName,全球之声)
因为我在范围(LCB.SolCount):
model.params。SolutionNumber =我
xn =模型。getAttr (Xn,全球之声)
行= [{}{}。格式(v1、v2) v1、v2 zip(名字,xn))
打开({}_ {}.sol .format(模型。ModelName我),f ' w '):
f.write (" \ n " . join()行)但是,通过这两个阶段的策略,完整的解决方案模型很大程度取决于MIP开始。这是否意味着我的模型有几个最优点和MIP解算器是遭遇到了其中一个?手机万博登录
另一个问题是如果我用下面的代码模型约束e_r_pw = -√(3) * r_pw,
r_min = 0
r_max = 1
大小= 1 e - 3
r_pw = np。(r_min r_max,大小不等)
e_r_pw = np.exp (-np.sqrt (3) * r_pw)模型。addGenConstrPWL (r_xX_list[我],e_xX_list[我],r_pw, e_r_pw)
什么类型的SOS约束将被用来确定哪些块使用r_pw线吗?我是SOS约束或SOS II约束吗?我猜这是SOS二世,因为通过这种方式,我们可以计算任意点在我们选择。
愿一切都好!
Jiongjian蔡
0 -
嗨Jiongjian,
关于你的MIP开始的问题:每一个参数的变化或MIP开始对解算器运行时可能会有很大的影响由于presolving不同的解决路径,和等。很难说会发生什么在你的情况下,但是你可以把解算器输出来获得更多的见解。手机万博登录
关于你PWL约束:是的,Gurobi实现分段线性约束与SOS2系统(和可能利用这些知识在presolving和分支),即,每个点定义的函数是凸组合的当前线段的两个端点。请注意,你可能会获得一个更好的近似函数通过函数约束,明白了在这里。
最好的问候,
马里奥0
请登录留下你的评论。
评论
5个评论