Diskuze: Seřazení hodnot pro vývahu oběžného kola
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Bugmaster:23.9.2019 14:42
Já si řikal, že tě v tom nechám trochu potrápit S těmahle pakárnama se blbě
radí, protože netuším, jak to máš ve vnitř realizovaný.
Kolik byl ten vývažek předtím?
mifro:23.9.2019 14:55
před tím jsem měl
18g. Teď to budu porovnávat se starým ručním řazením, co mám v excelu.
Myslím si, že nyní je to optimální. A snad i hmotnost vývažku a úhel kam
ho navařit počítám správně
mifro:23.9.2019 15:34
Např. pro hodnoty níže (reálné hmotnosti již namontovaných lopatek) mi to ukazuje 1273 gramů na 350°. Zkusíš pro zajimavost ověřit? Díky
7273
7140
7187
7204
7147
7243
7169
7195
7182
7218
7125
7253
7195
7133
7203
7168
7236
7179
7234
7129
7202
Bugmaster:23.9.2019 16:15
Jak to myslíš ověřit? Nenaimplementoval si právě to řazení do programu?
Když to proženu algoritmem, tak mam tuhle posloupnost:
7253
7204
7133
7182
7129
7234
7243
7236
7125
7187
7168
7169
7273
7195
7147
7179
7218
7203
7140
7195
7202
Excentricita těžiště je nula nula prd. Kolik přidat, to nevím, protože neznám žádný dimenze.
mifro:24.9.2019 6:57
Používám v podstatě "jen" tento příkaz (seřazené lopatky do listboxu) :
Dim zoptimalizovano = Seradit(hodnotyZListBoxu)
For ss = 0 To ListBox1.Items.Count - 1
ListBox2.Items.Add(zoptimalizovano(ss))
Next
Výsledky stejné, tak to je OK.
Bugmaster:24.9.2019 7:22
Tak takhle nějak jsem tu funkci zamýšlel.
Při tomhle řazení to chce doplnit vyvážení 1273 g?
mifro:24.9.2019 7:47
Lopatky mají celkem 150kg, náboj má 900kg - 1,2kg je ok. Ale ještě to
zkusím přepočítat ručně na zkoušku.
Jinak hodnota Dim kolikratPromichat = 30 má nějaký velký vliv? Ať dám 1
nebo 500, výsledky jsou stejné a ok.
Díky
Bugmaster:24.9.2019 9:21
Je to číslo, které říká, kolik se má vytvořit různě promíchaných verzí oběžného kola, které se následně zkouší optimalizovat a z nich se vybere to nejlepší. Takže určitě to má vliv na dobu trvání optimalizace - a to přímo úměrnou.
Jestli to má vliv na výsledek? Na to mám dvě verze odpovědi:
Zkrácená verze:
Podle mých měření má. Jestli je to významný vliv? To si musíš posoudit
sám.
Plná verze:
Algoritmus funguje tak, že v podstatě odzkouší hromadu verzí oběžného
kola s různě proházenýma lopatkama. Z těchle verzí následně vybírám to
nejlepší. Aby jsem mohl vybrat to nejlepší, tak je potřebuji nějak
porovnat. Porovnávám je tím způsobem, že každý verzi oběžného kola
připlácnu nějaké číslo, které vyjadřuje jak moc je to dobré řešení.
Protože mě nenapadlo nic lepšího, tak to číslo je výstřednost
těžiště sestavy lopatek (s tím, že počítám, že těžiště lopatky
leží na poloměru jedna, ať už je to jakákliv vzdálenost).
A podle mých měření to na výstřednost těžiště vliv má:
Jestli to má vliv na výsledné hmotnosti vývažku? To si budeš muset rozhodnout sám.
mifro:24.9.2019 10:27
Tady je zatím skoro-finální podoba Myslím, že to počítá perfektně, ale čeká mě ještě hodně
testů.
Ahoj,
tak jsem se vrátil po delší době. Dáš mi nějaké data, na kterých mohu otestovat své řešení?
Jak píšeš, problém je s počtem variant - např. pro 21 lopatek je to hodně velké číslo.
Brute force, nebude tak velké číslo, není třeba procházet všechny
možné kombinace (ne)vyváženost pro rozložení
1, 2, 3, 4, 5
bude stejná jako, pouze posunuté
2, 3, 4, 5, 1
3, 4, 5, 1, 2
...
5, 1, 2, 3, 4
a otočené
5, 4, 3, 2, 1
...
mifro:24.9.2019 11:10
Ahoj, zkus můj obrázek nad tvým postem a data jsou zde:
10300
10030
10120
10050
10210
10050
10130
10090
10100
10300
10100
10090
10130
10070
10160
10080
10120
10020
Vam to pocita jako 10s? Mne to s tim sortem pocita ms. Ale urcite ne tak
dobre jako ty vase reseni.
https://mlich.zam.slu.cz/js-teziste.htm
Vyleza mi tahle posloupnost, můžeš ověřit jak si stojí?
10120
10050
10210
10050
10130
10090
10030
10100
10300
10100
10090
10130
10070
10160
10080
10120
10020
10300
PS: jak počítáš jakou hmotnost a kam máš přidat?
Není lepší přidávat jedno těžší závaží, než 2 lehčí?
mifro:24.9.2019 13:11
Viz příloha - obr moje / tvoje. Na mém je vidět 1 gram, na tvém 28 gramů. Závaží je jen jedno - vidíš tam úhel, kam ho připevnit.
Upravil jsem ten muj program na nahodne serazeni a pak 3x zkusit
optimalizovat a cele to jeste 1000x zopakovat. Dava to celek slusne vysledky se
vzdalenosti 0. Neprisel jsem na to, jak pocitas hmotnost. To v tom XSL, co jsi
kdysi posilal, neni.
https://mlich.zam.slu.cz/js-teziste.htm
Mne vychazi pri nekolika F5 treba tohle. Snad tam neni chyba...
({x:5.7e-7, y:-7.4e-7, m:182170, vz:9.3e-7}
10130
10100
10300
10090
10060
10060
10300
10020
10080
10090
10120
10130
10160
10210
10120
10070
10100
10030
Peter Mlich:24.9.2019 15:15
Jo, zdrojovy kod se da zobrazit primo v prohlizeci. Je to zplacane narychlo,
tak moc na to nekoukat
Bugmaster:24.9.2019 15:22
Ten graf se mi líbí. Ještě do toho vyznačit kam přijde vyvážka a je to dokonalý.
Takže počet míchání je Accuracy?
Bugmaster:24.9.2019 15:22
Sakra, to mě nenapadlo! To máš pravdu! To by potenciálně šlo, ale
nenapadá mě, jak alespoň napůl rozumně vygenerovat všechny varianty
Bugmaster:24.9.2019 15:23
Jóó tohle... to záleží. V krajních případech ano Prochází to hodně variant. Kdyby
to byl problém, tak se to dá potenciálně zrcyhlit - jednak paralelním
výpočtem jednolivých variant a potenciálně možná taky některé varianty
přeskočit - viz to co psal Ghst.
mifro:24.9.2019 15:33
ano, accuracy. pozici závaží už jsem dodělal - po zadání průměru náboje to ukáže kolik mm se vývažek umístí za kolikátou lopatkou.
Bugmaster:24.9.2019 21:02
Nevím, jak se ti to podařilo, ale řadí ti to fakt dobře a rychle (a nevyzpytatelně). V tom kódu se ale vůbec nevyznám :/ Takhle na první pohled mi přijde, že se to trochu zhoršuje se stoupajícím počtem lopatek, ale stále je to imho naprosto ok.
Kdyby to vysvtělil nebo přepsal jako pro blbý (tj. jako pro mě), tak to můžu přepsat do VB a navrhnout to mifrovi.
Neprisel jsem na to, jak pocitas hmotnost. To v tom XSL, co jsi kdysi posilal, neni.
Jsem přesvědčenej, že hmotnost vývažku ze zadaných údajů spočítat nemůžeš. Neumím si představit, že bych to počítal bez znalosti na jakým poloměru je těžiště lopatky a na jaký poloměr se navařuje závaží. Nebo mi něco uniká?
Jakub Švasta:24.9.2019 23:30
Jsem přesvědčenej, že hmotnost vývažku ze zadaných údajů spočítat nemůžeš. Neumím si představit, že bych to počítal bez znalosti na jakým poloměru je těžiště lopatky a na jaký poloměr se navařuje závaží. Nebo mi něco uniká?
Podle mě můžeme rozdíly v poloměru u jednotlivých lopatek zanedbat,
protože budou mít řádově menší vliv na výsledek než rozdíly v
hmotnostech. Jde určitě o to, aby se vyrovnaly účinky odstředivé síly
jednotlivých lopatek. Odstředivá síla lopatky je m * ω^2 * r, kde
rychlost otáčení je pro všechny lopatky stejná, a rozdíly v hmotnostech
jsou v řádu jednotek. To by musely být rozdíly v poloměru v řádu metrů,
což jistě nebudou. Takže
vývažek můžu spočítat jednoduše tak, že ve směru jednotlivých lopatek
vynesu vektory, kde každý bude mít velikost úměrnou hmotnosti lopatky,
spočítám jejich výslednici, a vývažek bude mít stejnou velikost jako
výslednice (velikost odpovídá hmotnosti), akorát bude směřovat na opačnou
stranu. Tedy nejsem strojař, ale přijde mi, že to takhle musí být.
To, co psal Ghst, mě napadlo taky, ale ono to zas tolik nepomůže. Pokud se nepletu, tak to posouvání začátku mi vydělí výsledek n-krát (mám n lopatek, na kterých může posloupnost začít) a zrcadlení ještě dvakrát. Čili výsledná náročnost výpočtu je 1/2 * (n-1)! To je sice hezké, ale při základu okolo 20 už je to oproti n! asi jedno. Ostatně můžeme si představit, že jednu lopatku umístíme fixně (je jedno, na který úhel), a hledáme rozložení jen těch zbylých, a tam už začátek sekvence posouvat nemůžeme, čili je jasné, že výsledek musí být úměrný faktoriálu n-1 (zbyde tam jen to dělení dvojkou díky zrcadlení).
Chtělo by to kontaktovat někoho, kdo se vyzná v kapitole matematiky, které se říká operační výzkum, protože to určitě bude úloha na něco z toho. Popis řešení (počáteční rozložení si nějak zvolím, pak prohazuju lopatky dokud se výsledek zlepšuje, ale musím začít několikrát, protože nevím, jestli má funkce jen jedno lokální minimum) celkem přesně odpovídá popisu řešení u nelineárního programování. V tom už se nevyznám, ale klasické lineární programování, které jsem se kdysi učil, funguje pro spojité spektrum přípustných výsledků, a nevím, jak by se zapsaly omezující podmínky, že hmotnost lopatek není spojitá, ale vybírám ji jen z dané množiny.
Jinak teď už je to asi jedno, ale ještě mě napadl algoritmus, který by pracoval zhruba tak, že si kolo rozdělím na X segmentů, a snažím se do segmentů rozmisťovat lopatky tak, aby měly segmenty co nejvyrovnanější hmotnost. Když si představím kolo, které má na jedné půlce všechny těžké lopatky a na druhé všechny lehké, tak takové kolo určitě optimální nebude, a nezáleží, jak budou ty těžké ani lehké lopatky proházené, čili všechny tyhle permutace můžu rovnou zahodit. Resp. naopak můžu rovnou rozdělit lopatky na dvě poloviny tak, aby měly ty poloviny co nejvyrovnanější hmotnost. Pak udělám totéž pro třetiny, pak pro čtvrtiny atd. A mělo by mi postupně vyjít, kam kterou lopatku umístit. Ale nevím, jak dobře by to fungovalo, je to jen námět.
Bugmaster:25.9.2019 6:38
Wow, narazil jsem na notifikační e-mail hned po probuzení a musím
konstatovat, že mě tvůj příspěvek úspešně probral
Podle mě můžeme rozdíly v poloměru u jednotlivých lopatek zanedbat...
Tak jsem to nemyslel. Myslel jsem to tak, že hmotnost, kterou je třeba
přidat (nebo odebrat na druhé straně) nespočítám pouze ze znalosti
hmotnosti a rozmístění jednolivých lopatek. Já bych na to totiž šel
takto:
Z poloměru, na kterém leží těšitě lopatek bych spočítal skutečno
polohu těžiště soustavy lopatek. Z toho znám úhel a poloměr, na kterém
těžiště leží. Závaží pak umístit na druhou stranu a vyvážit to jako
houpačku - a k tomu potřebuju znát poloměr, kam přijde závaží (nebo
hmotnost a určit poloměr, to ale asi není moc praktické).
Peter Mlich:25.9.2019 7:59
Presne, jak pises. Teziste celeho telesa lze spocitat jen z celeho telesa. Ty lopatky, to take neni kolesovy parnik, ale jsou ruzne zkroucene a v nejake vzdalenosti od stredu. Ten priklad je tedy znacne zjednoduseny jen na hmotnosti lopatek, podle mne.
Ten kod do VB psat nebudu. Dneska mne mozna napadla jeste lepsi varianta. Zkusim popsat.
- nahodne zamicham
- vyuziji iteraci sortovaciho algoritmu (jinak bych pouzil cyklus s nahodnym vyberem)
- vemu tak nahodne 2 lopatky, spocitam T1, prohodim je, spocitam T2. Porovnam T1 a T2. Pokud je vzdalenost mensi, tak je vymenim.
- spustim to 2x, protoze jsem si vsiml, ze to jeste trosku ubere. (mam to 3x, pro jistotu, ale nevsiml jsem si zmeny)
- a cely program spusitm 1000x
Co by se dalo vylepsit?
- sortovaci algoritmus na zamichani necham
- ale pro nahodny vyber lopatek zkusim ten cyklus
- nepocitat T1, ale ulozit z predchoziho
- nepocitat cele T1, ale odecist a pricist vymenovane lopatky
- nepocitat celkovou hmotnost pro T, ta je pro vsechny stejna
PERF.getTime();
for (i=0; i<1000; i++)
{
lop.sort(func.sort2Cmp); // serad random
lop.sort(func.sort1Cmp); // optimalizuj
app.vars.lop = lop;
lop.sort(func.sort1Cmp); // optimalizuj
app.vars.lop = lop;
lop.sort(func.sort1Cmp); // optimalizuj
app.vars.lop = lop;
func.saveBest(lop);
}
time = PERF.getTime();
S tim sortem to funguje tak, ze algoritmus ma konecny pocet iteraci a pri
prvni prochazi vsechny hodnoty. Pak uz jen ty, ktere nejsou serazene (kdyby slo
o cisla). Proste to pouzivam misto while/for cyklu, ktery tam pouzivas ty.
Takova finticka. Proti tvemu by to mohlo davat mozna i horsi vysledky, ale
Peter Mlich:25.9.2019 8:02
Jinymi slovy, pocitam, ze teziste, cela hmotnost lopatky, je uprostred ve
vzdalenosti 0 od stredu. Zadna vaha soukoli, naboju ani vychyleni nebo
vzdalenejsi blizsi zasunuti lopatky ke stredu.
Odhadem bych dovazku poctal jako prumer hmotnosti * vzdalenost.
Ted jsem to cele predelal. A nejsem si ted moc jisty puvodnim vysledkem, kde
mi to hazelo pekna cisla, kdezto todle zatim nee a pritom to ma lepcejsi
algoritmy. A vystup jeste ladim.
https://mlich.zam.slu.cz/js-teziste.htm
Treba, proc vymenovat vsechno, kdyz muzu vymenit jen vahu.
app.func.telesoTezisteSwap = function(t, swap_a, swap_b)
{
t = app.func.cloneT(t);
t.x *= t.m;
t.y *= t.m;
t.x -= swap_a.x * swap_a.m; // odectu puvodni
t.y -= swap_a.y * swap_a.m;
t.x -= swap_b.x * swap_b.m;
t.y -= swap_b.y * swap_b.m;
t.x += swap_a.x * swap_b.m; // prictu s vymenou hmotnosti
t.y += swap_a.y * swap_b.m;
t.x += swap_b.x * swap_a.m;
t.y += swap_b.y * swap_a.m;
t.x /= t.m;
t.y /= t.m;
t.vz = Math.sqrt(t.x*t.x + t.y*t.y);
return t;
}
Podarilo se mi to vic optimalizovat.
Pro jistotu je dobre spocitat teziste uplnou funkci, krome te zkracene. Vcera
jsem stravil asi 4h hledanim chyby jen proto, ze jsem po zamichani nespocital
znovu teziste Pak mi vychazela
fantasticka cisla. Zkuste to nekdo proverit, ze zadate nejaka data, u kterych
vite vysledek. To by melo byt to prvni teziste, z puvodnich dat a pod nimi jsou
dve nova a zobrazi nova data. Takze, kdyz to bude vychazet 0, tak by to melo
zobrazit zadani. Opakovani mam 10.000. U mne to pocita asi 250 ms.
Peter Mlich:26.9.2019 8:53
graf to nejspis nezobrazuje dobre, teziste, nereste
Graf opraveno. A jeste jsem to vylepsil takovou drobnosti....
- Da se nastavit cas, jak dlouho to ma pocitat (posledni radky kodu). On si sam urci pocet cyklu. Kdyz se tam da moc hodnot, tak to nepocita dlouho.
- Graf je mozne vypnout. Zkusil jsem dat 100 cisel a nejak dlouho to vykreslovalo. Musel bych to predelat js-html na js-canvas. Ve FF asi 1s
- Vstup je mozne zadat s carkami. Takze je mozne vykopirovat vysledky od bugmastera.
... vyhoda js je, ze funguje i na linuxu, applu. Takze by to bylo mozna lepsi nez vba.
Prepsal jsem to na cykly, treba to bude srozumitelnejsi nez s tim sortem.
Tohle je zakladni kod rozhodovani
http://mlich.zam.slu.cz/…te-cycle.htm
app.func.telesoTeziste = function(lop)
{
var i, i_max, t;
t = {x: 0, y: 0, m: 0, vz: 0};
i_max = lop.length;
if (isExist(app.vars.tez))
{
for (i=0;i<i_max;i++)
{
t.x += lop[i].x * lop[i].m;
t.y += lop[i].y * lop[i].m;
}
t.m = app.vars.tez.m;
}
else
{
for (i=0;i<i_max;i++)
{
t.x += lop[i].x * lop[i].m;
t.y += lop[i].y * lop[i].m;
t.m += lop[i].m;
}
}
t.x /= t.m;
t.y /= t.m;
t.vz = Math.sqrt(t.x*t.x + t.y*t.y);
return t;
}
app.func.telesoTezisteSwap = function(t_old, swap_a, swap_b)
{
var t;
t = app.func.cloneT(t_old);
//screen.write(t.toSource());
//screen.write(swap_a.toSource());
//screen.write(swap_b.toSource());
t.x *= t.m;
t.y *= t.m;
t.x -= swap_a.x * swap_a.m; // odectu puvodni
t.y -= swap_a.y * swap_a.m;
t.x -= swap_b.x * swap_b.m;
t.y -= swap_b.y * swap_b.m;
t.x += swap_a.x * swap_b.m; // prictu s vymenou hmotnosti
t.y += swap_a.y * swap_b.m;
t.x += swap_b.x * swap_a.m;
t.y += swap_b.y * swap_a.m;
t.x /= t.m;
t.y /= t.m;
t.vz = Math.sqrt(t.x*t.x + t.y*t.y);
return t;
}
app.func.lopatkaVahaSwap = function(a, b)
{
var tmp;
tmp = a.m;
a.m = b.m;
b.m = tmp;
}
app.func.cycle = function (arr, func)
{
var i, i_max;
l = arr.length
i_max = l * 31;
for (i=0;i<i_max; i++)
{
a = Math.floor(Math.random() * l);
b = Math.floor(Math.random() * l);
if (a==b)
{continue;}
func(arr[a], arr[b]);
}
return;
}
app.func.sortCmpShuffle2 = function(a, b) // DESC b,a
{
// if (!(0.66-Math.random()<=0))
// {
app.func.lopatkaVahaSwap(a, b);
// return -1;
// }
// return -1;
}
app.func.sort3Cmp = function(a, b)
{
var t1, t2;
if (a.x==b.x && a.y==b.y)
{return 0;}
t1 = app.vars.tez;
t2 = app.func.telesoTezisteSwap(t1, a, b);
if (!(t1.vz-t2.vz<=0))
{
app.func.lopatkaVahaSwap(a, b);
app.vars.tez = t2;
// return -1; // -1 aby uz nevymenoval a, b
}
// return -1;
}
// ----
// program
time_limit = 300; // 300 [ms]
time = 0;
PERF.getTime();
for (i=0; i<10000 && time<time_limit; i++)
{
func.cycle(lop, func.sortCmpShuffle2); // zamichej, serad random
app.vars.tez = func.telesoTeziste(lop); // po zamichani je treba prepocitat teziste kvuli funkci 'sort3Cmp' + 'telesoTezisteSwap'
func.cycle(lop, func.sort3Cmp); // optimalizuj
func.cycle(lop, func.sort3Cmp); // optimalizuj
func.saveBest(lop);
time += PERF.getTime();
}
cycles = i;
Mimochodem, na tech grafech jsem si vsiml, ze ty nejvetsi hodnoty jsou
rovnomerne do trojuhelniku. To by mohlo vylepsit optimalizer. Pripadne uz na
zacatku to rozhazovat trojuhelnikove.
A tez by slo udelat to, ze kdyz se vysledky dlouho nemeni, zastavit cyklus.
mifro:28.9.2019 10:10
Jak to na tom odkazu spustím? Zkoušel jsem různé prohlížeče, ale nic...
mifro:28.9.2019 11:04
Aha, tak ve FF to jede ok. Je nějaký způsob, jak to převést do VB?
Zkoušel jsem výsledky zadat do programu (algo Bugmaster) k porovnání a
vypadá to taky perfektně.
mifro:28.9.2019 16:32
vývažek počítám takto (měl jsem v excelu)
spočtu RAD lopatky (=PI()/180*úhel)
Xn = sin(RAD) x hmotnost lopatky
Yn = cos(RAD) x hmotnost lopatky
součet hodnot Xn je hmotnost vývažku
pak (ARCTG2 součtu hodnot Yn / 180) / PI je úhel vývažku
Aha.
vyvazek = vektor teziste * prumerna hmotnost lopatky
poloha = [-tx, -ty] (symetricky k tezisti pres stred)
Polohu T tam zobrazuji na okraji na ramecku, protoze cisla vychazeji tam
mala, ze by se kryla se stredem. Tak jsem to nazoomoval.
Mimo FF jsem to netestoval. Udelal jsem nejake upravy pro IE9, ale ten graf to
tam zobrazuje nekde bokem, asi a taaak dlouho. Zajimavy je rozdil, Ie 100 cyklu,
FF 2000 cyklu Jo, provedl jsem
nejake nevyznamne zmeny, takovy pokus, kde je lepsi dat vic cyklu. Vyplatilo se
mi to u michani.
for (i=0; i<20000 && time<time_limit; i++)
{
func.cycle(lop, func.cycleCmpShuffle, 22); // zamichej, serad random
app.vars.tez = func.telesoTeziste(lop); // po zamichani je treba prepocitat teziste kvuli funkci 'sort3Cmp' + 'telesoTezisteSwap'
func.cycle(lop, func.sort3Cmp, 11); // optimalizuj
func.saveBest(lop);
time += PERF.getTime();
}
VBA neumim. Umel bych to prepsat, ale nepotrebuji. Princip jsem popsal. Nahodne lopatky promicham A pak v cyklu nahodne vyberu 2 lopatky a zkusim je vymenit, zda se zlepsi teziste. Neco podobne dela Bugmaster. Jeho VBA kod jsem nezkoumal. Bugmaster jde na to mozna chytreji u te optimalizace, zkousi vymenu v nejakem konkretnim poradi. Rikam, nezkoumal jsem to. Jen jsem cetl popisek na foru, co napsal.
Tak jsem to jeste upravil pro ten IE, i graf to zobrazuje. Problem byl, ze
min/max se pocita v IE a FF odlisnym zapisem. A navic IE ten FF chape jako chybu
syntaxe, musel jsem to ohranicit evalem. A taky jsem prepsal zobrazovani z
innerHTML na appedChild. Takze se graf zobrazuje asi 200ms v IE misto 2s A pak jsem udelal zmeny ohledne
zobrazovani vysledku pro IE, jeste.
A)
Jeste bych mel jeden tip, jak to delat.
- seradis vahu DESC
- vaha MIN
- naplnis lopatky x, y, vahaMIN
- pak projdes vsechny lopatky a kde vaha = vahaMIN, tam vlozis hmotnost[0], vypocitas teziste a ulozis nejlepsi moznost
- vratis puvodni hmostnost, vyberes dalsi lopatku, vlozis tam hmotnost[0], teziste, ulozis nejlepsi
- az projdes vsechny lopatky, ulozis hmotnost na to nejlepsi misto
- vyberes hmotnost[1] a opet, zkusis ulozit na vsechny volne pozice, pocitas teziste...
B)
Mas 0 lopatek. Postupne pridavas dalsi a dalsi. Menis x,y podle poctu lopatek a
snazis se vybrat polohu nove pozice pro novou hmotnost pro nejlepcejsi
teziste.
Cili, vkladas lopatku nekde mezi uz hotove. V podstate je to algoritmus insert
sortu.
1 - ulozis nejlepsi
(2) 1
1 (2) - ulozis nejlepsi
(3) 1 2
1 (3) 2
1 2 (3) - ulozis nejlepsi
Tim, ze jedes od nejtezsi, tak by ti mensi hmotnosti meli dovazovat
zbytek.
Nevyhoda je, ze dostanes tu nejhorsi variantu zhlediska stability Hvezdici. Lopatky se ti rozhodi v
takovemto trojuhelniku:
1-2-3-2-1 - 1-2-3-2-1 - 1-2-3-2-1
Tak, ten prvni algoritmus vypada asi takhle.
http://mlich.zam.slu.cz/…iste-alg.htm
Resil jsem to trochu jinak.
- seradim vahy
- naplnim vsechny lop. min vahou.
- najdu prvni hodnotu min. vahy a dam misto ni nejvyssi vahu
- pak volam v cyklu algoritmus pro posouvani vahy pres vsechny lopatky a prepocet teziste
- a pak to cele opakuji pro vsechny vahy
Dava to dobre vysledky, ale to nahodne zamichani davalo lepsi. Nicmene, cas je 2ms. Mozna by to slo vyuzit misto nahodneho zamichani na zacatku tech predchozich algoritmu.
A myslim si, ze ted druhy algoritmus, B, by mel spocitat tu nulu jako ten excelovy resitel. Ale, jak rikam, predpokladam, ze rozmisteni vahy bude tvorit hvezdici a hvezdine je nestabilni. Staci malo a cele se to rozvibruje a bude problem to ustalit. Na druhu stranu, teziste nebude prilis poskakovat.
Jeste mam jeden algoritmus. Vychazi z toho, co jsem uz popsal.
- seradim DESC
- seradim 0, n, 1, n-1, 2, n-2 ... (na stridacku nejvetsi, nejmensi)
- postupne vytvarim vetsi a vetsi kolo, prepocitavam polohu lopatek, hmotnost necham z predchoziho stavu
- novou lopatku se snazim zamenit s kazdou predchozi, zda nebude lepsi teziste
Vytvari to takovy hvezdicovy system. Vetsi vahy vytvori treba trojuhelnik,
mensi protitrouhelnik pro 6 lopatkach.
Mozna dobre jako prvotni nastrel nebo postup, kde neni nutny pocitac.
Zkousel jsem na to navazat nahodny vyber 2 lopatek a jejich zamena, ale lepsi je
predtim nahodne promichani
10090
10020
10300
10030
10210
10080
10060
10070
10300
10100
10060
10090
10160
10100
10130
10130
10120
10120
({x:-0.0001086, y:0.000201, m:182170, vz:0.00022842600831638631})
2.3118 -- hmotnost protivahy
pr.
1 2 3 11 12 13
13 12 11 3 2 1 - desc
13 1 12 2 11 3 - velke, male, to se z predchoziho serazeni od nejvetsiho vytvari
dobre
A pak vytvarim kolo
13 - 1, dve lopatky, poloha pro dve lopatky
13 - 1 - 12, prepocitam polohu, zkusim 12 vymenit za 1, pak 12 za 13 a zjistim,
ktere teziste je nej
13 - 1 - 12 - 2, prepocitam, vymenuji 2 za vsechny predesle
...
vytvori to prave polohy typu - hvezdici (2 trouhelniky), 2 ctverce, 2
petiuhelniky...
13 - 1 - 12 - 2
13 - 1 - 12 - 2 - 11 - 3
Ok, tak mam asi posledni verzi pro vypocet. Je to vsak navrzeno pro pocet
lopatek delitelny 3. Uprava pro ostatni neni dodelana. Ale nebyla by tezka.
https://mlich.zam.slu.cz/js-teziste.htm
(v kodu je to calc3)
funguje to tak, ze
- seradim podle hmotnosti DESC (od nejvetsiho po nejmensi)
- hmotnosti rozdelim do skupin po 3
- vypocitam teziste skupin
- seradim podle teziste DESC
- a zacnu rovnomerne nanaset na kolo, aby bylo zachovano rozlozeni trech. Po ulozeni je zkusim vzajemne prohodit, ve skupine, zda ziskam lepsi teziste a pokracuji dalsi skupinou.
Myslenka je takova, ze
- jedna lopatka proti stredu ma prilis velky rozdil teziste
- dve lopatky proti sobe, teziste se odectou, ale stale je to velke cislo
- tri lopatky proti sobe si vzajemne vyrovnavaji teziste o neco lepe nez dve, teziste by melo byt mensi
Takze cele kolo pak poskladam ze skupin po 3 lopatkach.
Pokud by nebylo delitelne 3, pak na konci zbydou 2 nebo 4 lopatky. Pro pary
jeste na zacatku vyberu hmotnosti, co nejblize u sebe. (tam mam nekde v kodu
chybu a nechce se mi to hledat a nemam dodelany konec).
Samozrejme nejlepsi vysledek by bylo projit vsechny kombinace. Ale, jak ukazal Bugmaster, jednalo by se o casove narocnejsi ulohu. Tohle mi dalo pri 6ms dobre vysledky (nemam cely strom reseni, ale tipnul bych si 20 nejlepsi reseni pri 10 lopatkach)
10300
10300
10210
10160
10130
10130
10120
10120
10100
10100
10090
10090
10080
10070
10060
10060
10030
10020
---
10090
10060
10100
10130
10020
10300
10090
10070
10120
10160
10030
10210
10100
10080
10120
10130
10060
10300
({x:0.00194, y:0.0026538, m:182170, vz:0.0032872578534966935})
({x:0.0001577, y:-0.0000333, m:182170, vz:0.0001612102522015316}) = A
({x:0.0001577, y:-0.0000333, m:182170, vz:0.00016121025220153698}) = B = A
Hmotnost protivahy = 1.6315 (pro prvni vz 33.2689)
1.6 z 10300 povazuji za slusne.
Top je sice vz: 5.125174812131172e-8
10210
10120
10020
10080
10100
10130
10160
10090
10300
10100
10060
10070
10060
10030
10300
10120
10090
Zobrazeno 44 zpráv z 94.