我想使用python Min-Cost Flow求解器来构建新网络。这意味着我有一个初始完整的图表,顶点是供应商或有需求。使用该算法应该告诉我,根据他们的成本,将使用什么边缘来满足所有需求。与现有问题不同,使用边缘的成本不仅由单位成本描述,而且还具有与该流动无关的该边缘的投资。我一直在研究networkx和or-tools的源代码,但无法弄清楚如何调整这些来实现边缘的投资成本。有人有更好的想法或者可以帮助我调整代码吗?
最诚挚的问候 贾斯特斯
答案 0 :(得分:1)
您无法使用标准图算法(例如:MinCostFlow)解决此问题。 相反,您需要将其表示为混合整数程序。 您可以从这个例子开始:
https://developers.google.com/optimization/assignment/assignment_mip
但你需要稍微调整一下:
您需要两类决策变量:invest_var
(二进制)和flow_var
(连续)。
目标将如下所示:
min: sum(flow_cost[i,j]*flow_var[i,j]) + sum(invest_cost[i,j]*invest_var[i,j])
And you need to add an additional constraint for each link:
flow_var[i,j] <= BIG_INT * invest_var[i,j]
如果flow_var
为0
,则invest_var
约束0
的目的是BIG_INT
。
需求和供应限制将与示例中的类似。
BIG_INT=max(flow_upper_bound[i,j])
是一个常量。您可以将其设置为:
public Template saveTemplate(Template template) throws SQLException {
logger.debug("Saving template details into the db ", template.getTemplateName());
SimpleDateFormat dt = new SimpleDateFormat("yyyyy-mm-dd hh:mm:ss");
Long date = 0L;
try {
date = dt.parse(template.getStartTime()).getTime();
} catch (ParseException e) {
throw new SQLException("Error while processing date " + template.getTemplateName());
}
Long finalDate = date;
其中flow_upper_bound是flow_var变量的上限。
请注意,问题现在变成了一个混合整数线性程序,而不仅仅是一个线性程序。