问题描述

给定g个group,n个id,n<=g.我们将为每个group分配一个id(各个group的id不同)。但是每个group分配id需要付出不同的代价cost,需要求解最优的id分配方案,使得整体cost之和最小。

例子

例如以下4个group,三个id,value矩阵A

value id1 id2 id3
H1 4 3 0
H2 1 0 0
H3 2 0 2
H4 3 1 0

id_i分配给H_j的代价\(changing cost[i, j]=\sum(A[j,:])-A[j,i]\)。
例如,如果给H1指定id1,则value=4被保留,但是需要付出changing cost为3.

我们需要为H1-H4分别指定一个id1-id3,id4(新建的id),目标是是的总体的changing cost最小。
例子中最优的分配结果是:
H1 <- id2,
H2 <- New ID,
H3 <- id3,
H4 <- id1,
对应的changing cost=8 (4 + 1 + 2 + 1)。

Min-cost Max flow算法

Use min-cost max flow here
Connect source to all ids with capacity 1, connect each id to each h with capacity 1 and cost= -a[id[i], h[j]] (as you need to find maximums actually), and then connect all hs with sink with capacity 1.
After applying min-cost max flow, you will have flow in those (i, j) where you should assign i-th id to j-th h. New ids for other hs.

因为capacity=1,算法最终结果f[i,j]只可能取值0/1。所以,如果f[i,j]=1,则id_i被分配给h_j.


Here is a possible solution of the problem with some help of [min cost max flow algorithm:
http://web.mit.edu/~ecprice/acm/acm08/MinCostMaxFlow.java https://en.wikipedia.org/wiki/Minimum-cost_flow_problem.

The basic idea is to translate consumer id, group id to vertex of graph, translate our constrains to constrains of MinCostMaxFlow problem.

As for POC, I used the source code from website (web.mit.edu), did some change and checked in the algorithm to trunk.
I added unit test RuleBasedOptimizerTest.test6() to test the 66x 4 case, which runs successfully in milliseconds.
Also, test was done on the data which caused time out before, and this time it is fast.

Steps of the algorithm:

Create the flow network:

  1. Introduce a source vertex, a sink vertex;
  2. Each consumerid is a vertex, each groupid is a vertex;
  3. Connect source to each consumerId, each edge has capacity 1;
  4. Connect each consumerId to groupId, each edge has capacity 1;
  5. Connect each groupId to sink, each edge has capacity 1;
  6. The cost of a(u, v) is from the cost table, but we need to take -1 x frequency.

Calculate max flow of the network, and get the flow matrix.

  • If there is flow from cid_i to gid_k then we assign the cid_i to the gid_k;
  • If there is no flow to gid_k, then we assign a new id to gid_k.

Algorithm complex

is O(min(|V|^2 * totflow, |V|^3 * totcost)), where |V|=(#groupid + #consumerId + 2).

min cost max flow算法示例的更多相关文章

  1. LeetCode算法题-Min Cost Climbing Stairs(Java实现)

    这是悦乐书的第307次更新,第327篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第176题(顺位题号是746).在楼梯上,第i步有一些非负成本成本[i]分配(0索引). ...

  2. LeetCode 746. 使用最小花费爬楼梯(Min Cost Climbing Stairs) 11

    746. 使用最小花费爬楼梯 746. Min Cost Climbing Stairs 题目描述 数组的每个索引做为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i].(索引从 0 ...

  3. C#LeetCode刷题之#746-使用最小花费爬楼梯( Min Cost Climbing Stairs)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4016 访问. 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个 ...

  4. HackerRank "Training the army" - Max Flow

    First problem to learn Max Flow. Ford-Fulkerson is a group of algorithms - Dinic is one of it.It is ...

  5. [Swift]LeetCode746. 使用最小花费爬楼梯 | Min Cost Climbing Stairs

    On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay ...

  6. backpropagation算法示例

    backpropagation算法示例 下面举个例子,假设在某个mini-batch的有样本X和标签Y,其中\(X\in R^{m\times 2}, Y\in R^{m\times 1}\),现在有 ...

  7. BZOJ4390: [Usaco2015 dec]Max Flow

    BZOJ4390: [Usaco2015 dec]Max Flow Description Farmer John has installed a new system of N−1 pipes to ...

  8. Leetcode之动态规划(DP)专题-746. 使用最小花费爬楼梯(Min Cost Climbing Stairs)

    Leetcode之动态规划(DP)专题-746. 使用最小花费爬楼梯(Min Cost Climbing Stairs) 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost ...

  9. 详解 Flink DataStream中min(),minBy(),max(),max()之间的区别

    解释 官方文档中: The difference between min and minBy is that min returns the minimum value, whereas minBy ...

随机推荐

  1. 采用RedisLive监控Redis服务——安装手册

    #1.gcc编译环境确认 .tgz cd Python- ./configure /bin/python2. /usr/bin/python #运行python查看版本 python -V #进行更改 ...

  2. Java Http接收中文乱码解决

    当时url传递时,可用 byte[] bytes=reqdata_s.getBytes("ISO-8859-1"); String name=new String(bytes,&q ...

  3. Javascript的一个怪现象

    javascript有一个怪现象,就是减法也会导致小数位数问题,是一个麻烦的问题,比如. <html><script> var a=10,b=20.1; alert( a - ...

  4. ZVulDrill渗透环境搭建及部分题目writeup

    一  实验环境 0x01  ZvulDirll 0x02  下载地址https://github.com/redBu1l/ZVulDrill 二  配置安装 0x01  在你网站的根目录下创建一个Vu ...

  5. 1.preparation

    1)Evarobot 安装 http://wiki.ros.org/Robots/evarobot/Tutorials/indigo/Evarobot%20Installation 2)PC 安装 a ...

  6. maven打包证(支付)书问题

    要将证书文件后缀添加到resource文件夹内范围,添加打包文件后缀(include) 添加maven配置: <resources> <resource> <direct ...

  7. python学习 day4 (3月5日)---列表

    列表: 容器性数据 有序  可更改 大量数据 一.增 1.追加    append(objcet) 2.索引增加   Insert(index,元素) 3.迭代追加   extend(object) ...

  8. MZOJ 1345 hero

    一道宽搜模版题,可写错了两个地方的我只得了56(掩面痛哭) http://10.37.2.111/problem.php?id=1345 先看看正确的 #include <bits/stdc++ ...

  9. PL/SQL Developer 导出csv文件,用excel打开中文显示乱码

      用PL/SQL Developer的导出csv功能把sql语句的查询结果导出到一个csv文件.这个sql查询的结果里面有中文,最后用execel打开的时候发现中文全部是乱码. 方法 1 导出csv ...

  10. Docker Compose demo 使用

    1.docker compose 安装 curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker- ...