Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Seřazení hodnot pro vývahu oběžného kola

Aktivity
Avatar
mifro
Člen
Avatar
Odpovídá na Bugmaster
mifro:23.9.2019 14:31

Tak jsem trochu zabojoval a zde je výsledek. Nevypadá to úplně špatně, že?

 
Odpovědět
23.9.2019 14:31
Avatar
Bugmaster
Člen
Avatar
Odpovídá na mifro
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?

 
Nahoru Odpovědět
23.9.2019 14:42
Avatar
mifro
Člen
Avatar
Odpovídá na Bugmaster
mifro:23.9.2019 14:55

:-D 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ě ;-)

 
Nahoru Odpovědět
23.9.2019 14:55
Avatar
mifro
Člen
Avatar
Odpovídá na mifro
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

 
Nahoru Odpovědět
23.9.2019 15:34
Avatar
Bugmaster
Člen
Avatar
Odpovídá na mifro
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.

 
Nahoru Odpovědět
23.9.2019 16:15
Avatar
mifro
Člen
Avatar
Odpovídá na Bugmaster
mifro:24.9.2019 6:57

Používám v podstatě "jen" tento příkaz (seřazené lopatky do listboxu) :

Dim zoptimalizovano = Seradit(hodno­tyZListBoxu)
For ss = 0 To ListBox1.Item­s.Count - 1
ListBox2.Item­s.Add(zoptima­lizovano(ss))
Next
Výsledky stejné, tak to je OK.

 
Nahoru Odpovědět
24.9.2019 6:57
Avatar
Bugmaster
Člen
Avatar
Odpovídá na mifro
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?

 
Nahoru Odpovědět
24.9.2019 7:22
Avatar
mifro
Člen
Avatar
Odpovídá na Bugmaster
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

 
Nahoru Odpovědět
24.9.2019 7:47
Avatar
Bugmaster
Člen
Avatar
Odpovídá na mifro
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.

 
Nahoru Odpovědět
24.9.2019 9:21
Avatar
mifro
Člen
Avatar
Odpovídá na Bugmaster
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ů.

 
Nahoru Odpovědět
24.9.2019 10:27
Avatar
Ghst
Člen
Avatar
Ghst:24.9.2019 10:57

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
...

 
Nahoru Odpovědět
24.9.2019 10:57
Avatar
mifro
Člen
Avatar
Odpovídá na Ghst
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

 
Nahoru Odpovědět
24.9.2019 11:10
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24.9.2019 11:31

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

 
Nahoru Odpovědět
24.9.2019 11:31
Avatar
Ghst
Člen
Avatar
Ghst:24.9.2019 13:01

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čí?

 
Nahoru Odpovědět
24.9.2019 13:01
Avatar
mifro
Člen
Avatar
Odpovídá na Ghst
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.

 
Nahoru Odpovědět
24.9.2019 13:11
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24.9.2019 15:12

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
 
Nahoru Odpovědět
24.9.2019 15:12
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Peter Mlich
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 :)

 
Nahoru Odpovědět
24.9.2019 15:15
Avatar
Bugmaster
Člen
Avatar
Odpovídá na mifro
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? :)

 
Nahoru Odpovědět
24.9.2019 15:22
Avatar
Bugmaster
Člen
Avatar
Odpovídá na Ghst
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 :(

 
Nahoru Odpovědět
24.9.2019 15:22
Avatar
Bugmaster
Člen
Avatar
Odpovídá na Peter Mlich
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.

 
Nahoru Odpovědět
24.9.2019 15:23
Avatar
mifro
Člen
Avatar
Odpovídá na Bugmaster
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.

 
Nahoru Odpovědět
24.9.2019 15:33
Avatar
Bugmaster
Člen
Avatar
Odpovídá na Peter Mlich
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á?

 
Nahoru Odpovědět
24.9.2019 21:02
Avatar
Jakub Švasta
Lektor
Avatar
Odpovídá na Bugmaster
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.

 
Nahoru Odpovědět
24.9.2019 23:30
Avatar
Bugmaster
Člen
Avatar
Odpovídá na Jakub Švasta
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é).

 
Nahoru Odpovědět
25.9.2019 6:38
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Bugmaster
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 :)

 
Nahoru Odpovědět
25.9.2019 7:59
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Peter Mlich
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.

 
Nahoru Odpovědět
25.9.2019 8:02
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:25.9.2019 9:36

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;
        }
Editováno 25.9.2019 9:37
 
Nahoru Odpovědět
25.9.2019 9:36
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26.9.2019 8:47

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.

Editováno 26.9.2019 8:48
 
Nahoru Odpovědět
26.9.2019 8:47
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Peter Mlich
Peter Mlich:26.9.2019 8:53

graf to nejspis nezobrazuje dobre, teziste, nereste :)

 
Nahoru Odpovědět
26.9.2019 8:53
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26.9.2019 13:15

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.

 
Nahoru Odpovědět
26.9.2019 13:15
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:27.9.2019 7:55

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;
Editováno 27.9.2019 7:57
 
Nahoru Odpovědět
27.9.2019 7:55
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:27.9.2019 8:20

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.

 
Nahoru Odpovědět
27.9.2019 8:20
Avatar
mifro
Člen
Avatar
Odpovídá na Peter Mlich
mifro:28.9.2019 10:10

Jak to na tom odkazu spustím? Zkoušel jsem různé prohlížeče, ale nic...

 
Nahoru Odpovědět
28.9.2019 10:10
Avatar
mifro
Člen
Avatar
Odpovídá na Peter Mlich
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ě.

 
Nahoru Odpovědět
28.9.2019 11:04
Avatar
mifro
Člen
Avatar
Odpovídá na Bugmaster
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

 
Nahoru Odpovědět
28.9.2019 16:32
Avatar
mifro
Člen
Avatar
mifro:28.9.2019 17:24

Ještě jedna věc - šel by do grafu vložit bod, který by znázornil umístění vývažku? Tzn. tam např. vykreslit červený bod na vypočteném úhlu. Příklad v příloze.

 
Nahoru Odpovědět
28.9.2019 17:24
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.9.2019 8:26

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.

Editováno 30.9.2019 8:27
 
Nahoru Odpovědět
30.9.2019 8:26
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.9.2019 8:51

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.

 
Nahoru Odpovědět
30.9.2019 8:51
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.9.2019 13:29

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

 
Nahoru Odpovědět
30.9.2019 13:29
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.10.2019 10:42

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.

 
Nahoru Odpovědět
1.10.2019 10:42
Avatar
mifro
Člen
Avatar
mifro:2.10.2019 11:49

Díky moc všem za postřehy a rady. Vše si ještě podrobně projdu. Každopádně jste mi moc pomohli. Určitě vyplodím ještě nějaký dotaz :-D

 
Nahoru Odpovědět
2.10.2019 11:49
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4.11.2019 10:24

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.00022842600­831638631})
2.3118 -- hmotnost protivahy

https://mlich.zam.slu.cz/js-teziste.htm

 
Nahoru Odpovědět
4.11.2019 10:24
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4.11.2019 10:38

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

 
Nahoru Odpovědět
4.11.2019 10:38
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:2.12.2019 15:14

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
 
Nahoru Odpovědět
2.12.2019 15:14
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 44 zpráv z 94.