Ik heb (in Matlab) een vector / array van 32 integers tussen de 1-100, bijvoorbeeld:
2, 3, 5, 8, 9, 15, ..., 89, 93, 97
Uit deze 32 getallen zou ik nu graag een subset van 20 getallen willen kiezen. Bijvoorbeeld:
2, 5, 9, ..., 97
Deze 20 getallen gebruik ik als input voor een algoritme dat een waarde uitspuugt, en die waarde wil ik optimalizeren.
Met Matlab kan ik in theorie alle mogelijke combinaties van 20 getallen berekenen via "nchoosek", maar dit zijn ongeveer 225 miljoen mogelijke combinaties: 32! / ( (32-20)! * 20!) = 225,792,840. Matlab kan me niet eens alle combinaties laten zien, laat staan dat ik ze allemaal zou kunnen proberen.
Wat ik nu wil doen is even "in gedachten" het lijstje met alle mogelijke combinaties genereren. Ook al is dit praktisch onmogelijk, je zou in gedachten het lijstje kunnen maken op een bepaalde volgorde (bijv de volgorde die Matlab via nchoosek aanhoudt). Nu wil ik een van deze combinaties uit deze lijst kiezen, met een bepaalde index (bijvoorbeeld in het midden, index 112896420. Op deze combinatie kan ik nu mijn algoritme loslaten, en daarna kan ik een nieuwe combinatie in de buurt van de vorige kiezen, bijvoorbeeld index 112896425 (5 combinaties verderop). En zo verder. Het idee van het "in de buurt kiezen" is dat ik niet zomaar combinaties at random ga kiezen (dit zou via 'randperm' kunnen denk ik), maar ik wil in de buurt van de optimale oplossing blijven en controle hebben over welke combinatie ik gebruik.
Een voorbeeldje met meer praktische waarden: stel ik heb 5 getallen (1 - 5) waaruit ik er 2 wil kiezen. De 10 mogelijke combinaties zijn dan "nchoosek(1:5,2)":
1: [1 2]
2: [1 3]
3: [1 4]
4: [1 5]
5: [2 3]
6: [2 4]
7: [2 5]
8: [3 4]
9: [3 5]
10: [4 5]
Nu kies ik "combinatie 5": [2 3]. Daarna wil ik een combinatie in de buurt pakken, bijv combinatie 7: [2 5], of combinatie 4: [1 5]. Het punt is: ik wil niet een random combinatie kiezen, maar ik wil controle hebben over welke combinatie. Als ik dus 8 keer achter elkaar combinatie 5 kies, dan krijg ik 8 keer dezelfde: [2 3], en niet 8 keer iets anders.
Is dit uberhaupt wiskundig mogelijk zonder alle mogelijke combinaties te genereren (wat dus niet praktisch is)? Zo ja, is er een manier waarop dit eenvoudig te implementeren is, of is er al een implementatie die ik niet kan vinden?
Ik gebruik momenteel Matlab maar een algemeen algoritme zou wellicht ook te implementeren zijn als het niet al te lastig is.
2, 3, 5, 8, 9, 15, ..., 89, 93, 97
Uit deze 32 getallen zou ik nu graag een subset van 20 getallen willen kiezen. Bijvoorbeeld:
2, 5, 9, ..., 97
Deze 20 getallen gebruik ik als input voor een algoritme dat een waarde uitspuugt, en die waarde wil ik optimalizeren.
Met Matlab kan ik in theorie alle mogelijke combinaties van 20 getallen berekenen via "nchoosek", maar dit zijn ongeveer 225 miljoen mogelijke combinaties: 32! / ( (32-20)! * 20!) = 225,792,840. Matlab kan me niet eens alle combinaties laten zien, laat staan dat ik ze allemaal zou kunnen proberen.
Wat ik nu wil doen is even "in gedachten" het lijstje met alle mogelijke combinaties genereren. Ook al is dit praktisch onmogelijk, je zou in gedachten het lijstje kunnen maken op een bepaalde volgorde (bijv de volgorde die Matlab via nchoosek aanhoudt). Nu wil ik een van deze combinaties uit deze lijst kiezen, met een bepaalde index (bijvoorbeeld in het midden, index 112896420. Op deze combinatie kan ik nu mijn algoritme loslaten, en daarna kan ik een nieuwe combinatie in de buurt van de vorige kiezen, bijvoorbeeld index 112896425 (5 combinaties verderop). En zo verder. Het idee van het "in de buurt kiezen" is dat ik niet zomaar combinaties at random ga kiezen (dit zou via 'randperm' kunnen denk ik), maar ik wil in de buurt van de optimale oplossing blijven en controle hebben over welke combinatie ik gebruik.
Een voorbeeldje met meer praktische waarden: stel ik heb 5 getallen (1 - 5) waaruit ik er 2 wil kiezen. De 10 mogelijke combinaties zijn dan "nchoosek(1:5,2)":
1: [1 2]
2: [1 3]
3: [1 4]
4: [1 5]
5: [2 3]
6: [2 4]
7: [2 5]
8: [3 4]
9: [3 5]
10: [4 5]
Nu kies ik "combinatie 5": [2 3]. Daarna wil ik een combinatie in de buurt pakken, bijv combinatie 7: [2 5], of combinatie 4: [1 5]. Het punt is: ik wil niet een random combinatie kiezen, maar ik wil controle hebben over welke combinatie. Als ik dus 8 keer achter elkaar combinatie 5 kies, dan krijg ik 8 keer dezelfde: [2 3], en niet 8 keer iets anders.
Is dit uberhaupt wiskundig mogelijk zonder alle mogelijke combinaties te genereren (wat dus niet praktisch is)? Zo ja, is er een manier waarop dit eenvoudig te implementeren is, of is er al een implementatie die ik niet kan vinden?
Ik gebruik momenteel Matlab maar een algemeen algoritme zou wellicht ook te implementeren zijn als het niet al te lastig is.