正如在評論(最大覆蓋問題)中已經指出的那樣,您有一個NP-hart問題。幸運的是,matlab爲整數線性編程提供解算器。
所以我們儘量減少問題的形式:
min f*x subject to Ax<=b , 0<=x
有N套,我們可以編碼設置爲0和1組成的向量。例如,(1,1,1,0,0,...)
將代表{1,2,3}
和(0,0,1,1,0,0...)
-{3,4}
。
A
的每列表示一組。 A(i,j)=1
意味着i
第012個元素位於第j
個集合中,A(i,j)=0
意味着第i
個元素不在第j
個集合中。
現在,x
代表我們選擇集:如果x_j=1
超過設定j
選擇,如果x_j=0
- 比沒有選擇!
由於每一個元素必須是最多的一組,我們選擇b=(1, 1, 1, ..., 1)
:如果我們把它含有i
個元素兩套,比(Ax)
的i
個元素是至少2
剩下的唯一問題是什麼f
?我們嘗試最大化聯合中的元素數量,因此我們選擇f_j=-|set_j|
(減去由於最小<→最大轉換),其中|set_j|
-第j
個集合中的元素數目。
把它全部在MATLAB我們得到:
f=-sum(A)
xopt=intlinprog(f.',1:n,A,ones(m,1),[],[],zeros(n,1),ones(n,1))
f.'
- 成本函數列
1:n
- 的x
所有n
元素都是整數
A
- 編碼n
套
ones(m,1)
- b=(1,1,1...)
有m=100
元素
[],[]
- 沒有形式的約束Aeq*x=beq
zeros(n,1), 0<=x
必須持有
ones(n,1), x<=1
從別人的約束已經遵循,但也許這將有助於求解一點點
燦您請首先發布您自己的嘗試是要解決什麼問題?那麼我們可以幫助您解決具體的問題。 – EkcenierK
你見過最大覆蓋率問題嗎?你的問題聽起來類似於https://en.wikipedia.org/wiki/Maximum_coverage_problem –