[英]Modified assignment problem (more tasks than agents)
假設 N 是代理的數量,M 是任務的數量。 任務數大於代理數,即M>N。每個代理必須至少有一個任務。 給定成本矩形矩陣,找到最優解(即將每個任務分配給一個代理,這樣每個代理至少有一個任務並且成本最小化)。
什么有效的算法可以解決這個問題?
我試圖通過記憶實現朴素的遞歸算法,但是對於超過 1000 的 M 值來說它太慢了。我知道匈牙利方法,但我無法在我的約束下使用該算法(每個代理必須至少有一項任務)。
這可以表述為最小成本最大流量問題。
從水槽開始。 它沿着成本 0 和流量 1 的通道連接到任務。每個任務沿着矩陣和流量 1 的成本通道連接到代理。每個代理連接到具有流量 1 和成本 0 的通道的接收器。代理也是連接到具有流量MN
和高成本通道的池。 並且池連接到具有流量MN
的通道的水槽並且成本同樣高。
具有最小成本的最大流量將從源到任務的流量為M
然后它將有一個從源到代理的M
流。 N
的流量將把廉價而狹窄的管道從代理直接帶到水槽。 而剩下的MN
會走昂貴的路線到 pool,再從 pool 到 sink。 因為從代理到池再返回的流量是昂貴的,所以流向池的流量最少,沒有從池返回到代理的流量。
因此,最大流量將是您問題的答案,每個代理至少從一項任務中獲得流量。
下面是一個簡單的優化 model:
# sets
i : tasks
j : agents
# model
min sum((i,j), c[i,j]*x[i,j])
sum(j, x[i,j]) = 1 ∀i "assign each task to an agent"
sum(i, x[i,j]) >= 1 ∀j "each agent needs to do at least one task"
x[i,j] ∈ {0,1}
這些模型往往很容易解決。
這是一個小測試腳本:
import cvxpy as cp
import numpy as np
NTASK = 1000
NAGENT = 200
# random data
np.random.seed(123)
c = np.random.uniform(1,100,(NTASK,NAGENT))
# model
x = cp.Variable((NTASK,NAGENT),boolean=True)
prob = cp.Problem(cp.Minimize(cp.sum(cp.multiply(c,x))),
[cp.sum(x,axis=1) == 1,
cp.sum(x,axis=0) >= 1])
# solve and print results
res = prob.solve(verbose=True)
print(prob.status)
print(prob.value)
# print(x.value)
如果您願意,可以通過將 x 變量放寬為x[i,j] ∈ [0,1]
來將此 model 作為 LP 求解。
這也可以建模為一個簡單的最小成本流網絡問題。
this.network 的數據將是:
Node Supply Arc Cost Capacity
Task nodes 1 task→worker c[i,j] 1
Worker nodes -1 worker→sink 0 n-m
Sink node −(n−m)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.