簡體   English   中英

修改后的分配問題(任務多於代理)

[英]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。 因為從代理到池再返回的流量是昂貴的,所以流向池的流量最少,沒有從池返回到代理的流量。

因此,最大流量將是您問題的答案,每個代理至少從一項任務中獲得流量。

LP/MIP Model

下面是一個簡單的優化 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 求解。

網絡 Model

這也可以建模為一個簡單的最小成本流網絡問題。

在此處輸入圖像描述

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM