Nyomja meg az F9-et bezárásig - Excel tippek

Az Excel használata bármilyen komplex modell megoldására

Lev egy versenyképes úszó liga biztosa. Azt írja: "Egy úszó bajnokság biztosa vagyok. Idén nyolc csapat van. Mindegyik csapat egy találkozót rendez és a hazai csapat. Egy találkozón 4 vagy 5 csapat vesz részt. Hogyan lehet elrendezni az ütemtervet, hogy minden csapat ússzon minden második csapat kétszer? A múltban, amikor 5, 6 vagy 7 csapatunk volt, meg tudtam oldani az F9 megnyomásával egészen a végéig. De ebben az évben 8 csapattal nem jön ki. "

Az egyik megkötés az, hogy egyes medencék csak 4 sávot kínálnak, így csak 4 csapatod lehet, ha ez a medence rendezi a gálát. Más medencék esetében lehet, hogy 5, 6 vagy több sávjuk van, de az ideális találkozóhoz a hazai csapat és négy másik tartozik.

Javaslatom: Nyomja meg gyorsabban az F9 billentyűt! Ennek elősegítése érdekében dolgozzon ki egy "közelségi mértéket" a modelljében. Így az F9 megnyomásakor egy számra figyelhet. Ha talál egy "jobb" megoldást, mint a legjobb, amit eltalált, mentse azt a köztes legjobb megoldásként.

Az úszási problémára jellemző lépések

  • Sorolja fel a tetején a 8 hazai csapatot.
  • Hányféleképpen lehet kitölteni a másik 4 sávot?
  • Sorolja fel az összes utat.
  • Hányféleképpen lehet kitölteni a másik 3 sávot (kis helyszínekhez?). Sorolja fel az összes utat.
  • Használja RANDBETWEEN(1,35)a csapatokat az egyes mérkőzésekhez.

Ne feledje, hogy 35 8 lehetséges mód van az évad rendezésére (2,2 billió). Otthoni PC-vel "lehetetlen" elvégezni mindet. Ha csak 4000 lehetőség lenne, mindet megtehetné, és ez egy másik nap videója. De 2,2 billió lehetőség mellett a véletlenszerű találgatások nagyobb valószínűséggel találnak megoldásokat.

Készítsen egy mérést a közelségről

Az úszási szcenárióban a legfontosabb az, hogy minden csapat kétszer úszik-e minden másik csapat ellen?

Vegyük az aktuális 8 véletlen számot, és képletek segítségével ábrázoljuk az összes meccset. Sorolja fel a 28 lehetséges meccset. Használja, COUNTIFhogy megnézze, hányszor zajlik egyeztetés az aktuális véletlenszámokkal. Számolja meg, hányan vannak 2 vagy annál nagyobbak. A cél az, hogy ez a szám 28-ra kerüljön.

Másodlagos cél: 28 mérkőzés van. Mindegyiknek kétszer kell megtörténnie. Ez 56 olyan mérkőzés, amelynek meg kell történnie. 8 medencével és 6, öt sávos játékkal 68 meccs lesz. Ez azt jelenti, hogy egyes csapatok 3-szor, esetleg 4-szer úsznak más csapatok ellen. Másodlagos cél: Győződjön meg arról, hogy a lehető legkevesebb csapatnak van 4 mérkőzése. Harmadik cél: Minimalizálja a max.

Lassú megoldás ennek megoldására

Nyomja meg az F9 billentyűt. Nézd meg az eredményt. Nyomja meg néhányszor az F9 billentyűt, hogy lássa, milyen eredményeket ér el. Ha magas eredményt ér el, mentse el a 8 bemenetet és a három kimeneti változót. Addig nyomja az F9 billentyűt, amíg jobb eredményt nem kap. Mentsen egyet azáltal, hogy rögzíti a 8 beviteli cellát és a 3 eredmény cellát.

Makró az aktuális eredmény mentéséhez

Ez a makró az eredményeket a következő sorba menti.

Sub SaveThis() NR = Range("Z1048576").End(xlUp).Row + 1 Cells(NR, 26).Resize(1, 11).Value = Array(Range("c8").Value, _ Range("D8").Value, Range("E8").Value, Range("F8").Value, _ Range("G8").Value, Range("H8").Value, Range("I8").Value, _ Range("J8").Value, Range("O1").Value, Range("P1").Value, _ Range("Q1").Value) End Sub

Makró az F9 ismételt megnyomásához és az eredmények ellenőrzéséhez

Írjon makrót az F9 ismételt megnyomásához, és csak "jobb" megoldásokat naplózza. Állítsa le a makrót, amikor eléri a 28 és 0 kívánt eredményét.

Sub TrySome() NR = Range("Z1048576").End(xlUp).Row + 1 Ctr = Range("T1").Value Application.ScreenUpdating = Range("AH2").Value SolutionFound = False GoAgain: ActiveSheet.Calculate Ctr = Ctr + 1 UseIt = 0 If Range("O1").Value> Range("AK1").Value Then UseIt = 1 ElseIf Range("O1").Value = Range("AK1").Value Then If Range("P1").Value 300 Then Application.ScreenUpdating = True Exit Sub End If If SolutionFound = True Then Application.ScreenUpdating = True Exit Sub End If If Ctr Mod 1000 = 0 Then Range("T1").Value = Ctr Application.ScreenUpdating = True If Selection.Address = "$T$1" Then Cells(NR, 34).Select Else Range("T1").Select End If Application.ScreenUpdating = Range("AH2").Value End If GoTo GoAgain End Sub

Oldalsáv a ScreenUpdatingről

Oldalsáv: Eleinte "szórakoztató" nézni az iterációk gördülését. De végül rájössz, hogy lehet, hogy milliókat kell tesztelned. Az Excel újrarajzolása után a makró lelassul. Használja az Application.ScreenUpdating = False értéket a képernyő újrafestéséhez.

Minden alkalommal, amikor új vagy 1000 választ kap, hagyja, hogy az Excel újrarajzolja a képernyőt. Probléma: Az Excel csak akkor rajzolja át a képernyőt, ha a cella mutató elmozdul. Megállapítottam, hogy ha az új cellát kiválasztja, miközben a ScreenUpdating True, az Excel újrafestené a képernyőt. Úgy döntöttem, hogy felváltva használom a Counter cellát és az eddigi legjobb eredményeket.

Application.ScreenUpdating = True If Selection.Address = "$T$1" Then Cells(NR, 34).Select Else Range("T1").Select End If Application.ScreenUpdating = Range("AH2").Value

Alternatív megoldási megoldások

Számos címet fontolgattam ehhez a videóhoz: Nyomja meg az F9 billentyűt bezárásig, találgatás a helyesig, brutális erőmegoldás, közelség mérése

Ne feledje, hogy megpróbáltam megoldani a megoldót a probléma megoldására. De Solver nem tudott közel kerülni. Soha nem lett jobb 26 csapatnál, amikor a gól 28 volt.

Vegye figyelembe azt is, hogy bármilyen megoldás, amit kapok ebben a videóban, "buta szerencse". A megoldási módszerben nincs semmi intelligens. Például a makró nem azt mondja: "Ki kellene indulnunk az eddigi legjobb megoldásból, és végezzünk néhány mikrokorrekciót". Még akkor is, ha csak egy számra lévő megoldást kap, az ismét vakon nyomja meg az F9 billentyűt. Valószínűleg van egy intelligensebb módszer a probléma megtámadására. De … most … úszási biztosunk számára ez a megközelítés bevált.

Töltse le a munkafüzetet

Videót nézni

Fájl letöltése

Töltse le a minta fájlt innen: Podcast2180.zip

érdekes cikkek...