终止优化从c#库通过用户输入ctrl - C
回答你好,
我目前开发c#的。net类库(. dll)中引用另一个软件(CAD软件)。这个图书馆我打电话Gurobi通过c# API。
我可以轻松地构建一个模型,优化运行,并提取结果。然而,为了方便,我想实现的可能性中断/终止优化,当按下键盘上的一个组合,例如ctrl - c。
我知道ctrl - c终止Gurobi优化一个控制台应用程序,但在一个独立的. dll似乎更加困难,不是运行在控制台。在这种情况下,似乎不转发给Gurobi ctrl - c。
我的问题是,我如何设置Gurobi在c#中,这样它对ctrl - C(或其他任何组合键,实际上我不关心)和终止优化。如果可能的话,这将可能不回调。
。
(我看过这个相关的c++的例子但我不能找到一种方法来为c#实现工作流
https://support.gurobi.com/hc/en-us/articles/360054225092?input_string=terminate +优化+在+ c % 23 +应用程序)
谢谢你的帮助。
亲切的问候,
Jan粗糙的
0
-
嗨,简,
这样做的关键是终止的优化处理程序,和“警报”的主线程优化已经手动中断。
你可以试着这样不使用回调函数:
使用系统;
使用Gurobi;
公共静态类的全局变量
{
公共静态双objval = 0.0;
公共静态GRBEnv env = new GRBEnv ();
公共静态GRBModel模型;
公共静态bool manuallyInterrupted = false;
}
类mipexample_cs
{
公共静态void Main (string [] args)
{
控制台。新ConsoleCancelEventHandler CancelKeyPress + = (Console_CancelKeyPress);
尝试{
全局变量。= new GRBModel(全局模型。env,“yourmodelfile.mps”);
如果(Globals.model。IsMIP = = 0) {
控制台。WriteLine(“不是MIP模型”);
返回;
}
Globals.model.Optimize ();
如果(Globals.manuallyInterrupted)
{
bool又叫了一声= true;
/ *查询解决状态,直到可用并处理异常时不可用* /
而(又叫了一声)
{
试一试
{
如果(Globals.model。状态== GRB.Status.INTERRUPTED)
{
/ *查询解决数据手机万博登录一旦解决中断* /
全局变量。objval = Globals.model.ObjVal;
}
控制台。WriteLine(“客观= " + Globals.objval);
又叫了一声= false;
}
抓住(GRBException f)
{
/ *错误输出是可选的* /
控制台。WriteLine (" Gurobi错误代码= " + f.ErrorCode);
Console.WriteLine (f.Message);
}
}
}
int optimstatus = Globals.model.Status;
双objvalint = 0;
如果(optimstatus = = GRB.Status.OPTIMAL) {
objvalint = Globals.model.ObjVal;
控制台。WriteLine(“优化目的:”+ objvalint);
其他}{
控制台。WriteLine(“优化是停止状态= "
+ optimstatus);
返回;
}
Globals.model.Dispose ();
Globals.env.Dispose ();
}捕捉(GRBException e) {
控制台。WriteLine(错误代码:“+ e。ErrorCode +”。“+ e.Message);
}
返回;
}
保护静态孔隙Console_CancelKeyPress(对象发送方,ConsoleCancelEventArgs e)
{
控制台。WriteLine(“程序手动终止”);
全局变量。manuallyInterrupted = true;
Globals.model.Terminate ();
e。取消= true;
}
}0
请登录留下你的评论。
评论
1评论