Transformační funkce - porovnávání obdélníků

kvas

  • ***
  • 132
    • Zobrazit profil
    • E-mail
Transformační funkce - porovnávání obdélníků
« kdy: 19. 02. 2025, 08:54:40 »
Ahojte,

vedeli by ste ma niekto nakopnut spravnym smerom? Hladam transformacnu funkciu, ktora zo sady obdlznikov vyberie najvhodnejsi, t.j. s maximalnym fitness.

Najvhodnejsi je ten, ktory ma najdlhsiu vodorovnu hranu A, ak je takych viac, tak je to ten s najdlhsou zvislou hranou B. Aktualne to riesim algoritmicky (porovnavanim hran) ale verim, ze sa da taka funkcia napisat.

priklad:
nasiel som obdlznik 10x10 - ok, vyhovuje, lebo je prvy
dalsi najdem 12x6 - ten je lepsi, lebo 12>10
dalsi je 11x13 - nie je lepsi, lebo 11<12
dalsi je 12x9 - je lepsi, lebo 12=12 ale 9>6
dalsi je 12x8 - nie je lepsi

vysledok je 12x9.


EDIT:
ked tak nad tym rozmyslam, nestacilo by to takto?

N=cislo take, ze kazdy z obdlznikov ma hranu vzdy mensiu ako N, v ukazke napr. 100.

F(x) = N*dlzka + sirka



« Poslední změna: 19. 02. 2025, 09:00:11 od kvas »


kvas

  • ***
  • 132
    • Zobrazit profil
    • E-mail
Re:Transformační funkce - porovnávání obdélníků
« Odpověď #1 kdy: 19. 02. 2025, 09:04:32 »
kazdopadne, akykolvek odkaz na materialy/prednasky, kde by som sa naucil taketo transformacne funkcie tvorit su vitane. toto je zjednoduseny priklad, pravdepodobne budem potrebovat aj zlozitejsie.

Re:Transformační funkce - porovnávání obdélníků
« Odpověď #2 kdy: 19. 02. 2025, 09:10:37 »
Takto?
# Konštanta N - musí byť väčšia ako maximálna hodnota hrany obdlžníka
N = 100

# Zoznam obdlžníkov reprezentovaných ako tuple (A, B),
# kde A je dĺžka vodorovnej hrany a B dĺžka zvislej hrany.
rectangles = [
    (10, 10),  # 10x10
    (12, 6),   # 12x6
    (11, 13),  # 11x13
    (12, 9),   # 12x9
    (12, 8)    # 12x8
]

def fitness(rect):
    """
    Vypočíta fitness obdlžníka.
   
    Parametre:
        rect (tuple): Tuple (A, B), kde A je dĺžka vodorovnej hrany a B je dĺžka zvislej hrany.
   
    Návratová hodnota:
        int: Fitness hodnota podľa vzorca F = N * A + B.
    """
    A, B = rect
    return N * A + B

# Výber obdlžníka s maximálnou fitness hodnotou
best_rectangle = max(rectangles, key=fitness)

print("Najvhodnejší obdlžník je:", best_rectangle)

kvas

  • ***
  • 132
    • Zobrazit profil
    • E-mail
Re:Transformační funkce - porovnávání obdélníků
« Odpověď #3 kdy: 19. 02. 2025, 09:23:02 »
dik, ale ja nehladam algoritmus, ten si viem napisat. ja hladam matematicky zapis funkcie tohoto problemu.

inymi slovami, hladam funkciu, do ktorej nasypem rozmery obdlznika a vysledok funkcie bude jedno cislo. obdlizk, ktoreho funckia vrati najvacsie cislo je ten, ktory hladam.

a este by ma zaujimalo, aka je najmensia mozna/pripustna hodnota vahy N, aby funkcia (N x dlzka + sirka) vracala vzdy spravny/pozadovany vysledok, zrejme to bude zavysiet na rozmeroch tych obdlznikov, to by vedel nejaky matematik odvodit...
« Poslední změna: 19. 02. 2025, 09:26:42 od kvas »

hknmtt

  • ****
  • 250
    • Zobrazit profil
    • E-mail
Re:Transformační funkce - porovnávání obdélníků
« Odpověď #4 kdy: 19. 02. 2025, 09:39:17 »
Tu sa riesi skor programovanie nez matematika. Programatorovi toto nebude nikdy robit ziaden problem napisat. Ak chces matematicku funckiu, musis sa pytat na uplne inych miestach.


Logik

  • *****
  • 1 044
    • Zobrazit profil
    • E-mail
Re:Transformační funkce - porovnávání obdélníků
« Odpověď #5 kdy: 19. 02. 2025, 10:44:33 »
No tak jaký musí být to N je jasné: N > max (šířka). Ale já bých k tomu přihodil programátorské hledisko: máme konečnou aritmetiku, takže obecně pokud to chceš přesně (ve floatech by se to zaokrouhlovalo), tak musíš za sebou zřetězit bity délky a šířky, kde musíš vědět, kolik potřebuješ bitů na délku a na šířku. Což je pak vlastně totéž jako vynásobení délky konstantou 2^(počet bitů na uložení šířky).

kvas

  • ***
  • 132
    • Zobrazit profil
    • E-mail
Re:Transformační funkce - porovnávání obdélníků
« Odpověď #6 kdy: 19. 02. 2025, 10:47:42 »
Tu sa riesi skor programovanie nez matematika. Programatorovi toto nebude nikdy robit ziaden problem napisat. Ak chces matematicku funckiu, musis sa pytat na uplne inych miestach.

poradis prosim tie ine miesta? rad sa nieco priucim, ale matematicke fora nesledujem, lebo ich nepoznam.

hknmtt

  • ****
  • 250
    • Zobrazit profil
    • E-mail
Re:Transformační funkce - porovnávání obdélníků
« Odpověď #7 kdy: 19. 02. 2025, 11:44:28 »
Tu sa riesi skor programovanie nez matematika. Programatorovi toto nebude nikdy robit ziaden problem napisat. Ak chces matematicku funckiu, musis sa pytat na uplne inych miestach.

poradis prosim tie ine miesta? rad sa nieco priucim, ale matematicke fora nesledujem, lebo ich nepoznam.

Taktiez nesledujem(nemam dovod, i ked som bol na FMFI UK :D). Ale predpokladam ze dnes asi na facebooku bude nieco, pripadne https://math.stackexchange.com/

Wasper

  • ***
  • 158
    • Zobrazit profil
    • E-mail
Re:Transformační funkce - porovnávání obdélníků
« Odpověď #8 kdy: 19. 02. 2025, 12:34:26 »
Najvhodnejsi je ten, ktory ma najdlhsiu vodorovnu hranu A, ak je takych viac, tak je to ten s najdlhsou zvislou hranou B. Aktualne to riesim algoritmicky (porovnavanim hran) ale verim, ze sa da taka funkcia napisat.
Pokud by to bylo omezene a integer, tak jak tu pisi predrecnici.

Pokud konecne, neomezene a realne, tak nic mensiho nez na R* by to se obavam neslo - a ten fitness by byl A + epsilon * B kde epsilon je nejake infinitesimalni cislo. https://en.wikipedia.org/wiki/Hyperreal_number ale to je hezka hricka, pro implementaci v pocitaci naprosto nevhodna (tam to stejne skonci dvojici integeru/realu, coz jsou v podstate ty hyperrealna cisla taky ;-) )

Taky si dovolim poznamenat, ze funkce je "neco do ceho hodis jedno nebo vice cisel a vypadne z toho dalsi cislo, hlavne to takhle nerikejte v Karline", a v programu se nejak pouzije, takze mozna by stacilo uvazovat ne o fitness, ale o funkcni, co proste dva fitness porovna (a treba se to da predhodit do qsort(), nebo hledat nejvetsi porovnanim s poslednim nejvetsim)

pak by to mohl vypadat neco jako  cmp(a1,a2,b1,b2) jako  a1 == a2 ? sgn(b2 - b1) : sgn(a2 - a1)

Citace
a este by ma zaujimalo, aka je najmensia mozna/pripustna hodnota vahy N, aby funkcia (N x dlzka + sirka) vracala vzdy spravny/pozadovany vysledok, zrejme to bude zavysiet na rozmeroch tych obdlznikov, to by vedel nejaky matematik odvodit...
Matematik? To je snad naprosto trivialni, N > max(sirka) za predpokladu delka je prirozene cislo (proste delka*N musi prebit vzdycky sirku, kdyz tam povolis racionalni/realna cisla, tak ti N vyleze do nekonecna protoze potrebujes, aby N*min(delka) > max(sirka)  .
« Poslední změna: 19. 02. 2025, 12:40:03 od Wasper »

Wasper

  • ***
  • 158
    • Zobrazit profil
    • E-mail
Re:Transformační funkce - porovnávání obdélníků
« Odpověď #9 kdy: 19. 02. 2025, 12:42:47 »
pardon,
N*min(rozdil delek pokud je > 0) > max(sirka)  .

Re:Transformační funkce - porovnávání obdélníků
« Odpověď #10 kdy: 19. 02. 2025, 14:16:19 »
Pokud délka i šířka jsou větší než 1 a výsledek může být float, tak by se možná dalo udělat taky něco ve stylu "šířka + 1 - 1 / výška"

Wasper

  • ***
  • 158
    • Zobrazit profil
    • E-mail
Re:Transformační funkce - porovnávání obdélníků
« Odpověď #11 kdy: 19. 02. 2025, 14:26:02 »
Pokud délka i šířka jsou větší než 1 a výsledek může být float, tak by se možná dalo udělat taky něco ve stylu "šířka + 1 - 1 / výška"
A nebo pokud jedno z toho je vic nez (neco vic nez nula), tak to druhe protahnout treba pres arctan - to je dost obvykla technika, jak z realne osy udelat usecku.