最低成本流量,边缘投资成本

时间:2018-05-12 03:49:14

标签: optimization graph networkx or-tools cost-based-optimizer

我想使用python Min-Cost Flow求解器来构建新网络。这意味着我有一个初始完整的图表,顶点是供应商或有需求。使用该算法应该告诉我,根据他们的成本,将使用什么边缘来满足所有需求。与现有问题不同,使用边缘的成本不仅由单位成本描述,而且还具有与该流动无关的该边缘的投资。我一直在研究networkx和or-tools的源代码,但无法弄清楚如何调整这些来实现边缘的投资成本。有人有更好的想法或者可以帮助我调整代码吗?

最诚挚的问候 贾斯特斯

1 个答案:

答案 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_var0,则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变量的上限。

请注意,问题现在变成了一个混合整数线性程序,而不仅仅是一个线性程序。