Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 离散优化算法_Algorithm_Matlab_Mathematical Optimization - Fatal编程技术网

Algorithm 离散优化算法

Algorithm 离散优化算法,algorithm,matlab,mathematical-optimization,Algorithm,Matlab,Mathematical Optimization,我正试图确定解决我的问题的最佳方法,如下所示: 我有一组对象(大约3k-5k),我想将其唯一分配给大约10个组(每个对象1个组)。 每个对象都有一组等级,对应于它在每个组中的匹配程度。 每个组都有其可以管理的对象的容量(约束)。 我的目标是最大限度地提高我的作业成绩 例如,假设我有3个对象(o1,o2,o3)和2个带帽的组(g1,g2)。每个对象有一个对象。 现在假设等级为: o1:g1=11,g2=8 o2:g1=10,g2=5 o3:g1=5,g2=6 在这种情况下,为了获得最佳结果,g1应

我正试图确定解决我的问题的最佳方法,如下所示:

我有一组对象(大约3k-5k),我想将其唯一分配给大约10个组(每个对象1个组)。 每个对象都有一组等级,对应于它在每个组中的匹配程度。 每个组都有其可以管理的对象的容量(约束)。 我的目标是最大限度地提高我的作业成绩

例如,假设我有3个对象(o1,o2,o3)和2个带帽的组(g1,g2)。每个对象有一个对象。 现在假设等级为:

o1:g1=11,g2=8

o2:g1=10,g2=5

o3:g1=5,g2=6

在这种情况下,为了获得最佳结果,g1应接收o2,g2应接收o1,得出10+8=18分的总数

请注意,对象的数量可能超过配额的总和(例如,将o3作为“剩菜”)或不足配额


我应该如何解决这个问题(旅行推销员,一种有重量的背包等)?在普通电脑上使用蛮力强制执行需要多长时间?是否有任何标准工具(如Matlab中的linprog函数)支持此类问题?

可以使用最小成本流算法解决。 图表可以按以下方式显示:

它应该是两部分的。左侧部分表示对象(每个对象一个顶点)。右侧部分表示组(每组一个顶点)。从左侧的每个顶点到右侧的每个顶点都有一条边,该对的
容量
=1和
成本
=-等级。还有一条从源顶点到左侧每个顶点的边,其
容量
=1和
成本
=0;还有一条从右侧每个顶点到汇顶点的边(汇和源是两个附加顶点),其
容量
=此组的约束和
成本
=0

答案是
——从源到汇的最便宜的流量成本


可以用时间复杂度(使用带势的Dijkstra算法)来实现它(
N
是对象的数量,
M
是组的数量)。

这可以用整数程序来解决。如果对象i被分配给组j,则二进制变量x{ij}状态。目标最大化\sum{i,j}s{ij}x{ij},其中s{ij}是与将i分配给j相关的分数,x{ij}是是否将i分配给j。您有两种类型的约束:

  • \求和
    # Score matrix
    S <- matrix(c(11, 10, 5, 8, 5, 6), nrow=3)
    # Capacity vector
    cvec <- c(1, 1)
    
    # Helper function to construct constraint matrices
    unit.vec <- function(pos, n) {
      ret <- rep(0, n)
      ret[pos] <- 1
      ret
    }
    
    # Capacity constraints
    cap <- t(sapply(1:ncol(S), function(j) rep(unit.vec(j, ncol(S)), nrow(S))))
    
    # Object assignment constraints
    obj <- t(sapply(1:nrow(S), function(i) rep(unit.vec(i, nrow(S)), each=ncol(S))))
    
    # Solve the LP
    res <- lp(direction="max",
              objective.in=as.vector(t(S)),
              const.mat=rbind(cap, obj),
              const.dir="<=",
              const.rhs=c(cvec, rep(1, nrow(S))),
              all.bin=TRUE)
    
    # Grab assignments and objective
    sln <- t(matrix(res$solution, nrow=ncol(S)))
    apply(sln, 1, function(x) ifelse(sum(x) > 0.999, which(x == 1), NA))
    # [1]  2  1 NA
    res$objval
    # [1] 18