Beste mede-tweakers!
Ik zit met het volgende probleem:
(ik heb het originele probleem even omgeschreven naar iets dat (wellicht) interessanter is om hier te bespreken, maar de strekking blijft hetzelfde)
Stel ik heb een lijst van computers in een (gesloten) netwerk en ik weet van elke computer hoe lang het duurt tot deze besmet is met een virus (gemeten vanaf het tijdstip dat het virus voor het eerst op het netwerk aanwezig was (de index-case)). Deze lijst is tot stand gekomen d.m.v. simulaties van zo'n computer netwerk.
Stel ik heb in totaal 5 simulaties van een netwerk van 5 computers dan zou dat bestand er als volgt uit kunnen zien:
(eerste rij is de computer ID, elke volgende rij is een simulatie, de getallen stellen de tijd voor tot besmetting (een 0 betekend een index case)
Stel dat we maar een x aantal computers zouden kunnen monitoren, dan is het belangrijk om te weten welke computers ik dan het beste (in termen van minimaliseren van de detectie tijd) aan mijn lijstje van te monitoren computers zou moeten toevoegen.
Nu wil ik weten voor x = 1 tot N computers (N=totaal aantal computers in netwerk, 5 in dit geval) in mijn lijst wat de beste volgorde is om computers toe te voegen aan mijn monitor-lijst om zo de detectietijd te minimaliseren.
Voor het gegeven bestand is het makkelijk te doen:
De eerste computer die we toevoegen is diegene die gemiddeld (over alle simulaties) de kortste infectietijd heeft, dat is dus computer 4 (gem. tijd = 2.4)
Daarna moet de computer worden toegevoegd die tezamen met de al toegevoegde computer(s) de detectie tijd minimaliseert: per simulatie bekijk ik welke van de 2 tijden het kleinst is, deze tijd stop ik in een tijdelijke nieuwe lijst, en bereken de gemiddelde detectie tijd,en ik herhaal dit voor alle overgebleven computers en vind zo de beste combinatie.
Toegepast op de voorbeeld data:
we hebben al computer 4, stel ik voeg daar computer 1 aan toe dan neem ik het telkens het minimum van:
mijn nieuwe gemiddelde tijd voor de ze combi is dus: 1. ((1+0+2+2+0)/5)
Dit kun je doen voor de combi's 4&1 (hierboven), 4&2, 4&3 en 4&5. De beste oplossing is dan de combi 4&1 (de overige gemiddelden zijn: 1.4,1.4,2.4,1.4).
Dit kun je daarna herhalen voor de overgebleven computers en uiteindelijk is je detectie tijd 0 als alle computers zijn toegevoegd (uitgaande van perfecte detectie enz. enz).
(de uiteindelijke beste volgorde is (4,1,3,5,2) mocht iemand het willen narekenen)
Voor kleine aantallen is dit allemaal prima door te rekenen (tot N=2000 en 520000 simulaties gaat het nog), maar voor grotere aantallen duurt dit gewoon ontzettend lang aangezien het een brute force methode is om een globaal optimum te vinden. (alles is geprogrammeerd in c++, maar dat doet verder niet zo ter zake).
En dat is dus het punt waar ik jullie hulp kan gebruiken!
Kan ik dit verder optimaliseren?
(ook totaal andere algoritmes zijn welkom, zolang de uitkomst maar hetzelfde is)
Bij voorbaat dank !
(In ieder geval al voor het lezen van de hele tekst!)
Ik zit met het volgende probleem:
(ik heb het originele probleem even omgeschreven naar iets dat (wellicht) interessanter is om hier te bespreken, maar de strekking blijft hetzelfde)
Stel ik heb een lijst van computers in een (gesloten) netwerk en ik weet van elke computer hoe lang het duurt tot deze besmet is met een virus (gemeten vanaf het tijdstip dat het virus voor het eerst op het netwerk aanwezig was (de index-case)). Deze lijst is tot stand gekomen d.m.v. simulaties van zo'n computer netwerk.
Stel ik heb in totaal 5 simulaties van een netwerk van 5 computers dan zou dat bestand er als volgt uit kunnen zien:
(eerste rij is de computer ID, elke volgende rij is een simulatie, de getallen stellen de tijd voor tot besmetting (een 0 betekend een index case)
comp ID: 1 2 3 4 5
2 0 4 1 2
3 4 5 0 1
9 6 0 2 4
2 4 3 5 0
0 1 3 4 9
Stel dat we maar een x aantal computers zouden kunnen monitoren, dan is het belangrijk om te weten welke computers ik dan het beste (in termen van minimaliseren van de detectie tijd) aan mijn lijstje van te monitoren computers zou moeten toevoegen.
Nu wil ik weten voor x = 1 tot N computers (N=totaal aantal computers in netwerk, 5 in dit geval) in mijn lijst wat de beste volgorde is om computers toe te voegen aan mijn monitor-lijst om zo de detectietijd te minimaliseren.
Voor het gegeven bestand is het makkelijk te doen:
De eerste computer die we toevoegen is diegene die gemiddeld (over alle simulaties) de kortste infectietijd heeft, dat is dus computer 4 (gem. tijd = 2.4)
Daarna moet de computer worden toegevoegd die tezamen met de al toegevoegde computer(s) de detectie tijd minimaliseert: per simulatie bekijk ik welke van de 2 tijden het kleinst is, deze tijd stop ik in een tijdelijke nieuwe lijst, en bereken de gemiddelde detectie tijd,en ik herhaal dit voor alle overgebleven computers en vind zo de beste combinatie.
Toegepast op de voorbeeld data:
we hebben al computer 4, stel ik voeg daar computer 1 aan toe dan neem ik het telkens het minimum van:
min(1,2) = 1 min(0,3) = 0 min(2,9) = 2 min(5,2) = 2 min(3,0) = 0
mijn nieuwe gemiddelde tijd voor de ze combi is dus: 1. ((1+0+2+2+0)/5)
Dit kun je doen voor de combi's 4&1 (hierboven), 4&2, 4&3 en 4&5. De beste oplossing is dan de combi 4&1 (de overige gemiddelden zijn: 1.4,1.4,2.4,1.4).
Dit kun je daarna herhalen voor de overgebleven computers en uiteindelijk is je detectie tijd 0 als alle computers zijn toegevoegd (uitgaande van perfecte detectie enz. enz).
(de uiteindelijke beste volgorde is (4,1,3,5,2) mocht iemand het willen narekenen)
Voor kleine aantallen is dit allemaal prima door te rekenen (tot N=2000 en 520000 simulaties gaat het nog), maar voor grotere aantallen duurt dit gewoon ontzettend lang aangezien het een brute force methode is om een globaal optimum te vinden. (alles is geprogrammeerd in c++, maar dat doet verder niet zo ter zake).
En dat is dus het punt waar ik jullie hulp kan gebruiken!
Kan ik dit verder optimaliseren?
(ook totaal andere algoritmes zijn welkom, zolang de uitkomst maar hetzelfde is)