» »

[C++] Knapsack - pravokotniki

[C++] Knapsack - pravokotniki

Vesoljc ::

za narest imam algo, ki bo mnozico (VSE) pravokotnikov cim bolj tesno popakiral v cimmanj "velikih" pravokotnikov (holder). vsi pravokotniki (item) imajo velikost stranice 2n, kar zna poenostaviti vso zadevo. algoritm naj bi imel nastavitev, koliko "truda" (packing VS time) naj vlozi. recimo za nek preview nas ne zanima optimalnost ampak samo hiter rezultat, cez vikend pa nej racuna kolikor hoce. se en stvar, ki bi jo bilo potrebno upostevati je "prijateljstvo" pravokotnikov. namrec, nekateri si zelijo biti cim bolj skupaj (v enem holderju recimo).

greedy algo je recimo hiter (bojda :p), kak genetski algo pa pocasen. rabim pa kompromis.

ideje ter implementacije na plano :p
Abnormal behavior of abnormal brain makes me normal...

hash ::

Knapsack problem je NP-complete se pravi, da bos za najbolj optimalno resitev moral generirati vse kombinacije (v kombinaciji z dinamicnim programiranjem(DP) je to precej hitra resitev), ce pa ne isces optimalne resitve pa je res najboljse da naredis en greedy algoritem.
Of all the things I have lost I miss my mind the most.

Zgodovina sprememb…

  • spremenil: hash ()

CCfly ::

Iščeš s požrešnim algoritmom, potem pa izvajaš lokalno optimizacijo (nekaj pravokotnikov rukneš iz nahrbtnika in ga ponovno poskušaš zapolniti; če je rešitev boljša staro zavržeš in nadaljuješ).
Seveda rešitev skoraj gotovo ni optimalna.

PS: Algoritmi in podatkovne strukture ?
"My goodness, we forgot generics!" -- Danny Kalev

snow ::

beri podpis:
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Vesoljc ::

@cc
aps? ne...

@snow
:p

@hash
optimalnost bi skorajda bila nujna, v mejah neke normale seveda (90% recimo).

prva stvar, ki se mi zdi, da je potrebna, je sestavljanka. namrec, kako vzdrzevat zapolnjenost enega holderja.
struct rect {
   int x1,y1,x2,y2;
};

class holder {
  int sizex,sizey;
  // 
  array<rect>  aUsed;
  array<rect>  aFree;
  //
  holder()
  {
     aFree.add(0,0,sizex,sizey);
  }
};


vsakic, ko dodamo en rect v holder, le ta preparsa seznam prostih pravokotnikov ter ga v enega izmed njih doda. operacija "vrivanja" razreze en pravokotnik (v aFree) na vec manjsih (0..8?).
Abnormal behavior of abnormal brain makes me normal...

CCfly ::

se en stvar, ki bi jo bilo potrebno upostevati je "prijateljstvo" pravokotnikov. namrec, nekateri si zelijo biti cim bolj skupaj (v enem holderju recimo).

Tole je IMHO najbolj zanimiv del problema. Knapsack problem je bil drugače prežvečen že tisočkrat.

kvaliteta rešitve = (holderCapacity - remainsEmpty) + quality(relationships)

Ti pa se odloči kakšno oceno ti bo vrnila funkcija quality.
"My goodness, we forgot generics!" -- Danny Kalev

Thomas ::

Hja ... v tem primeru je finta.

Maš 2^n stranice in nek dovolj "praktični" primer. Kar zagotavlja, da premnogo različnih inputov ni. Zato lahko za vse - magari bruta forca - izračunaš optimume vnaprej.

Kaj češ sparat RAM, da prazen gnije?
Man muss immer generalisieren - Carl Jacobi

Vesoljc ::

hmm...

ja razlicnih vhodov je na oko 10k. ce uporabim en byte za koordianto (2n), to znese 40KB za vhod. holderjev je recimo 100 (koren vhoda).
Abnormal behavior of abnormal brain makes me normal...

Gundolf ::

Če rabiš nastavljat natančnost vs. hitrost in ti je všeč greedy algoritem, potem ga enostavno spremeni v beam search. Ko je širina beama imaš greedy, ko je zadosti velika pa kar iskanje v širino.

Sicer ne vem če sem ti zdej kej novga povedu ... :)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Prikaz optimalne poti (strani: 1 2 )

Oddelek: Loža
527146 (5555) mauriciofabi
»

[izziv] volilna območja

Oddelek: Programiranje
142339 (1408) technolog
»

[algoritem] računanje vsote

Oddelek: Programiranje
182433 (2015) vres.ales
»

Vmesnik v Javi

Oddelek: Programiranje
142213 (1996) Camel
»

Object packing - kakšne ideje?

Oddelek: Programiranje
161363 (1142) Thomas

Več podobnih tem