[英]How to add constrain to pick stories (or tasks) in a solution from large list which sum up to given Team capacity using Cplex Python?
我正在使用 IBM cplex Python API 並解決問題以從數千個故事列表中查找故事,這些故事總結為不同沖刺的給定團隊容量(此處為 2 周沖刺)。 每個故事都分配了故事點和屬於特定團隊。 有一些約束,如 end_before_start(一些故事應該在其他一些故事之前實施)和 workUsage = 給定團隊容量(需要 select 故事,其總和與給定容量完全一致)。
但這里的問題是,如果我將所有區間變量(對於故事)設為可選,並讓 model 決定選擇哪些故事,那么它不會為任何故事提供解決方案。 當我將所有故事都設為非可選時,Model 會失敗,我相信這是因為 model 認為所有故事都是強制性的,需要適合所有故事。 所以請讓我知道如何做到這一點的任何想法或方法? 這是我到目前為止所嘗試的。
# Create dictionary of interval variables (for Stories)
dictIntrvalVars = {}
for idx, row in dfAnalyzerOrg.iterrows():
isOptional = row['Stories'] not in dfAnalyzer['Stories'].values
dictIntrvalVars[row['Stories']] = mdl0.interval_var(name = row['Stories'], size =
int(row['Story Points']), optional=isOptional)
# Constrain capacity of resources
#Making team wise dictionary list of interval vars
dictTeamWise = {team:[] for team in dfTeamCapacity['Team'].values}
print(dictTeamWise)
for itm in dictIntrvalVars.items():
dictTeamWise[dfAnalyzerOrg.loc[dfAnalyzerOrg['Stories']==itm[0], 'Team'].iloc[0]].append(itm)
NB_SPRINTS = 2
SPRINT_INTERVAL = 20
for t, lstTeam in dictTeamWise.items():
sCapacity = 0
sCapacity = sum(step_at(SPRINT_INTERVAL * s, dfTeamCapacity.loc[dfTeamCapacity['Team'] == t,
s+1].iloc[0]) for s in range(NB_SPRINTS))
sCapacity -= sum(step_at_start(tpl[1], int(dfAnalyzerOrg.loc[dfAnalyzerOrg['Stories']==tpl[0], 'Story Points'].iloc[0]))
for tpl in lstTeam)
mdl0.add(sCapacity.equals(0))
我將 model 作為二進制變量的標准賦值問題的變體:
i : tasks
j : teams
max sum((i,j), points[i,j]*x[i,j])
sum(i, x[i,j]*usage[i]) <= capacity[j] ∀j
sum(j, x[i,j]) <= 1 ∀i (in case a task can only be done by one single team)
x[i,j] ∈ {0,1}
(我在這里發明了一些東西,因為我不明白你的代碼)。 更接近數學將有助於使事情更容易理解和更容易記錄。 此外,現在可以輕松地將其轉錄為任何語言和建模工具。
添加優先約束很容易:
x[i2,j] <= x[i1,j] ∀j
意味着 i2 只能在 i1 也被選擇時使用。
關於分配問題的更多信息可以在幾乎所有關於線性優化的書中找到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.