Притисните Ф9 док се не затвори - Екцел Савети

Коришћење Екцел-а за решавање било ког сложеног модела

Лев је комесар такмичарске лиге у пливању. Пише: "Ја сам повереник пливачке лиге. Ове године постоји осам тимова. Сваки тим је домаћин једном сусрету и домаћи је тим. Састанак ће имати 4 или 5 тимова. Како распоредити распоред тако да сваки тим плива против сваки други тим два пута? У прошлости, када смо имали 5, 6 или 7 тимова, могао сам то да решим притиском на Ф9 до краја. Али ове године са 8 тимова то не излази. "

Једно од ограничења је да неки базени нуде само 4 траке, тако да можете имати само 4 тима када је тај базен домаћин свечаности. За остале базене можда имају 5, 6 или више стаза, али идеалан сусрет имаће домаћи тим и још четири.

Мој предлог: Притисните Ф9 брже! Да бисте у томе помогли: развијте „меру блискости“ у свом моделу. На тај начин, када притиснете Ф9, можете имати на оку један број. Када пронађете „боље“ решење од најбољег које сте пронашли, сачувајте га као средње најбоље решење.

Кораци специфични за проблем пливања

  • Наведите 8 домаћих тимова на врху.
  • Колико начина да се попуне остале 4 траке?
  • Наведи све начине.
  • Колико начина да се попуне остале 3 траке (за мала места?). Наведи све начине.
  • Користите RANDBETWEEN(1,35)за одабир тимова за сваки меч.

Имајте на уму да постоји 35 8 могућих начина за распоред сезоне (2,2 билиона). Било би „немогуће“ све их урадити са кућним рачунаром. Да постоји само 4000 могућности, могли бисте их све, а то је видео за неки други дан. Али са 2,2 билиона могућности, насумично погађање је веће шансе да пронађе решења.

Развијте меру блискости

У сценарију пливања најважније је да ли свака екипа плива два пута против сваке друге екипе?

Узмите тренутних 8 случајних бројева и користите формуле за цртање свих поклапања. Наведи 28 могућих упаривања. Користите COUNTIFда бисте видели колико пута се свако поклапање догађа са тренутним случајним бројевима. Броји колико је 2 или веће. Циљ је да се овај број повећа на 28.

Секундарни циљ: Постоји 28 подударања. Свака се треба догодити два пута. То је 56 упаривања која се морају догодити. Са 8 базена и 6 са пет трака, имаћете 68 упаривања. То значи да ће неке екипе пливати против других 3 пута, а могуће и 4 пута. Секундарни циљ: Побрините се да што мање тимова има 4 упаривања. Терцијарни циљ: Смањити макс.

Спори начин да се ово реши

Притисните Ф9. Погледајте резултат. Притисните Ф9 неколико пута да бисте видели које резултате добијате. Када добијете висок резултат, сачувајте 8 улаза и три излазне променљиве. Наставите притискати Ф9 док не постигнете бољи резултат. Сачувајте ту снимањем 8 улазних ћелија и 3 ћелије резултата.

Макро за чување тренутног резултата

Овај макро снима резултате у следећи ред.

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

Макро да притиснете Ф9 више пута и проверите резултате

Напишите макронаредбу да бисте притискали Ф9 више пута, бележећи само „боља“ решења. Нека се макро заустави када дођете до жељених резултата 28 и 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

Бочна трака о Ажурирању екрана

Бочна трака: У почетку је „забавно“ гледати како се понављају итерације. Али на крају схватите да ћете можда морати да тестирате милионе могућности. Ако Екцел поново нацрта екран, успорава се макро. Користите Апплицатион.СцреенУпдатинг = Фалсе да не бисте поново сликали екран.

Сваки пут када добијете нови одговор или сваких 1000, пустите Екцел да поново нацрта екран. Проблем: Екцел не прецртава екран ако се показивач ћелије не помери. Открио сам да би одабиром нове ћелије док је СцреенУпдатинг Труе тачка Екцел поново сликао екран. Одлучио сам да се измени између бројача и најбољих резултата до сада.

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

Алтернативна решења за решавање

Размотрио сам многе наслове за овај видео: Притисните Ф9 док се не затвори, Погоди док се не покаже тачно, Грубо решавање силе, Мера блискости

Имајте на уму да сам пробао да решим проблем помоћу решитве. Али Солвер није могао да се приближи. Никада није било боље од 26 тимова када је циљ био 28.

Такође имајте на уму да је свако решење које нађем у овом видеу „глупа срећа“. У начину решавања нема ништа паметно. На пример, макро не каже: „Требали бисмо поћи од најбољег решења до сада и извршити нека микро прилагођавања“. Чак и ако добијете решење које је удаљено само један број, оно поново слепо притиска Ф9. Вероватно постоји интелигентнији начин за напад на проблем. Али … управо сада … за нашег комесара за пливање, овај приступ је успео.

Преузмите радну свеску

Погледајте видео

Скини докуменат

Преузмите датотеку узорка овде: Подцаст2180.зип

Занимљиви Чланци...