Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Määrän optimointi VBA:lla

Sivun loppuun

Capo [30.09.2008 17:49:00]

#

Kuinka ihmeessä seuraavaa ongelmaa olisi syytä lähteä ratkomaan?

Ongelma:

On tarve katkoa eri mittaisia ja eri määrän omaavia kappaleita vakio mittaisesta aihiosta siten että halutaan optimoida katkaistavien aihioiden lukumäärä mahdollisimman pieneksi.

Lähtötietoina annetaan (pyydetään):
- terän paksuus (jonka katkaisu "hävittää" aihiosta/katkaisukohta. Eli leikattavan mitan aihiosta ottama määrä on terän paksuus+leikattava mitta)
- katkaistavat pituudet ja lukumäärät/pituus (mitta > 10 mm, täysiä millejä)
- aihion pituus (max 6000 mm)

Tuloksena pitäisi saada:
- katkaisu lista/ aihio (eli montako kappaletta mitäkin mittaa katkaistaan aihiosta, jotta saadaan kaikki tarpeelliset palikat katkottua)
- aihioiden lukumäärä

Kaikki nämä tietysti vielä tallennetaan excel taulukkoon jotta voidaan tulostaa katkaisu listat aihioittain.

Asiaa pohtineena täytyy tunnustaa että ihan heti ei kyllä aukene tarvittavat laskutoimenpiteet..

Oliskohan joku jo mahdollisesti ratkaissut asian??

kayttaja-2499 [30.09.2008 21:52:49]

#

Muodosta ensin rajoiteyhtälöt ja minimointifunktio. Jos saat lineaarisen minimointitehtävän, ratkaise vaikka simplexillä(http://en.wikipedia.org/wiki/Simplex_algorithm).

Epälineaarisen minimointitehtävän ratkaisemiseen joudut käyttämään jotain muuta. Jos on laiska, eikä parasta ratkaisua tarvitse ja haluaa käyttää raakaa voimaa, voi käyttää vaikka differentiaalievoluutioalgoritmia(http://en.wikipedia.org/wiki/Differential_evolution) tehtävän rakaisemiseen.

Antti Laaksonen [30.09.2008 22:39:09]

#

Tehtävä vaikuttaa sellaiselta, että siihen ei ole oleellisesti parempaa ratkaisua kuin kokeilla kaikki vaihtoehdot läpi ja valita paras. Hakua voi kuitenkin nopeuttaa erilaisten optimointien avulla.

Ohjelma voisi toimia niin, että ensin yritetään leikata palikoita yhdestä aihiosta, sitten kahdesta, sitten kolmesta jne., kunnes lopulta kaikki palikat saadaan leikattua, kun aihioiden määrä on valittu riittävän suureksi.

Tietyllä aihioiden määrällä sopivan leikkaustavan etsiminen voisi näyttää tältä pseudokoodina:

funktio haku(p):
    jos kaikki palikat on leikattu:
        tulosta ratkaisu
    muuten:
        käy läpi kaikki aihiot:
            jos aihiosta pystyy leikkaamaan palikan p:
                leikkaa palikka aihiosta
                haku(p + 1)
                palauta palikka aihioon

Koodissa p tarkoittaa leikattavan palikan numeroa. Koodissa ei ole mitään optimointeja: esim. jos palikoiden yhteispituus on suurempi kuin aihioiden yhteispituus, haku kannattaa tietysti lopettaa heti.

ajv [01.10.2008 09:33:31]

#

Samasta aiheesta on keskusteltu aikaisemminkin täällä:
https://www.ohjelmointiputka.net/keskustelu/16248-taloudellinen-sahausohjelma

Capo [01.10.2008 14:03:18]

#

Tack, tack.

Koodaus ei olekaan se ongelma, vaan matemaattisten funktioden löytyminen.
Eri vaihtoehtoja saa helposti aikaan pari miljardia, joten ratkaisuun tarvitaan tietysti vaihtoehtojen rajaamista aika rajusti, muuten ohjelma pyörii helposti vuosi tolkulla hakien eri vaihtoehtoja.

Tämä vanha keskustelu toi eniten ajatuksia asiaan.

Chiman [01.10.2008 15:35:07]

#

Tämä ongelma kävisi Putkapostista :) Itse asiassa ratkaisin tuoreimman Putkapostin hyvin samalla tavalla.

Syvyyshaku on paras äkkiä mieleentuleva algoritmi, mutta se tukehtuisi tietysti oikein isoihin määriin. Se laskisi eri yhdistelmien vaihtoehdot jäljellä olevista paloista aina yhtä aihiota kohti kerrallaan. Pisin sijoittamatta oleva palanen tulisi aina nykyisen aihion alkuun, koska se rajoittaa laskennan määrää.

Turhat haarat jätettäisiin laskematta. Haku katkaisisi yli aihionpituuden menevät laskennat. Samoin jos se törmää juoksevana summana täsmälleen aihionpituuteen, koska se on optimiratkaisu. Haku etenisi aina pisimmistä palasista lyhimpiin, eli samojen palayhdistelmien eri järjestyksiä ei käytäisi läpi.

Haku laskisi siis aina aihion kerrallaan käyttäen sen mahdollisimman tarkasti hyväksi. Laskettua palayhdistelmää käytetään seuraavaankin aihioon, jos paloja on katkaisematta tarvittava määrä. Muuten tehdään uusi syvyyshaku jäljellä olevista paloista.

Tämä menetelmä jättäisi pisimmän mahdollisen (= helpoimmin hyödynnettävän) hukkapätkän viimeiseen aihioon.

Grez [01.10.2008 19:02:25]

#

Chiman kirjoitti:

Haku laskisi siis aina aihion kerrallaan käyttäen sen mahdollisimman tarkasti hyväksi. Laskettua palayhdistelmää käytetään seuraavaankin aihioon, jos paloja on katkaisematta tarvittava määrä. Muuten tehdään uusi syvyyshaku jäljellä olevista paloista.

Optimaalista tapaa ei vaan valitettava saa pelkästään yhtä aihiota kerrallaan tarkkailematta, koska siihen ensimmäiseen saattaa mennä ne pari sopivan pituista palaa jolla seuraavat pätkät saisi tehtyä kahdesta palasta kolmen asemesta.

Minkälaisista palamääristä tässä puhutaan? Jos määrä on luokkaa alle sata, niin sitten tietokone kyllä jauhaa ne optimaaliseen järjestykseen lyhyehkössä ajassa. Jos taas paloja tulee satoja tuhansia, niin sitten päästään kyllä aika hyvään lopputulokseen vähemmän optimaalisellakin algoritmilla.

Yksi todella yksinkertainen algoritmi olisi ottaa aina pisin jäljellä olevaan pätkään mahtuva pala ja sahata se ja jatkaa tätä niin kauan kunnes mitään ei enää mahdu. Riippuen paloista tämä voi toimia erittäin hyvin, erittäin huonosti tai mitä tahansa siltä väliltä.

Chiman [01.10.2008 19:33:29]

#

Grez kirjoitti:

Optimaalista tapaa ei vaan valitettava saa pelkästään yhtä aihiota kerrallaan tarkkailematta, koska siihen ensimmäiseen saattaa mennä ne pari sopivan pituista palaa jolla seuraavat pätkät saisi tehtyä kahdesta palasta kolmen asemesta.

Totta, hyvä pointti. Esimerkki: aihion pituus = 10, terän paksuus = 1:

xxxxxxxxxx aihio
4444 22 22
333 333
333 333
333
vs.
4444 333
333 333 22
333 333 22

groovyb [06.10.2008 12:21:32]

#

jos teidän leikattavat kappaleet ovat vakiokokoisia, niin itse vaan valitsisin mitkä halutaan yhdestä aihiosta saada ja tilaisin aihion kappaleiden mukaan, enkä tekisi niin että yrittäisin laskea kuinka monta erikokoista kappaletta yhdestä vakiokokoisesta aihiosta saisi.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta