Paina F9 Sulje - Excel-vinkkejä

Excelin käyttäminen minkä tahansa monimutkaisen mallin ratkaisemiseen

Lev on kilpailukykyisen uintiliigan komissaari. Hän kirjoittaa: "Olen uimaliigan komissaari. Tänä vuonna on kahdeksan joukkuetta. Jokainen joukkue isännöi yhtä tapaamista ja on kotijoukkue. Tapaamisessa on 4 tai 5 joukkuetta. Kuinka järjestää aikataulu niin, että jokainen joukkue ui vastaan joka toinen joukkue kahdesti? Aiemmin, kun meillä oli 5, 6 tai 7 joukkuetta, voisin ratkaista sen painamalla F9-näppäintä loppuun asti. Mutta tänä vuonna 8 joukkueen kanssa se ei tule ulos. "

Yksi rajoituksista on, että jotkut altaat tarjoavat vain 4 kaistaa, joten sinulla voi olla vain 4 joukkuetta, kun kyseinen uima-allas isännöi gaalaa. Muille uima-altaille heillä voi olla 5, 6 tai enemmän kaistoja, mutta ihanteellisessa tapaamisessa kotijoukkue ja neljä muuta.

Ehdotukseni: Paina F9 nopeammin! Auta siinä: kehitä mallissasi "läheisyyden mitta". Tällä tavalla, kun painat F9-näppäintä, voit pitää silmällä yhtä numeroa. Kun löydät "paremman" ratkaisun kuin paras, jonka olet löytänyt, tallenna se parhaaksi väliratkaisuksi.

Uintiongelmalle ominaiset vaiheet

  • Luettelo 8 kotijoukkueesta ylhäältä.
  • Kuinka monella tapaa täyttää muut 4 kaistaa?
  • Luettele kaikki tavat.
  • Kuinka monta tapaa täyttää muut 3 kaistaa (pienille paikoille?). Luettele kaikki tavat.
  • Käytä RANDBETWEEN(1,35)valitsemaan joukkueet jokaiseen otteluun.

Huomaa, että on 35 8 mahdollista tapaa järjestää kausi (2,2 biljoonaa). Olisi "mahdotonta" tehdä niitä kaikkia kotitietokoneella. Jos mahdollisuuksia olisi vain 4000, voit tehdä ne kaikki, ja se on video toiselle päivälle. Mutta 2,2 biljoonan mahdollisuuksien avulla arvaaminen satunnaisesti löytää todennäköisemmin ratkaisuja.

Kehitä mitta läheisyydestä

Uintiskenaariossa tärkeintä on, uivatko kaikki joukkueet toisiaan vastaan ​​kahdesti?

Ota nykyiset 8 satunnaislukua ja piirrä kaavojen avulla kaikki ottelut. Luettelo 28 mahdollisesta ottelusta. Käytä COUNTIFnähdäksesi kuinka monta kertaa kukin ottelu tapahtuu nykyisten satunnaislukujen kanssa. Laske, kuinka monta on 2 tai enemmän. Tavoitteena on saada tämä luku 28: een.

Toissijainen tavoite: Otteluita on 28. Jokaisen on tapahduttava kahdesti. Se on 56 ottelua, joiden on tapahduttava. 8 altaalla ja 6 viidellä kaistalla sinulla on 68 ottelua. Tämä tarkoittaa, että jotkut joukkueet uivat muita joukkueita vastaan ​​3 kertaa ja mahdollisesti 4 kertaa. Toissijainen tavoite: Varmista, että mahdollisimman harvoilla joukkueilla on 4 ottelua. Tertiäärinen tavoite: Pienennä maksimi

Hidas tapa ratkaista tämä

Paina F9. Katso tulos. Paina F9 muutaman kerran nähdäksesi, mitä tuloksia saat. Kun saat korkean tuloksen, tallenna 8 tuloa ja kolme lähtömuuttujaa. Paina F9-näppäintä, kunnes saat paremman tuloksen. Tallenna se tallentamalla 8 syöttösolua ja 3 tulosolua.

Makro nykyisen tuloksen tallentamiseksi

Tämä makro tallentaa tulokset seuraavalle riville.

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

Makro painaa F9 toistuvasti ja tarkista tulokset

Kirjoita makro painamalla F9 toistuvasti, kirjaamalla vain "parempia" ratkaisuja. Anna makron pysähtyä, kun pääset haluttuihin tuloksiin 28 ja 0.

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

Sivupalkki Tietoja näytön päivittämisestä

Sivupalkki: Aluksi on "hauskaa" katsella iteraatioita. Mutta lopulta huomaat, että sinun on ehkä testattava miljoonia mahdollisuuksia. Kun Excel piirtää näytön uudelleen, makro hidastuu. Käytä Application.ScreenUpdating = False, jos et halua maalata näyttöä uudelleen.

Aina kun saat uuden vastauksen tai joka 1000, anna Excel piirtää ruutu uudelleen. Ongelma: Excel ei piirrä ruutua uudelleen, ellei solun osoitin liiku. Huomasin, että valitsemalla uusi solu, kun ScreenUpdating on tosi, Excel maalaisi ruudun uudelleen. Päätin saada sen vuorotellen laskurisolun ja toistaiseksi parhaiden tulosten välillä.

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

Vaihtoehtoiset ratkaisuratkaisut

Harkitsin monia otsikoita tälle videolle: Paina F9 kunnes sulkeutuu, arvaa kunnes on oikein, raakan voimanratkaisu, läheisyyden mitta

Huomaa, että yritin ratkaista ongelman Solverin avulla. Mutta ratkaisija ei päässyt lähelle. Se ei koskaan parantunut kuin 26 joukkuetta, kun tavoite oli 28.

Huomaa myös, että mikä tahansa ratkaisu, jonka saan tästä videosta, on "tyhmä onni". Ratkaisumenetelmässä ei ole mitään älykästä. Esimerkiksi makro ei sano: "Meidän pitäisi aloittaa tähän mennessä parhaasta ratkaisusta ja tehdä joitain mikrosäätöjä." Vaikka saat ratkaisun, joka on vain yhden numeron päässä, se painaa sokeasti F9: ää uudelleen. On todennäköisesti älykkäämpi tapa hyökätä ongelmaan. Mutta … juuri nyt … uintikomissaarillemme tämä lähestymistapa toimi.

Lataa työkirja

Katso video

Lataa tiedosto

Lataa esimerkkitiedosto täältä: Podcast2180.zip

Mielenkiintoisia artikkeleita...